improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / CompilationUnitProblemFinder.java
index 6cfb4c4..5ebd54c 100644 (file)
 package net.sourceforge.phpdt.internal.core;
 
 import java.util.Locale;
+import java.util.Map;
 
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
+import net.sourceforge.phpdt.core.IJavaModelStatusConstants;
 import net.sourceforge.phpdt.core.IJavaProject;
 import net.sourceforge.phpdt.core.IPackageFragment;
 import net.sourceforge.phpdt.core.IProblemRequestor;
+import net.sourceforge.phpdt.core.JavaCore;
 import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.WorkingCopyOwner;
 import net.sourceforge.phpdt.core.compiler.CharOperation;
 import net.sourceforge.phpdt.core.compiler.IProblem;
 import net.sourceforge.phpdt.internal.compiler.CompilationResult;
@@ -30,11 +34,13 @@ import net.sourceforge.phpdt.internal.compiler.env.INameEnvironment;
 import net.sourceforge.phpdt.internal.compiler.env.ISourceType;
 import net.sourceforge.phpdt.internal.compiler.lookup.PackageBinding;
 import net.sourceforge.phpdt.internal.compiler.parser.SourceTypeConverter;
+import net.sourceforge.phpdt.internal.compiler.parser.UnitParser;
 import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation;
 import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory;
-import net.sourceforge.phpeclipse.PHPCore;
+import net.sourceforge.phpdt.internal.core.util.Util;
 import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
 
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IProgressMonitor;
 
 /**
@@ -81,11 +87,11 @@ public class CompilationUnitProblemFinder extends Compiler {
        protected CompilationUnitProblemFinder(
                INameEnvironment environment,
                IErrorHandlingPolicy policy,
-//             Map settings,
+               Map settings,
                ICompilerRequestor requestor,
                IProblemFactory problemFactory) {
 
-               super(environment, policy, requestor, problemFactory, true);//settings, requestor, problemFactory, true);
+               super(environment, policy, settings, requestor, problemFactory, true);
        }
 
        /**
@@ -126,7 +132,7 @@ public class CompilationUnitProblemFinder extends Compiler {
                throws JavaModelException {
                return (SearchableEnvironment) ((JavaProject) sourceUnit.getJavaProject())
                        .getSearchableNameEnvironment();
-       }
+       } 
 
        /*
         * Answer the component to which will be handed back compilation results from the compiler
@@ -185,6 +191,81 @@ public class CompilationUnitProblemFinder extends Compiler {
        }
 
        public static CompilationUnitDeclaration process(
+                       CompilationUnitDeclaration unit,
+                       ICompilationUnit unitElement, 
+                       char[] contents,
+                       UnitParser parser,
+                       WorkingCopyOwner workingCopyOwner,
+                       IProblemRequestor problemRequestor,
+                       IProblemFactory problemFactory,
+                       boolean cleanupCU,
+                       IProgressMonitor monitor)
+                       throws JavaModelException {
+
+                       char[] fileName = unitElement.getElementName().toCharArray();
+                       
+                       JavaProject project = (JavaProject) unitElement.getJavaProject();
+                       CompilationUnitProblemFinder problemFinder =
+                               new CompilationUnitProblemFinder(
+                                       project.newSearchableNameEnvironment(workingCopyOwner),
+                                       getHandlingPolicy(),
+                                       project.getOptions(true),
+                                       getRequestor(),
+                                       problemFactory);
+                       if (parser != null) {
+                               problemFinder.parser = parser;
+                       }
+
+                       try {
+                               
+                               IPackageFragment packageFragment = (IPackageFragment)unitElement.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
+                               char[][] expectedPackageName = null;
+                               if (packageFragment != null){
+                                       expectedPackageName = CharOperation.splitOn('.', packageFragment.getElementName().toCharArray());
+                               }
+                               if (unit == null) {
+                                       unit = problemFinder.resolve(
+                                               new BasicCompilationUnit(
+                                                       contents,
+                                                       expectedPackageName,
+                                                       new String(fileName),
+                                                       unitElement),
+                                               true, // verify methods
+                                               true); //, // analyze code
+                                               //true); // generate code
+                               } else {
+                                       problemFinder.resolve(
+                                               unit,
+                                               null, // no need for source
+                                               true, // verify methods
+                                               true); //, // analyze code
+                                       //      true); // generate code
+                               }
+                               reportProblems(unit, problemRequestor, monitor);
+                               return unit;
+                       } catch(RuntimeException e) { 
+                               // avoid breaking other tools due to internal compiler failure (40334)
+                               Util.log(e, "Exception occurred during problem detection: "); //$NON-NLS-1$ 
+                               throw new JavaModelException(e, IJavaModelStatusConstants.COMPILER_FAILURE);
+                       } finally {
+                               if (cleanupCU && unit != null) {
+                                       unit.cleanUp();
+                               }
+                               problemFinder.lookupEnvironment.reset();                        
+                       }
+               }
+       public static CompilationUnitDeclaration process(
+                       ICompilationUnit unitElement, 
+                       char[] contents,
+                       WorkingCopyOwner workingCopyOwner,
+                       IProblemRequestor problemRequestor,
+                       boolean cleanupCU,
+                       IProgressMonitor monitor)
+                       throws JavaModelException {
+                               
+                       return process(null/*no CompilationUnitDeclaration*/, unitElement, contents, null/*use default Parser*/, workingCopyOwner, problemRequestor, new DefaultProblemFactory(), cleanupCU, monitor);
+               }
+       public static CompilationUnitDeclaration process(
                ICompilationUnit unitElement, 
                IProblemRequestor problemRequestor,
                IProgressMonitor monitor)
@@ -197,15 +278,13 @@ public class CompilationUnitProblemFinder extends Compiler {
                        new CompilationUnitProblemFinder(
                                getNameEnvironment(unitElement),
                                getHandlingPolicy(),
-                       getRequestor(),
-                                                       getProblemFactory(fileName, problemRequestor, monitor));
-//                             project.getOptions(true),
-//                             getRequestor(),
-//                             getProblemFactory(fileName, problemRequestor, monitor));
+                               project.getOptions(true),
+                               getRequestor(),
+                               getProblemFactory(fileName, problemRequestor, monitor));
 
                CompilationUnitDeclaration unit = null;
                try {
-                       String encoding = project.getOption(PHPCore.CORE_ENCODING, true);
+                       String encoding = project.getOption(JavaCore.CORE_ENCODING, true);
                        
                        IPackageFragment packageFragment = (IPackageFragment)unitElement.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
                        char[][] expectedPackageName = null;
@@ -229,5 +308,16 @@ public class CompilationUnitProblemFinder extends Compiler {
                        problemFinder.lookupEnvironment.reset();                        
                }
        }
+       private static void reportProblems(CompilationUnitDeclaration unit, IProblemRequestor problemRequestor, IProgressMonitor monitor) {
+               CompilationResult unitResult = unit.compilationResult;
+               IProblem[] problems = unitResult.getAllProblems();
+               for (int i = 0, problemLength = problems == null ? 0 : problems.length; i < problemLength; i++) {
+                       if (JavaModelManager.VERBOSE){
+                               System.out.println("PROBLEM FOUND while reconciling : "+problems[i].getMessage());//$NON-NLS-1$
+                       }
+                       if (monitor != null && monitor.isCanceled()) break;
+                       problemRequestor.acceptProblem(problems[i]);                            
+               }
+       }
 }