From be137ca3117ab47caecdd04cb9ea462a59aa5920 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sun, 15 Apr 2012 16:38:45 -0700 Subject: [PATCH 1/6] Method name adjustments. --- .../formatter/CodeFormatterVisitor.java | 98 +++++++++---------- .../cdt/internal/formatter/Scribe.java | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java index b1665f27f75..821dc500396 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java @@ -635,13 +635,13 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, @Override public int visit(IASTDeclaration node) { - if (!startNode(node)) { + if (!enterNode(node)) { return PROCESS_SKIP; } try { return formatDeclaration(node); } finally { - finishNode(node); + exitNode(node); } } @@ -695,7 +695,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTName node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof ICPPASTQualifiedName) { visit((ICPPASTQualifiedName) node); @@ -705,7 +705,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, formatRaw(node); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -726,7 +726,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } } - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof IASTEqualsInitializer) { visit((IASTEqualsInitializer) node); @@ -738,7 +738,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, formatRaw(node); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -748,7 +748,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTParameterDeclaration node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { // decl-specifier final IASTDeclSpecifier declSpec= node.getDeclSpecifier(); @@ -765,7 +765,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, declarator.accept(this); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -775,7 +775,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTDeclarator node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { // Common to all declarators @@ -827,7 +827,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, initializer.accept(this); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -852,7 +852,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTDeclSpecifier node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof ICPPASTCompositeTypeSpecifier) { visit((ICPPASTCompositeTypeSpecifier) node); @@ -870,7 +870,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, formatRaw(node); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -880,7 +880,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTExpression node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof IASTArraySubscriptExpression) { visit((IASTArraySubscriptExpression) node); @@ -918,7 +918,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, formatRaw(node); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -931,7 +931,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, if (getCurrentPosition() <= nodeOffset(node) && startsWithMacroExpansion(node)) { scribe.printCommentPreservingNewLines(); } - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } int indentLevel= scribe.indentationLevel; try { if (node instanceof IASTCompoundStatement) { @@ -985,7 +985,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -995,7 +995,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTTypeId node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof IASTProblemHolder) { throw new ASTProblemException(((IASTProblemHolder) node).getProblem()); @@ -1015,7 +1015,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, declarator.accept(this); } } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -1025,7 +1025,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(IASTEnumerator enumerator) { - if (!startNode(enumerator)) { return PROCESS_SKIP; } + if (!enterNode(enumerator)) { return PROCESS_SKIP; } try { // name enumerator.getName().accept(this); @@ -1040,7 +1040,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, value.accept(this); } } finally { - finishNode(enumerator); + exitNode(enumerator); } return PROCESS_SKIP; } @@ -1050,7 +1050,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(ICPPASTBaseSpecifier specifier) { - if (!startNode(specifier)) { return PROCESS_SKIP; } + if (!enterNode(specifier)) { return PROCESS_SKIP; } try { boolean needSpace= false; loop: while (true) { @@ -1072,7 +1072,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } specifier.getName().accept(this); } finally { - finishNode(specifier); + exitNode(specifier); } return PROCESS_SKIP; } @@ -1082,7 +1082,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(ICPPASTNamespaceDefinition node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { final int line= scribe.line; // namespace @@ -1104,7 +1104,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } formatClosingBrace(preferences.brace_position_for_namespace_declaration); } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -1206,7 +1206,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, */ @Override public int visit(ICPPASTTemplateParameter node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { if (node instanceof ICPPASTSimpleTypeTemplateParameter) { visit((ICPPASTSimpleTypeTemplateParameter) node); @@ -1218,7 +1218,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } catch (ASTProblemException e) { skipNode(node); } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -1284,12 +1284,12 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } private int visit(ICPPASTConstructorInitializer node) { - if (!startNode(node)) { return PROCESS_SKIP; } + if (!enterNode(node)) { return PROCESS_SKIP; } try { // Format like a function call formatFunctionCallArguments(node.getArguments()); } finally { - finishNode(node); + exitNode(node); } return PROCESS_SKIP; } @@ -1372,7 +1372,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, // Body if (bodyStmt instanceof IASTCompoundStatement) { - if (startNode(bodyStmt)) { + if (enterNode(bodyStmt)) { try { if (getCurrentPosition() <= nodeOffset(bodyStmt)) { formatLeftCurlyBrace(line, preferences.brace_position_for_method_declaration); @@ -1382,7 +1382,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, preferences.insert_space_before_opening_brace_in_method_declaration, preferences.indent_statements_compare_to_body); } finally { - finishNode(bodyStmt); + exitNode(bodyStmt); } } } else { @@ -1903,23 +1903,23 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, if (preferences.indent_body_declarations_compare_to_access_specifier) { scribe.unIndent(); } - if (startNode(declaration)) { + if (enterNode(declaration)) { try { scribe.startNewLine(); visit((ICPPASTVisibilityLabel) declaration); scribe.startNewLine(); } finally { - finishNode(declaration); + exitNode(declaration); } } } else { - if (startNode(declaration)) { + if (enterNode(declaration)) { try { if (getCurrentPosition() <= nodeOffset(declaration)) scribe.startNewLine(); formatDeclaration(declaration); } finally { - finishNode(declaration); + exitNode(declaration); } } else { skipNode(declaration); @@ -3211,7 +3211,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, scribe.exitAlignment(alignment, true); if (body instanceof IASTCompoundStatement && !startsWithMacroExpansion(body)) { - if (startNode(body)) { + if (enterNode(body)) { try { if (getCurrentPosition() <= nodeOffset(body)) { formatLeftCurlyBrace(line, preferences.brace_position_for_block); @@ -3221,7 +3221,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, preferences.insert_space_before_opening_brace_in_block, preferences.indent_statements_compare_to_block); } finally { - finishNode(body); + exitNode(body); } } } else { @@ -3330,7 +3330,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } } else { if (doNodesHaveSameOffset(node, thenStatement)) { - startNode(thenStatement); + enterNode(thenStatement); } if (elseStatement == null && preferences.keep_simple_if_on_one_line) { Alignment compactIfAlignment = scribe.createAlignment( @@ -3567,7 +3567,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } else { statements= Collections.singletonList(bodyStmt); } - if (!startNode(bodyStmt)) { return PROCESS_SKIP; } + if (!enterNode(bodyStmt)) { return PROCESS_SKIP; } try { final int statementsLength = statements.size(); if (statementsLength != 0) { @@ -3624,7 +3624,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } bracePosition = preferences.brace_position_for_block_in_case; try { - startNode(statement); + enterNode(statement); formatBlock((IASTCompoundStatement) statement, bracePosition, preferences.insert_space_after_colon_in_case, preferences.indent_statements_compare_to_block); @@ -3634,7 +3634,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, skipToNode(nextStatement); } } finally { - finishNode(statement); + exitNode(statement); } if (preferences.indent_switchstatements_compare_to_cases) { scribe.indent(); @@ -3642,7 +3642,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, } else { bracePosition = preferences.brace_position_for_block; try { - startNode(statement); + enterNode(statement); formatBlock((IASTCompoundStatement) statement, bracePosition, preferences.insert_space_before_opening_brace_in_block, preferences.indent_statements_compare_to_block); @@ -3652,7 +3652,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, skipToNode(nextStatement); } } finally { - finishNode(statement); + exitNode(statement); } } wasAStatement = true; @@ -3692,7 +3692,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, formatClosingBrace(brace_position); } } finally { - finishNode(bodyStmt); + exitNode(bodyStmt); } return PROCESS_SKIP; } @@ -3752,8 +3752,8 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, * @param node the AST node to be tested * @return false if the node should be skipped */ - private boolean startNode(IASTNode node) { - scribe.startNode(); + private boolean enterNode(IASTNode node) { + scribe.enterNode(); if (node instanceof IASTProblemHolder) { return false; } @@ -3796,7 +3796,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, * * @param node */ - private void finishNode(IASTNode node) { + private void exitNode(IASTNode node) { if (node instanceof IASTProblemHolder) { return; } @@ -3929,13 +3929,13 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, if (stmt != null) { if (stmt instanceof IASTCompoundStatement && !startsWithMacroExpansion(stmt)) { formatLeftCurlyBrace(line, brace_position); - if (startNode(stmt)) { + if (enterNode(stmt)) { try { formatBlock((IASTCompoundStatement) stmt, brace_position, preferences.insert_space_before_opening_brace_in_block, preferences.indent_statements_compare_to_block); } finally { - finishNode(stmt); + exitNode(stmt); } } } else if (stmt instanceof IASTNullStatement) { @@ -4172,7 +4172,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, !doNodeLocationsOverlap(statement, statements.get(i - 1))) { scribe.startNewLine(); } - if (!startNode(statement)) { + if (!enterNode(statement)) { continue; } try { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java index aaf0db2d342..e073278a6ee 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java @@ -1581,7 +1581,7 @@ public class Scribe { } } - public void startNode() { + public void enterNode() { lastLineComment.contiguous = false; } From 7366607b693b6bcb23ecd6017e9b9d34d44aeb05 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sun, 15 Apr 2012 19:32:26 -0700 Subject: [PATCH 2/6] Cosmetics. --- .../internal/checkers/ProblemBindingChecker.java | 10 +++------- .../core/parser/scanner/ASTPreprocessorNode.java | 7 ++++--- .../internal/core/parser/scanner/LocationMap.java | 15 ++++++--------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java index e6efcdea7d4..c57ce603003 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java @@ -61,13 +61,10 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker { return true; } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences#initPreferences(org.eclipse.cdt.codan.core.model.IProblemWorkingCopy) - */ @Override public void initPreferences(IProblemWorkingCopy problem) { super.initPreferences(problem); - // these checkers should not run on full or incremental build + // This checker should not run on full or incremental build getLaunchModePreference(problem).enableInLaunchModes(CheckerLaunchMode.RUN_AS_YOU_TYPE, CheckerLaunchMode.RUN_ON_DEMAND); } @@ -150,9 +147,8 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker { handleMemberProblem(name, parentNode, problemBinding, contextFlagsString); } else if (parentNode instanceof IASTNamedTypeSpecifier) { reportProblem(ERR_ID_TypeResolutionProblem, name, name.getRawSignature(), contextFlagsString); - } - // Probably a variable - else { + } else { + // Probably a variable handleVariableProblem(name, contextFlagsString); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java index 8334909db5f..605bdf42a9c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java @@ -555,10 +555,10 @@ class ASTFunctionStyleMacroDefinition extends ASTMacroDefinition implements IAST int endIdx= Math.min(fExpansionNumber - defOffset, image.length); char start= '('; for (int i = 0; i < result.length; i++) { - while(idx < endIdx && image[idx] != start) + while (idx < endIdx && image[idx] != start) idx++; idx++; - while(idx < endIdx && Character.isWhitespace(image[idx])) + while (idx < endIdx && Character.isWhitespace(image[idx])) idx++; start= ','; @@ -800,7 +800,8 @@ class ASTMacroExpansionLocation implements IASTMacroExpansionLocation, org.eclip @Override public IASTFileLocation asFileLocation() { - return ((LocationCtxContainer) fContext.getParent()).createFileLocation(fContext.fOffsetInParent, fContext.fEndOffsetInParent-fContext.fOffsetInParent); + return ((LocationCtxContainer) fContext.getParent()).createFileLocation(fContext.fOffsetInParent, + fContext.fEndOffsetInParent - fContext.fOffsetInParent); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java index e797ca97f7c..5c361fb2597 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.parser.scanner; import java.util.ArrayList; import java.util.IdentityHashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -657,11 +656,10 @@ public class LocationMap implements ILocationResolver { @Override public IASTPreprocessorMacroDefinition[] getMacroDefinitions() { - ArrayList result= new ArrayList(); - for (Iterator iterator = fDirectives.iterator(); iterator.hasNext();) { - Object directive= iterator.next(); + ArrayList result= new ArrayList(); + for (ASTPreprocessorNode directive : fDirectives) { if (directive instanceof IASTPreprocessorMacroDefinition) { - result.add(directive); + result.add((IASTPreprocessorMacroDefinition) directive); } } return result.toArray(new IASTPreprocessorMacroDefinition[result.size()]); @@ -669,11 +667,10 @@ public class LocationMap implements ILocationResolver { @Override public IASTPreprocessorIncludeStatement[] getIncludeDirectives() { - ArrayList result= new ArrayList(); - for (Iterator iterator = fDirectives.iterator(); iterator.hasNext();) { - Object directive= iterator.next(); + ArrayList result= new ArrayList(); + for (ASTPreprocessorNode directive : fDirectives) { if (directive instanceof IASTPreprocessorIncludeStatement) { - result.add(directive); + result.add((IASTPreprocessorIncludeStatement) directive); } } return result.toArray(new IASTPreprocessorIncludeStatement[result.size()]); From 8aed5c842713329cd08a9da2ca8c6ce77a663d73 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 16 Apr 2012 16:55:44 -0400 Subject: [PATCH 3/6] bug 371797: Let all jobs finish before tearDown() in unit tests --- .../providers/tests/GCCBuildCommandParserTest.java | 3 +++ .../providers/LanguageSettingsListenersTests.java | 10 ++++++++++ .../providers/LanguageSettingsProvidersSerializer.java | 5 +++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java index 8f49f26aa28..61d625ec001 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java @@ -38,6 +38,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.internal.core.XmlUtil; +import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuildCommandParser; import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser; @@ -104,6 +105,8 @@ public class GCCBuildCommandParserTest extends BaseTestCase { protected void tearDown() throws Exception { try { Job.getJobManager().join(AbstractBuildCommandParser.JOB_FAMILY_BUILD_COMMAND_PARSER, null); + Job.getJobManager().join(LanguageSettingsProvidersSerializer.JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT, null); + Job.getJobManager().join(LanguageSettingsProvidersSerializer.JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE, null); } catch (Exception e) { // ignore } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java index 8d13f5cb7e0..9e1c4c4badf 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsListenersTests.java @@ -23,8 +23,10 @@ import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; +import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.jobs.Job; /** * Test cases to cover {@link ILanguageSettingsChangeListener} capabilities. @@ -83,6 +85,12 @@ public class LanguageSettingsListenersTests extends BaseTestCase { protected void tearDown() throws Exception { LanguageSettingsManager.unregisterLanguageSettingsChangeListener(mockLseListener); LanguageSettingsManager.setWorkspaceProviders(null); + try { + Job.getJobManager().join(LanguageSettingsProvidersSerializer.JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT, null); + Job.getJobManager().join(LanguageSettingsProvidersSerializer.JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE, null); + } catch (Exception e) { + // ignore + } super.tearDown(); // includes ResourceHelper cleanup } @@ -557,6 +565,8 @@ public class LanguageSettingsListenersTests extends BaseTestCase { } { + // wait until serializing has finished + Job.getJobManager().join(LanguageSettingsProvidersSerializer.JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE, null); // close project project.close(null); assertEquals(0, MockListenerRegisterer.getCount(PROVIDER_CUSTOM_GLOBAL)); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 38257b493e2..05cf3566a98 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -74,8 +74,9 @@ public class LanguageSettingsProvidersSerializer { public static final String ELEM_PROVIDER = LanguageSettingsExtensionManager.ELEM_PROVIDER; public static final String ELEM_LANGUAGE_SCOPE = LanguageSettingsExtensionManager.ELEM_LANGUAGE_SCOPE; - private static final String JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT = "CDT_JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT"; //$NON-NLS-1$ - private static final String JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE = "CDT_JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE"; //$NON-NLS-1$ + public static final String JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT = "CDT_JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_PROJECT"; //$NON-NLS-1$ + public static final String JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE = "CDT_JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE"; //$NON-NLS-1$ + private static final String PREFERENCE_WORSPACE_PROVIDERS_SET = "language.settings.providers.workspace.prefs.toggle"; //$NON-NLS-1$ private static final String CPROJECT_STORAGE_MODULE = "org.eclipse.cdt.core.LanguageSettingsProviders"; //$NON-NLS-1$ private static final String STORAGE_WORKSPACE_LANGUAGE_SETTINGS = "language.settings.xml"; //$NON-NLS-1$ From f21f43f622079c62f73cf991bef8f8b5813b24b4 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 16 Apr 2012 16:57:18 -0400 Subject: [PATCH 4/6] bug 371797: Do serialization in background to avoid delays in UI --- .../LanguageSettingsProvidersSerializer.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 05cf3566a98..5b4970b5f73 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -51,6 +51,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ILock; import org.eclipse.core.runtime.jobs.ISchedulingRule; @@ -367,7 +368,7 @@ public class LanguageSettingsProvidersSerializer { */ public static void setWorkspaceProviders(List providers) throws CoreException { setWorkspaceProvidersInternal(providers); - serializeLanguageSettingsWorkspace(); + serializeLanguageSettingsWorkspaceInBackground(); // generate preference change event for preference change listeners (value is not intended to be used) IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID); prefs.putBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, ! prefs.getBoolean(PREFERENCE_WORSPACE_PROVIDERS_SET, false)); @@ -592,6 +593,17 @@ public class LanguageSettingsProvidersSerializer { * Load language settings for workspace. */ public static void loadLanguageSettingsWorkspace() { + // ensure completion of any scheduled background serialization + try { + Job.getJobManager().join(JOB_FAMILY_SERIALIZE_LANGUAGE_SETTINGS_WORKSPACE, null); + } catch (OperationCanceledException e) { + return; + } catch (InterruptedException e) { + CCorePlugin.log(e); + // restore interrupted status + Thread.currentThread().interrupt(); + } + List providers = null; URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); From 2bd9d517fb21bad4d239c8ab953fd13767dd85d6 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 16 Apr 2012 16:57:55 -0400 Subject: [PATCH 5/6] bug 371797: Use workspace scheduling rule for serializing workspace providers --- .../providers/AbstractBuiltinSpecsDetector.java | 11 +++++++---- .../LanguageSettingsProvidersSerializer.java | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java index 46be10b9efd..3341b86b986 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java @@ -41,7 +41,6 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; import org.eclipse.cdt.utils.CommandLineUtil; import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; @@ -57,6 +56,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.w3c.dom.Element; @@ -372,14 +372,17 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti } }; - IProject project = null; + ISchedulingRule rule = null; if (currentCfgDescription != null) { ICProjectDescription prjDescription = currentCfgDescription.getProjectDescription(); if (prjDescription != null) { - project = prjDescription.getProject(); + rule = prjDescription.getProject(); } } - job.setRule(project); + if (rule == null) { + rule = ResourcesPlugin.getWorkspace().getRoot(); + } + job.setRule(rule); job.schedule(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 5b4970b5f73..5f7a2a65544 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -45,6 +45,7 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -562,9 +563,9 @@ public class LanguageSettingsProvidersSerializer { } } - Job job = new Job(SettingsModelMessages.getString("LanguageSettingsProvidersSerializer.SerializeJobName")) { //$NON-NLS-1$ + Job job = new WorkspaceJob(SettingsModelMessages.getString("LanguageSettingsProvidersSerializer.SerializeJobName")) { //$NON-NLS-1$ @Override - protected IStatus run(IProgressMonitor monitor) { + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { try { monitor.beginTask(SettingsModelMessages.getString("LanguageSettingsProvidersSerializer.SerializingForWorkspace"), //$NON-NLS-1$ TICKS_SERIALIZING); @@ -584,7 +585,6 @@ public class LanguageSettingsProvidersSerializer { } }; - job.setRule(null); job.schedule(); } From 955bd297b2038127a7e9c8d941430e790792e44c Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 16 Apr 2012 14:41:19 -0400 Subject: [PATCH 6/6] Workaround for Java problem on Windows with releasing buffers for memory-mapped files java.io.FileNotFoundException: C:\workspace\junit-workspace\.metadata\.plugins\org.eclipse.cdt.core\language.settings.xml (The requested operation cannot be performed on a file with a user-mapped section open) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.(Unknown Source) at java.io.FileOutputStream.(Unknown Source) at org.eclipse.cdt.internal.core.XmlUtil.getFileOutputStreamWorkaround(XmlUtil.java:315) at org.eclipse.cdt.internal.core.XmlUtil.serializeXml(XmlUtil.java:290) at org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace(LanguageSettingsProvidersSerializer.java:539) at org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer$1.runInWorkspace(LanguageSettingsProvidersSerializer.java:577) at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) --- .../eclipse/cdt/internal/core/XmlUtil.java | 57 +++++++++++++++++-- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/internal/core/XmlUtil.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/internal/core/XmlUtil.java index f996e5e26c3..76ffb5efe70 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/internal/core/XmlUtil.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/internal/core/XmlUtil.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -228,13 +229,16 @@ public class XmlUtil { return null; } - InputStream xmlStream; try { - xmlStream = new FileInputStream(xmlFile); + InputStream xmlStream = new FileInputStream(xmlFile); + try { + return loadXml(xmlStream); + } finally { + xmlStream.close(); + } } catch (Exception e) { throw new CoreException(CCorePlugin.createStatus(Messages.XmlUtil_InternalErrorLoading, e)); } - return loadXml(xmlStream); } /** @@ -245,8 +249,16 @@ public class XmlUtil { * @throws CoreException if something goes wrong. */ public static Document loadXml(IFile xmlFile) throws CoreException { - InputStream xmlStream = xmlFile.getContents(); - return loadXml(xmlStream); + try { + InputStream xmlStream = xmlFile.getContents(); + try { + return loadXml(xmlStream); + } finally { + xmlStream.close(); + } + } catch (Exception e) { + throw new CoreException(CCorePlugin.createStatus(Messages.XmlUtil_InternalErrorLoading, e)); + } } /** @@ -273,13 +285,46 @@ public class XmlUtil { XmlUtil.prettyFormat(doc); DOMSource source = new DOMSource(doc); - StreamResult result = new StreamResult(new FileOutputStream(storeFile)); + StreamResult result = new StreamResult(getFileOutputStreamWorkaround(storeFile)); transformer.transform(source, result); result.getOutputStream().close(); ResourcesUtil.refreshWorkspaceFiles(uriLocation); } + /** + * Workaround for Java problem on Windows with releasing buffers for memory-mapped files. + * + * @see "http://stackoverflow.com/questions/3602783/file-access-synchronized-on-java-object" + * @see "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354433" + * @see "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4715154" + * @see "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4469299" + */ + private static FileOutputStream getFileOutputStreamWorkaround(java.io.File storeFile) throws FileNotFoundException { + final int maxCount = 10; + for (int i = 0; i <= maxCount; i++) { + try { + // there is no sleep on first round + Thread.sleep(10 * i); + } catch (InterruptedException e) { + // restore interrupted status + Thread.currentThread().interrupt(); + } + try { + return new FileOutputStream(storeFile); + } catch (FileNotFoundException e) { + // only apply workaround for the very specific exception + if (i >= maxCount || !e.getMessage().contains("The requested operation cannot be performed on a file with a user-mapped section open")) { //$NON-NLS-1$ + throw e; + } +// CCorePlugin.log(new Status(IStatus.INFO, CCorePlugin.PLUGIN_ID, "Workaround for concurrent access to memory-mapped files applied, attempt " + (i + 1), e)); //$NON-NLS-1$ + } + } + + // will never get here + return null; + } + /** * Serialize XML Document into a byte array. * @param doc - DOM Document to serialize.