diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java index 748c5c21985..c941b0dc5b0 100755 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java @@ -58,6 +58,7 @@ import org.eclipse.jdt.core.IImportDeclaration; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaElementDelta; +import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IParent; import org.eclipse.jdt.core.ISourceRange; @@ -107,7 +108,8 @@ protected final class FoldingStructureComputationContext { private IType fFirstType; private boolean fHasHeaderComment; private LinkedHashMap fMap= new LinkedHashMap<>(); - private IScanner fScanner; + private IScanner fDefaultScanner; // this one may or not be the shared DefaultJavaFoldingStructureProvider.fSharedScanner + private IScanner fScannerForProject; private FoldingStructureComputationContext(IDocument document, ProjectionAnnotationModel model, boolean allowCollapsing, IScanner scanner) { Assert.isNotNull(document); @@ -115,7 +117,7 @@ private FoldingStructureComputationContext(IDocument document, ProjectionAnnotat fDocument= document; fModel= model; fAllowCollapsing= allowCollapsing; - fScanner= scanner; + fDefaultScanner= scanner; } private void setFirstType(IType type) { @@ -167,9 +169,28 @@ private ProjectionAnnotationModel getModel() { } private IScanner getScanner() { - if (fScanner == null) - fScanner= ToolFactory.createScanner(true, false, false, false); - return fScanner; + if (fScannerForProject != null) { + return fScannerForProject; + } + IJavaProject javaProject= fInput != null ? fInput.getJavaProject(): null; + if (javaProject != null) { + String projectSource= javaProject.getOption(JavaCore.COMPILER_SOURCE, true); + String projectCompliance= javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true); + if (!JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE).equals(projectCompliance) + || !JavaCore.getOption(JavaCore.COMPILER_SOURCE).equals(projectSource)) { + return fScannerForProject= ToolFactory.createScanner(true, false, false, projectSource, projectCompliance); + } + } + if (fDefaultScanner == null) + fDefaultScanner= ToolFactory.createScanner(true, false, false, false); + return fDefaultScanner; + } + + private void setSource(char[] source) { + if (fDefaultScanner != null) + fDefaultScanner.setSource(source); + if (fScannerForProject != null) + fScannerForProject.setSource(source); } /** @@ -969,7 +990,7 @@ private void update(FoldingStructureComputationContext ctx) { Annotation[] changedArray= updates.toArray(new Annotation[updates.size()]); ctx.getModel().modifyAnnotations(deletedArray, additions, changedArray); - ctx.fScanner.setSource(null); + ctx.setSource(null); } private void computeFoldingStructure(FoldingStructureComputationContext ctx) {