1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Bug 489563 - API change for Language Settings Providers.

Use IBuildConfiguration instead of ICConfigurationDescription.
Add adapters to convert back and forth between these. Create
IBuildConfiguration objects when configuration descriptors are
created.

Clean up formating of the code involved.

Change-Id: Iec5ca132dddbf990f116f96b4680ef5f7318e28b
This commit is contained in:
Doug Schaefer 2016-03-15 15:58:01 -04:00
parent c58c554e3a
commit 5a5de4b1db
49 changed files with 5729 additions and 5199 deletions

View file

@ -25,8 +25,10 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser; import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Adapters;
import org.junit.Test; import org.junit.Test;
/** /**
@ -61,6 +63,8 @@ public class LibtoolGCCBuildCommandParserTest {
IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IProject project = ResourceHelper.createCDTProjectWithConfig(projectName);
ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project);
ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ICConfigurationDescription cfgDescription = cfgDescriptions[0];
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
IFile file1 = ResourceHelper.createFile(project, "file1.cpp"); IFile file1 = ResourceHelper.createFile(project, "file1.cpp");
IFile file2 = ResourceHelper.createFile(project, "file2.cpp"); IFile file2 = ResourceHelper.createFile(project, "file2.cpp");
@ -77,11 +81,11 @@ public class LibtoolGCCBuildCommandParserTest {
parser.processLine("libtool: compile: g++ -I/path0 file2.cpp"); parser.processLine("libtool: compile: g++ -I/path0 file2.cpp");
parser.processLine("libtool: compile: cc -I/path0 file3.cpp"); parser.processLine("libtool: compile: cc -I/path0 file3.cpp");
parser.shutdown(); parser.shutdown();
List<ICLanguageSettingEntry> entries = parser.getSettingEntries(cfgDescription, file1, languageId); List<ICLanguageSettingEntry> entries = parser.getSettingEntries(config, file1, languageId);
assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0)); assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0));
entries = parser.getSettingEntries(cfgDescription, file2, languageId); entries = parser.getSettingEntries(config, file2, languageId);
assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0)); assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0));
entries = parser.getSettingEntries(cfgDescription, file3, languageId); entries = parser.getSettingEntries(config, file3, languageId);
assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0)); assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0));
} }

View file

@ -1,4 +1,3 @@
#Thu Oct 08 20:38:59 EDT 2009
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
@ -85,262 +84,6 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.7 org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=110
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=110
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true

View file

@ -0,0 +1,2 @@
eclipse.preferences.version=1
formatter_settings_version=12

View file

@ -47,7 +47,9 @@ import org.eclipse.cdt.internal.core.envvar.UserDefinedEnvironmentSupplier;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector; import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector;
import org.eclipse.cdt.utils.envvar.StorableEnvironment; import org.eclipse.cdt.utils.envvar.StorableEnvironment;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
@ -83,10 +85,12 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
protected List<String> parseOptions(String line) { protected List<String> parseOptions(String line) {
return null; return null;
} }
@Override @Override
protected AbstractOptionParser[] getOptionParsers() { protected AbstractOptionParser[] getOptionParsers() {
return null; return null;
} }
@Override @Override
protected String getCompilerCommand(String languageId) { protected String getCompilerCommand(String languageId) {
return null; return null;
@ -101,6 +105,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
protected void startupForLanguage(String languageId) throws CoreException { protected void startupForLanguage(String languageId) throws CoreException {
super.startupForLanguage(languageId); super.startupForLanguage(languageId);
} }
@Override @Override
protected void shutdownForLanguage() { protected void shutdownForLanguage() {
super.shutdownForLanguage(); super.shutdownForLanguage();
@ -116,6 +121,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
super.execute(); super.execute();
waitForProviderToFinish(); waitForProviderToFinish();
} }
protected boolean isExecuted() { protected boolean isExecuted() {
return isExecuted; return isExecuted;
} }
@ -128,15 +134,19 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
private int executedCount = 0; private int executedCount = 0;
@Override @Override
public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker) throws CoreException { public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker)
throws CoreException {
executedCount++; executedCount++;
super.startup(cfgDescription, cwdTracker); super.startup(cfgDescription, cwdTracker);
} }
@Override @Override
public MockBuiltinSpecsDetectorEnvironmentChangeListener cloneShallow() throws CloneNotSupportedException { public MockBuiltinSpecsDetectorEnvironmentChangeListener cloneShallow()
throws CloneNotSupportedException {
MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.cloneShallow(); MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.cloneShallow();
return clone; return clone;
} }
@Override @Override
public MockBuiltinSpecsDetectorEnvironmentChangeListener clone() throws CloneNotSupportedException { public MockBuiltinSpecsDetectorEnvironmentChangeListener clone() throws CloneNotSupportedException {
MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.clone(); MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.clone();
@ -158,17 +168,21 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
protected boolean validateEnvironment() { protected boolean validateEnvironment() {
return false; return false;
} }
@Override @Override
protected void execute() { protected void execute() {
super.execute(); super.execute();
sampleEnvVarValue = environmentMap.get(ENV_SAMPLE); sampleEnvVarValue = environmentMap.get(ENV_SAMPLE);
} }
@Override @Override
public MockBuiltinSpecsDetectorEnvironmentChangeListener cloneShallow() throws CloneNotSupportedException { public MockBuiltinSpecsDetectorEnvironmentChangeListener cloneShallow()
throws CloneNotSupportedException {
MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.cloneShallow(); MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.cloneShallow();
clone.sampleEnvVarValue = sampleEnvVarValue; clone.sampleEnvVarValue = sampleEnvVarValue;
return clone; return clone;
} }
@Override @Override
public MockBuiltinSpecsDetectorEnvironmentChangeListener clone() throws CloneNotSupportedException { public MockBuiltinSpecsDetectorEnvironmentChangeListener clone() throws CloneNotSupportedException {
MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.clone(); MockBuiltinSpecsDetectorEnvironmentChangeListener clone = (MockBuiltinSpecsDetectorEnvironmentChangeListener) super.clone();
@ -179,6 +193,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
protected boolean isExecuted() { protected boolean isExecuted() {
return isExecuted; return isExecuted;
} }
public String getSampleEnvVar() { public String getSampleEnvVar() {
return sampleEnvVarValue; return sampleEnvVarValue;
} }
@ -189,28 +204,38 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
*/ */
private class MockConsoleBuiltinSpecsDetector extends AbstractBuiltinSpecsDetector { private class MockConsoleBuiltinSpecsDetector extends AbstractBuiltinSpecsDetector {
@SuppressWarnings("nls") @SuppressWarnings("nls")
private final AbstractOptionParser[] optionParsers = { private final AbstractOptionParser[] optionParsers = { new MacroOptionParser("#define (\\S*) *(\\S*)",
new MacroOptionParser("#define (\\S*) *(\\S*)", "$1", "$2", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY), "$1", "$2", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY), };
};
@Override @Override
protected int runProgramForLanguage(String languageId, String command, String[] envp, URI workingDirectoryURI, OutputStream consoleOut, OutputStream consoleErr, IProgressMonitor monitor) throws CoreException, IOException { protected int runProgramForLanguage(String languageId, String command, String[] envp,
URI workingDirectoryURI, OutputStream consoleOut, OutputStream consoleErr,
IProgressMonitor monitor) throws CoreException, IOException {
String line = "#define MACRO VALUE"; String line = "#define MACRO VALUE";
consoleOut.write((line + '\n').getBytes()); consoleOut.write((line + '\n').getBytes());
consoleOut.flush(); consoleOut.flush();
return ICommandLauncher.OK; return ICommandLauncher.OK;
} }
@Override @Override
protected IStatus runForEachLanguage(IProgressMonitor monitor) { protected IStatus runForEachLanguage(IProgressMonitor monitor) {
return super.runForEachLanguage(monitor); return super.runForEachLanguage(monitor);
} }
@Override @Override
protected List<String> parseOptions(final String line) { protected List<String> parseOptions(final String line) {
return new ArrayList<String>() {{ add(line); }}; return new ArrayList<String>() {
{
add(line);
} }
};
}
@Override @Override
protected AbstractOptionParser[] getOptionParsers() { protected AbstractOptionParser[] getOptionParsers() {
return optionParsers; return optionParsers;
} }
@Override @Override
protected String getCompilerCommand(String languageId) { protected String getCompilerCommand(String languageId) {
return null; return null;
@ -280,7 +305,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
Map<String, String> properties = new HashMap<String, String>(); Map<String, String> properties = new HashMap<String, String>();
properties.put(ATTR_PARAMETER, CUSTOM_COMMAND_1); properties.put(ATTR_PARAMETER, CUSTOM_COMMAND_1);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
entries.add(entry); entries.add(entry);
provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, properties); provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, properties);
@ -314,6 +340,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
public MockDetectorCloneable clone() throws CloneNotSupportedException { public MockDetectorCloneable clone() throws CloneNotSupportedException {
return (MockDetectorCloneable) super.clone(); return (MockDetectorCloneable) super.clone();
} }
@Override @Override
public MockDetectorCloneable cloneShallow() throws CloneNotSupportedException { public MockDetectorCloneable cloneShallow() throws CloneNotSupportedException {
return (MockDetectorCloneable) super.cloneShallow(); return (MockDetectorCloneable) super.cloneShallow();
@ -326,7 +353,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
List<String> languages = new ArrayList<String>(); List<String> languages = new ArrayList<String>();
languages.add(LANGUAGE_ID); languages.add(LANGUAGE_ID);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
entries.add(entry); entries.add(entry);
// check clone after initialization // check clone after initialization
@ -384,7 +412,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
{ {
MockDetectorCloneable clone = provider.clone(); MockDetectorCloneable clone = provider.clone();
List<ICLanguageSettingEntry> entries2 = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries2 = new ArrayList<ICLanguageSettingEntry>();
entries2.add(new CMacroEntry("MACRO2", "VALUE2", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY)); entries2.add(
new CMacroEntry("MACRO2", "VALUE2", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY));
clone.setSettingEntries(null, null, null, entries2); clone.setSettingEntries(null, null, null, entries2);
assertFalse(provider.equals(clone)); assertFalse(provider.equals(clone));
} }
@ -544,7 +573,11 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ICConfigurationDescription cfgDescription = cfgDescriptions[0];
MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector(); MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector();
provider.setLanguageScope(new ArrayList<String>() {{add(LANGUAGE_ID);}}); provider.setLanguageScope(new ArrayList<String>() {
{
add(LANGUAGE_ID);
}
});
// Run provider // Run provider
provider.startup(cfgDescription, null); provider.startup(cfgDescription, null);
@ -557,8 +590,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
assertNull(noentries); assertNull(noentries);
// Check parsed entries // Check parsed entries
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(cfgDescription, null, LANGUAGE_ID); IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); List<ICLanguageSettingEntry> entries = provider.getSettingEntries(config, null, LANGUAGE_ID);
ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
assertEquals(expected, entries.get(0)); assertEquals(expected, entries.get(0));
} }
@ -568,7 +603,11 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
public void testAbstractBuiltinSpecsDetector_RunGlobal() throws Exception { public void testAbstractBuiltinSpecsDetector_RunGlobal() throws Exception {
// Create provider // Create provider
MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector(); MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector();
provider.setLanguageScope(new ArrayList<String>() {{add(LANGUAGE_ID);}}); provider.setLanguageScope(new ArrayList<String>() {
{
add(LANGUAGE_ID);
}
});
// Run provider // Run provider
provider.startup(null, null); provider.startup(null, null);
@ -579,7 +618,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Check parsed entries // Check parsed entries
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, LANGUAGE_ID); List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, LANGUAGE_ID);
ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
assertEquals(expected, entries.get(0)); assertEquals(expected, entries.get(0));
} }
@ -595,7 +635,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Create provider // Create provider
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = new MockBuiltinSpecsDetectorEnvironmentChangeListener(); MockBuiltinSpecsDetectorEnvironmentChangeListener provider = new MockBuiltinSpecsDetectorEnvironmentChangeListener();
// register environment listener on configuration - note that provider is not included in the configuration // register environment listener on configuration - note that provider is not included in the
// configuration
provider.registerListener(cfgDescription); provider.registerListener(cfgDescription);
waitForProviderToFinish(); waitForProviderToFinish();
assertEquals(true, provider.isExecuted()); assertEquals(true, provider.isExecuted());
@ -607,8 +648,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Set an environment variable to the configuration // Set an environment variable to the configuration
{ {
ICProjectDescription prjDescriptionWritable = CoreModel.getDefault().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CoreModel.getDefault()
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable.getActiveConfiguration(); .getProjectDescription(project, true);
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable
.getActiveConfiguration();
// create and set sample environment variable in the configuration // create and set sample environment variable in the configuration
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IContributedEnvironment contribEnv = envManager.getContributedEnvironment(); IContributedEnvironment contribEnv = envManager.getContributedEnvironment();
@ -635,8 +678,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Set an environment variable to the configuration // Set an environment variable to the configuration
{ {
ICProjectDescription prjDescriptionWritable = CoreModel.getDefault().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CoreModel.getDefault()
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable.getActiveConfiguration(); .getProjectDescription(project, true);
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable
.getActiveConfiguration();
// create and set sample environment variable in the configuration // create and set sample environment variable in the configuration
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IContributedEnvironment contribEnv = envManager.getContributedEnvironment(); IContributedEnvironment contribEnv = envManager.getContributedEnvironment();
@ -667,13 +712,16 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Assign a provider to configuration // Assign a provider to configuration
{ {
ICProjectDescription prjDescriptionWritable = CoreModel.getDefault().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CoreModel.getDefault()
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable.getActiveConfiguration(); .getProjectDescription(project, true);
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable
.getActiveConfiguration();
// Create provider // Create provider
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = new MockBuiltinSpecsDetectorEnvironmentChangeListener(); MockBuiltinSpecsDetectorEnvironmentChangeListener provider = new MockBuiltinSpecsDetectorEnvironmentChangeListener();
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(provider); providers.add(provider);
((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable).setLanguageSettingProviders(providers); ((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable)
.setLanguageSettingProviders(providers);
// Write to project description // Write to project description
CProjectDescriptionManager.getInstance().setProjectDescription(project, prjDescriptionWritable); CProjectDescriptionManager.getInstance().setProjectDescription(project, prjDescriptionWritable);
@ -685,8 +733,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Set environment variable to the configuration // Set environment variable to the configuration
{ {
ICProjectDescription prjDescriptionWritable = CoreModel.getDefault().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CoreModel.getDefault()
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable.getActiveConfiguration(); .getProjectDescription(project, true);
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable
.getActiveConfiguration();
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IContributedEnvironment contribEnv = envManager.getContributedEnvironment(); IContributedEnvironment contribEnv = envManager.getContributedEnvironment();
@ -695,8 +745,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
contribEnv.addVariable(var, cfgDescriptionWritable); contribEnv.addVariable(var, cfgDescriptionWritable);
assertEquals(var, envManager.getVariable(ENV_SAMPLE, cfgDescriptionWritable, true)); assertEquals(var, envManager.getVariable(ENV_SAMPLE, cfgDescriptionWritable, true));
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable)
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers.get(0); .getLanguageSettingProviders();
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers
.get(0);
// unset "isExecuted" flag // unset "isExecuted" flag
provider.clear(); provider.clear();
assertEquals(false, provider.isExecuted()); assertEquals(false, provider.isExecuted());
@ -710,7 +762,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Check if the provider got executed // Check if the provider got executed
{ {
// check if environment variable got there // check if environment variable got there
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, false); ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project,
false);
ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration();
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IEnvironmentVariable var = envManager.getVariable(ENV_SAMPLE, cfgDescription, true); IEnvironmentVariable var = envManager.getVariable(ENV_SAMPLE, cfgDescription, true);
@ -718,8 +771,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(ENV_SAMPLE_VALUE_1, var.getValue()); assertEquals(ENV_SAMPLE_VALUE_1, var.getValue());
// check if provider got executed with new value // check if provider got executed with new value
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers.get(0); .getLanguageSettingProviders();
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers
.get(0);
assertEquals(true, provider.isExecuted()); assertEquals(true, provider.isExecuted());
assertEquals(ENV_SAMPLE_VALUE_1, provider.getSampleEnvVar()); assertEquals(ENV_SAMPLE_VALUE_1, provider.getSampleEnvVar());
} }
@ -727,8 +782,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Repeat one more time with different value of environment variable // Repeat one more time with different value of environment variable
// Set another environment variable to the configuration // Set another environment variable to the configuration
{ {
ICProjectDescription prjDescriptionWritable = CoreModel.getDefault().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CoreModel.getDefault()
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable.getActiveConfiguration(); .getProjectDescription(project, true);
ICConfigurationDescription cfgDescriptionWritable = prjDescriptionWritable
.getActiveConfiguration();
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IContributedEnvironment contribEnv = envManager.getContributedEnvironment(); IContributedEnvironment contribEnv = envManager.getContributedEnvironment();
@ -737,8 +794,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
contribEnv.addVariable(var, cfgDescriptionWritable); contribEnv.addVariable(var, cfgDescriptionWritable);
assertEquals(var, envManager.getVariable(ENV_SAMPLE, cfgDescriptionWritable, true)); assertEquals(var, envManager.getVariable(ENV_SAMPLE, cfgDescriptionWritable, true));
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescriptionWritable)
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers.get(0); .getLanguageSettingProviders();
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers
.get(0);
// unset "isExecuted" flag // unset "isExecuted" flag
provider.clear(); provider.clear();
assertEquals(false, provider.isExecuted()); assertEquals(false, provider.isExecuted());
@ -752,7 +811,8 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// Check if the provider got executed // Check if the provider got executed
{ {
// check if environment variable got there // check if environment variable got there
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, false); ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project,
false);
ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration();
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
IEnvironmentVariable var = envManager.getVariable(ENV_SAMPLE, cfgDescription, true); IEnvironmentVariable var = envManager.getVariable(ENV_SAMPLE, cfgDescription, true);
@ -760,8 +820,10 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(ENV_SAMPLE_VALUE_2, var.getValue()); assertEquals(ENV_SAMPLE_VALUE_2, var.getValue());
// check if provider got executed with new value // check if provider got executed with new value
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers.get(0); .getLanguageSettingProviders();
MockBuiltinSpecsDetectorEnvironmentChangeListener provider = (MockBuiltinSpecsDetectorEnvironmentChangeListener) providers
.get(0);
assertEquals(true, provider.isExecuted()); assertEquals(true, provider.isExecuted());
assertEquals(ENV_SAMPLE_VALUE_2, provider.getSampleEnvVar()); assertEquals(ENV_SAMPLE_VALUE_2, provider.getSampleEnvVar());
} }
@ -843,7 +905,6 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
long lastModifiedUpdated = compiler.lastModified(); long lastModifiedUpdated = compiler.lastModified();
assertTrue(lastModifiedUpdated != lastModified); assertTrue(lastModifiedUpdated != lastModified);
// Check that an event triggers rerun after upgrade // Check that an event triggers rerun after upgrade
provider.handleEvent(null); provider.handleEvent(null);
waitForProviderToFinish(); waitForProviderToFinish();
@ -940,18 +1001,30 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
*/ */
public void testAbstractBuiltinSpecsDetector_GroupSettings() throws Exception { public void testAbstractBuiltinSpecsDetector_GroupSettings() throws Exception {
// define benchmarks // define benchmarks
final CIncludePathEntry includePath_1 = new CIncludePathEntry("/include/path_1", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CIncludePathEntry includePath_1 = new CIncludePathEntry("/include/path_1",
final CIncludePathEntry includePath_2 = new CIncludePathEntry("/include/path_2", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CIncludeFileEntry includeFile_1 = new CIncludeFileEntry(new Path("/include.file1"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CIncludePathEntry includePath_2 = new CIncludePathEntry("/include/path_2",
final CIncludeFileEntry includeFile_2 = new CIncludeFileEntry(new Path("/include.file2"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CMacroEntry macro_1 = new CMacroEntry("MACRO_1", "", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CIncludeFileEntry includeFile_1 = new CIncludeFileEntry(new Path("/include.file1"),
final CMacroEntry macro_2 = new CMacroEntry("MACRO_2", "", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY |ICSettingEntry.UNDEFINED); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CMacroFileEntry macroFile_1 = new CMacroFileEntry(new Path("/macro.file1"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CIncludeFileEntry includeFile_2 = new CIncludeFileEntry(new Path("/include.file2"),
final CMacroFileEntry macroFile_2 = new CMacroFileEntry(new Path("/macro.file2"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryPathEntry libraryPath_1 = new CLibraryPathEntry(new Path("/lib/path_1"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CMacroEntry macro_1 = new CMacroEntry("MACRO_1", "",
final CLibraryPathEntry libraryPath_2 = new CLibraryPathEntry(new Path("/lib/path_2"), ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryFileEntry libraryFile_1 = new CLibraryFileEntry("lib_1.a", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); final CMacroEntry macro_2 = new CMacroEntry("MACRO_2", "",
final CLibraryFileEntry libraryFile_2 = new CLibraryFileEntry("lib_2.a", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); ICSettingEntry.BUILTIN | ICSettingEntry.READONLY | ICSettingEntry.UNDEFINED);
final CMacroFileEntry macroFile_1 = new CMacroFileEntry(new Path("/macro.file1"),
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CMacroFileEntry macroFile_2 = new CMacroFileEntry(new Path("/macro.file2"),
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryPathEntry libraryPath_1 = new CLibraryPathEntry(new Path("/lib/path_1"),
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryPathEntry libraryPath_2 = new CLibraryPathEntry(new Path("/lib/path_2"),
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryFileEntry libraryFile_1 = new CLibraryFileEntry("lib_1.a",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
final CLibraryFileEntry libraryFile_2 = new CLibraryFileEntry("lib_2.a",
ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
// Define mock detector adding unorganized entries // Define mock detector adding unorganized entries
MockBuiltinSpecsDetector provider = new MockBuiltinSpecsDetector() { MockBuiltinSpecsDetector provider = new MockBuiltinSpecsDetector() {

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider; import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider;
import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
@ -55,9 +56,11 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
* Test that null arguments don't crash the provider. * Test that null arguments don't crash the provider.
*/ */
public void testNulls() throws Exception { public void testNulls() throws Exception {
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(MBS_LANGUAGE_SETTINGS_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager
.getWorkspaceProvider(MBS_LANGUAGE_SETTINGS_PROVIDER_ID);
assertNotNull(provider); assertNotNull(provider);
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> entries = provider.getSettingEntries((IBuildConfiguration) null, null,
null);
assertEquals(null, entries); assertEquals(null, entries);
} }
@ -76,7 +79,8 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
{ {
ILanguageSettingsProvider provider = providers.get(0); ILanguageSettingsProvider provider = providers.get(0);
String id = provider.getId(); String id = provider.getId();
@ -110,8 +114,8 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
} }
/** /**
* Test that no unnecessary storage file is created for language settings for default set * Test that no unnecessary storage file is created for language settings for default set of language
* of language settings providers. * settings providers.
*/ */
public void testProjectPersistence_Defaults() throws Exception { public void testProjectPersistence_Defaults() throws Exception {
// create a new project // create a new project
@ -125,8 +129,10 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
String[] defaultIds = ((ILanguageSettingsProvidersKeeper) cfgDescription).getDefaultLanguageSettingsProvidersIds(); String[] defaultIds = ((ILanguageSettingsProvidersKeeper) cfgDescription)
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); .getDefaultLanguageSettingsProvidersIds();
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
assertEquals(defaultIds.length, providers.size()); assertEquals(defaultIds.length, providers.size());
for (int i = 0; i < defaultIds.length; i++) { for (int i = 0; i < defaultIds.length; i++) {
assertEquals(providers.get(i).getId(), defaultIds[i]); assertEquals(providers.get(i).getId(), defaultIds[i]);
@ -140,7 +146,8 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertEquals(false, xmlStorageFile.getParent().exists()); // .settings folder assertEquals(false, xmlStorageFile.getParent().exists()); // .settings folder
// no settings file in workspace area // no settings file in workspace area
String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests.getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML); String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests
.getStoreLocationInWorkspaceArea(project.getName() + '.' + LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation); java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation);
assertEquals(false, xmlStorageFilePrjWsp.exists()); assertEquals(false, xmlStorageFilePrjWsp.exists());
} }
@ -160,8 +167,10 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(new ArrayList<ILanguageSettingsProvider>()); ((ILanguageSettingsProvidersKeeper) cfgDescription)
assertTrue(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders().size() == 0); .setLanguageSettingProviders(new ArrayList<ILanguageSettingsProvider>());
assertTrue(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders()
.size() == 0);
} }
CoreModel.getDefault().setProjectDescription(project, prjDescription); CoreModel.getDefault().setProjectDescription(project, prjDescription);
@ -171,7 +180,8 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertEquals(true, xmlStorageFile.exists()); assertEquals(true, xmlStorageFile.exists());
// no settings file in workspace area // no settings file in workspace area
String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests.getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML); String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests
.getStoreLocationInWorkspaceArea(project.getName() + '.' + LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation); java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation);
assertEquals(false, xmlStorageFilePrjWsp.exists()); assertEquals(false, xmlStorageFilePrjWsp.exists());

View file

@ -1,4 +1,3 @@
#Thu Apr 29 13:15:20 EDT 2010
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
@ -81,262 +80,6 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.7 org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=110
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=110
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true

View file

@ -0,0 +1,2 @@
eclipse.preferences.version=1
formatter_settings_version=12

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingBase;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -41,10 +42,17 @@ import org.eclipse.core.variables.VariablesPlugin;
/** /**
* Implementation of language settings provider for CDT Managed Build System. * Implementation of language settings provider for CDT Managed Build System.
*/ */
public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsBroadcastingProvider { public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
implements ILanguageSettingsBroadcastingProvider {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
if (cfgDescription == null || rc == null) { String languageId) {
if (config == null || rc == null) {
return null;
}
ICConfigurationDescription cfgDescription = config.getAdapter(ICConfigurationDescription.class);
if (cfgDescription == null) {
return null; return null;
} }
@ -56,7 +64,7 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
if (ls != null) { if (ls != null) {
languageSettings = new ICLanguageSetting[] { ls }; languageSettings = new ICLanguageSetting[] { ls };
} else { } else {
return getSettingEntries(cfgDescription, rc.getParent(), languageId); return getSettingEntries(config, rc.getParent(), languageId);
} }
} else { } else {
ICResourceDescription rcDescription = cfgDescription.getResourceDescription(projectPath, false); ICResourceDescription rcDescription = cfgDescription.getResourceDescription(projectPath, false);
@ -74,7 +82,8 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
int kindsBits = langSetting.getSupportedEntryKinds(); int kindsBits = langSetting.getSupportedEntryKinds();
for (int kind = 1; kind <= kindsBits; kind <<= 1) { for (int kind = 1; kind <= kindsBits; kind <<= 1) {
if ((kindsBits & kind) != 0) { if ((kindsBits & kind) != 0) {
List<ICLanguageSettingEntry> additions = langSetting.getSettingEntriesList(kind); List<ICLanguageSettingEntry> additions = langSetting
.getSettingEntriesList(kind);
for (ICLanguageSettingEntry entry : additions) { for (ICLanguageSettingEntry entry : additions) {
if (entry instanceof ICPathEntry) { if (entry instanceof ICPathEntry) {
// have to use getName() rather than getLocation() and not use IPath operations to avoid collapsing ".." // have to use getName() rather than getLocation() and not use IPath operations to avoid collapsing ".."
@ -83,16 +92,25 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
// We need to add project-rooted entry for relative path as MBS counts it this way in some UI // We need to add project-rooted entry for relative path as MBS counts it this way in some UI
// The relative entry below also should be added for indexer to resolve from source file locations // The relative entry below also should be added for indexer to resolve from source file locations
ICdtVariableManager varManager = CCorePlugin.getDefault().getCdtVariableManager(); ICdtVariableManager varManager = CCorePlugin.getDefault()
.getCdtVariableManager();
try { try {
// Substitute build/environment variables // Substitute build/environment variables
String location = varManager.resolveValue(pathStr, "", null, cfgDescription); //$NON-NLS-1$ String location = varManager.resolveValue(pathStr, "", null, //$NON-NLS-1$
cfgDescription);
if (!new Path(location).isAbsolute()) { if (!new Path(location).isAbsolute()) {
IStringVariableManager mngr = VariablesPlugin.getDefault().getStringVariableManager(); IStringVariableManager mngr = VariablesPlugin.getDefault()
String projectRootedPath = mngr.generateVariableExpression("workspace_loc", rc.getProject().getName()) + Path.SEPARATOR + pathStr; //$NON-NLS-1$ .getStringVariableManager();
String projectRootedPath = mngr
.generateVariableExpression("workspace_loc", //$NON-NLS-1$
rc.getProject().getName())
+ Path.SEPARATOR + pathStr;
// clear "RESOLVED" flag // clear "RESOLVED" flag
int flags = entry.getFlags() & ~(ICSettingEntry.RESOLVED | ICSettingEntry.VALUE_WORKSPACE_PATH); int flags = entry.getFlags() & ~(ICSettingEntry.RESOLVED
ICLanguageSettingEntry projectRootedEntry = (ICLanguageSettingEntry) CDataUtil.createEntry(kind, projectRootedPath, projectRootedPath, null, flags); | ICSettingEntry.VALUE_WORKSPACE_PATH);
ICLanguageSettingEntry projectRootedEntry = (ICLanguageSettingEntry) CDataUtil
.createEntry(kind, projectRootedPath,
projectRootedPath, null, flags);
if (!list.contains(projectRootedEntry)) { if (!list.contains(projectRootedEntry)) {
list.add(projectRootedEntry); list.add(projectRootedEntry);
} }
@ -149,10 +167,12 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
public boolean isEmpty() { public boolean isEmpty() {
return false; return false;
} }
@Override @Override
public LanguageSettingsStorage clone() throws CloneNotSupportedException { public LanguageSettingsStorage clone() throws CloneNotSupportedException {
return this; return this;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
// Note that this always triggers change event even if nothing changed in MBS // Note that this always triggers change event even if nothing changed in MBS

View file

@ -23,17 +23,21 @@ import org.eclipse.cdt.core.errorparsers.RegexErrorPattern;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Adapters;
/** /**
* Abstract class for providers parsing compiler option from build command when present in build output. * Abstract class for providers parsing compiler option from build command when present in build
* output.
* <p> * <p>
* <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as * <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as it is not currently (CDT
* it is not currently (CDT 8.1, Juno) clear how it may need to be used in future. * 8.1, Juno) clear how it may need to be used in future. There is no guarantee that this API will
* There is no guarantee that this API will work or that it will remain the same. * work or that it will remain the same. Please do not use this API without consulting with the CDT
* Please do not use this API without consulting with the CDT team. * team.
* </p> * </p>
*
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
* *
* @since 8.1 * @since 8.1
@ -47,12 +51,11 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
private static final String VALUE_FOLDER_SCOPE = "per-folder"; //$NON-NLS-1$ private static final String VALUE_FOLDER_SCOPE = "per-folder"; //$NON-NLS-1$
private static final String VALUE_PROJECT_SCOPE = "per-project"; //$NON-NLS-1$ private static final String VALUE_PROJECT_SCOPE = "per-project"; //$NON-NLS-1$
private static final String LEADING_PATH_PATTERN = "\\S+[/\\\\]"; //$NON-NLS-1$ private static final String LEADING_PATH_PATTERN = "\\S+[/\\\\]"; //$NON-NLS-1$
/** /**
* "foo" * "foo" Using look-ahead and look-behind to resolve ambiguity with "\"
* Using look-ahead and look-behind to resolve ambiguity with "\" {@link #QUOTE_BSLASH_QUOTE} * {@link #QUOTE_BSLASH_QUOTE}
*/ */
private static final String QUOTE = "(\"(?!\\\\).*?(?<!\\\\)\")"; //$NON-NLS-1$ private static final String QUOTE = "(\"(?!\\\\).*?(?<!\\\\)\")"; //$NON-NLS-1$
/** \"foo\" */ /** \"foo\" */
@ -62,7 +65,8 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
/** "\"foo\"" */ /** "\"foo\"" */
private static final String QUOTE_BSLASH_QUOTE = "(\"\\\\\".*?\\\\\"\")"; //$NON-NLS-1$ private static final String QUOTE_BSLASH_QUOTE = "(\"\\\\\".*?\\\\\"\")"; //$NON-NLS-1$
private static final Pattern OPTIONS_PATTERN = Pattern.compile("-[^\\s\"'\\\\]*(\\s*(" + QUOTE +"|" + QUOTE_BSLASH_QUOTE + "|" + BSLASH_QUOTE + "|" + SINGLE_QUOTE + "|([^-\\s][^\\s]+)))?"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$< private static final Pattern OPTIONS_PATTERN = Pattern.compile("-[^\\s\"'\\\\]*(\\s*(" + QUOTE + "|" //$NON-NLS-1$ //$NON-NLS-2$
+ QUOTE_BSLASH_QUOTE + "|" + BSLASH_QUOTE + "|" + SINGLE_QUOTE + "|([^-\\s][^\\s]+)))?"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private static final int OPTION_GROUP = 0; private static final int OPTION_GROUP = 0;
public enum ResourceScope { public enum ResourceScope {
@ -77,7 +81,8 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static final String[] COMPILER_COMMAND_PATTERN_TEMPLATES = { private static final String[] COMPILER_COMMAND_PATTERN_TEMPLATES = {
"${COMPILER_PATTERN}.*\\s" + "()([^'\"\\s]*\\.${EXTENSIONS_PATTERN})(\\s.*)?[\r\n]*", // compiling unquoted file "${COMPILER_PATTERN}.*\\s" + "()([^'\"\\s]*\\.${EXTENSIONS_PATTERN})(\\s.*)?[\r\n]*", // compiling unquoted file
"${COMPILER_PATTERN}.*\\s" + "(['\"])(.*\\.${EXTENSIONS_PATTERN})\\${COMPILER_GROUPS+1}(\\s.*)?[\r\n]*" // compiling quoted file "${COMPILER_PATTERN}.*\\s"
+ "(['\"])(.*\\.${EXTENSIONS_PATTERN})\\${COMPILER_GROUPS+1}(\\s.*)?[\r\n]*" // compiling quoted file
}; };
private static final int FILE_GROUP = 2; private static final int FILE_GROUP = 2;
@ -88,10 +93,9 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
private String partialLine; private String partialLine;
/** /**
* The compiler command pattern without specifying compiler options. * The compiler command pattern without specifying compiler options. The options are intended to
* The options are intended to be handled with option parsers, * be handled with option parsers, see {@link #getOptionParsers()}. This is regular expression
* see {@link #getOptionParsers()}. * pattern.
* This is regular expression pattern.
* *
* @return the compiler command pattern. * @return the compiler command pattern.
*/ */
@ -101,8 +105,9 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
/** /**
* Set compiler command pattern for the provider. See {@link #getCompilerPattern()}. * Set compiler command pattern for the provider. See {@link #getCompilerPattern()}.
* @param commandPattern - value of the command pattern to set. *
* This is regular expression pattern. * @param commandPattern
* - value of the command pattern to set. This is regular expression pattern.
*/ */
public void setCompilerPattern(String commandPattern) { public void setCompilerPattern(String commandPattern) {
setProperty(ATTR_PARAMETER, commandPattern); setProperty(ATTR_PARAMETER, commandPattern);
@ -118,11 +123,15 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
} }
/** /**
* @return resource scope of the entries, i.e. level in resource hierarchy where language settings entries * @return resource scope of the entries, i.e. level in resource hierarchy where language
* will be applied by the provider. Resource scope can be one of the following: * settings entries will be applied by the provider. Resource scope can be one of the
* <br>- {@code AbstractBuildCommandParser.ResourceScope.FILE} - apply entries to the file being parsed. * following: <br>
* <br>- {@code AbstractBuildCommandParser.ResourceScope.FOLDER} - apply entries to the enclosing folder. * - {@code AbstractBuildCommandParser.ResourceScope.FILE} - apply entries to the file
* <br>- {@code AbstractBuildCommandParser.ResourceScope.PROJECT} - apply entries to the project level. * being parsed. <br>
* - {@code AbstractBuildCommandParser.ResourceScope.FOLDER} - apply entries to the
* enclosing folder. <br>
* - {@code AbstractBuildCommandParser.ResourceScope.PROJECT} - apply entries to the
* project level.
*/ */
public ResourceScope getResourceScope() { public ResourceScope getResourceScope() {
if (resourceScope == null) { if (resourceScope == null) {
@ -141,13 +150,17 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
} }
/** /**
* Set resource scope of the entries, i.e. level in resource hierarchy where language settings entries * Set resource scope of the entries, i.e. level in resource hierarchy where language settings
* will be applied by the provider. * entries will be applied by the provider.
* *
* @param rcScope - resource scope can be one of the following: * @param rcScope
* <br>- {@code AbstractBuildCommandParser.ResourceScope.FILE} - apply entries to the file being parsed. * - resource scope can be one of the following: <br>
* <br>- {@code AbstractBuildCommandParser.ResourceScope.FOLDER} - apply entries to the enclosing folder. * - {@code AbstractBuildCommandParser.ResourceScope.FILE} - apply entries to the
* <br>- {@code AbstractBuildCommandParser.ResourceScope.PROJECT} - apply entries to the project level. * file being parsed. <br>
* - {@code AbstractBuildCommandParser.ResourceScope.FOLDER} - apply entries to the
* enclosing folder. <br>
* - {@code AbstractBuildCommandParser.ResourceScope.PROJECT} - apply entries to the
* project level.
*/ */
public void setResourceScope(ResourceScope rcScope) { public void setResourceScope(ResourceScope rcScope) {
resourceScope = rcScope; resourceScope = rcScope;
@ -187,11 +200,13 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
} }
setSettingEntries(currentCfgDescription, rc, currentLanguageId, entries); IBuildConfiguration currentConfig = Adapters.adapt(currentCfgDescription, IBuildConfiguration.class);
setSettingEntries(currentConfig, rc, currentLanguageId, entries);
} }
/** /**
* Adjust count for file group taking into consideration extra groups added by {@link #getCompilerPatternExtended()}. * Adjust count for file group taking into consideration extra groups added by
* {@link #getCompilerPatternExtended()}.
*/ */
private int adjustFileGroup() { private int adjustFileGroup() {
return countGroups(getCompilerPatternExtended()) + FILE_GROUP; return countGroups(getCompilerPatternExtended()) + FILE_GROUP;
@ -202,10 +217,9 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
*/ */
private String makePattern(String template) { private String makePattern(String template) {
@SuppressWarnings("nls") @SuppressWarnings("nls")
String pattern = template String pattern = template.replace("${COMPILER_PATTERN}", getCompilerPatternExtended())
.replace("${COMPILER_PATTERN}", getCompilerPatternExtended()) .replace("${EXTENSIONS_PATTERN}", getPatternFileExtensions()).replace("${COMPILER_GROUPS+1}",
.replace("${EXTENSIONS_PATTERN}", getPatternFileExtensions()) new Integer(countGroups(getCompilerPatternExtended()) + 1).toString());
.replace("${COMPILER_GROUPS+1}", new Integer(countGroups(getCompilerPatternExtended()) + 1).toString());
return pattern; return pattern;
} }
@ -284,8 +298,8 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
// If the character preceding the '\' is also '\', it's not a line continuation - // If the character preceding the '\' is also '\', it's not a line continuation -
// the first '\' escapes the second. // the first '\' escapes the second.
if (line.length() > 0 && line.charAt(line.length() - 1) == '\\' && if (line.length() > 0 && line.charAt(line.length() - 1) == '\\'
(line.length() == 1 || line.charAt(line.length() - 2) != '\\')) { && (line.length() == 1 || line.charAt(line.length() - 2) != '\\')) {
// Line ends in line continuation - save it for later. // Line ends in line continuation - save it for later.
String fragment = line.substring(0, line.length() - 1); String fragment = line.substring(0, line.length() - 1);
if (partialLine == null) { if (partialLine == null) {
@ -303,14 +317,18 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
} }
/** /**
* Trivial Error Parser which allows highlighting of output lines matching the patterns * Trivial Error Parser which allows highlighting of output lines matching the patterns of this
* of this parser. Intended for better troubleshooting experience. * parser. Intended for better troubleshooting experience. Implementers are supposed to add the
* Implementers are supposed to add the error parser via extension point {@code org.eclipse.cdt.core.ErrorParser}. * error parser via extension point {@code org.eclipse.cdt.core.ErrorParser}.
*/ */
protected static abstract class AbstractBuildCommandPatternHighlighter extends RegexErrorParser implements IErrorParser2 { protected static abstract class AbstractBuildCommandPatternHighlighter extends RegexErrorParser
implements IErrorParser2 {
/** /**
* Constructor. * Constructor.
* @param parserId - build command parser ID specified in the extension {@code org.eclipse.cdt.core.LanguageSettingsProvider}. *
* @param parserId
* - build command parser ID specified in the extension
* {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
*/ */
public AbstractBuildCommandPatternHighlighter(String parserId) { public AbstractBuildCommandPatternHighlighter(String parserId) {
init(parserId); init(parserId);
@ -318,16 +336,20 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
/** /**
* Initialize the error parser. * Initialize the error parser.
* @param parserId - language settings provider (the build command parser) ID. *
* @param parserId
* - language settings provider (the build command parser) ID.
*/ */
protected void init(String parserId) { protected void init(String parserId) {
AbstractBuildCommandParser buildCommandParser = (AbstractBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(parserId, false); AbstractBuildCommandParser buildCommandParser = (AbstractBuildCommandParser) LanguageSettingsManager
.getExtensionProviderCopy(parserId, false);
if (buildCommandParser != null) { if (buildCommandParser != null) {
for (String template : COMPILER_COMMAND_PATTERN_TEMPLATES) { for (String template : COMPILER_COMMAND_PATTERN_TEMPLATES) {
String pattern = buildCommandParser.makePattern(template); String pattern = buildCommandParser.makePattern(template);
String fileExpr = "$" + buildCommandParser.adjustFileGroup(); //$NON-NLS-1$ String fileExpr = "$" + buildCommandParser.adjustFileGroup(); //$NON-NLS-1$
String descExpr = "$0"; //$NON-NLS-1$ String descExpr = "$0"; //$NON-NLS-1$
addPattern(new RegexErrorPattern(pattern, fileExpr, null, descExpr, null, IMarkerGenerator.SEVERITY_WARNING, true)); addPattern(new RegexErrorPattern(pattern, fileExpr, null, descExpr, null,
IMarkerGenerator.SEVERITY_WARNING, true));
} }
} }
} }
@ -338,5 +360,4 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
} }
} }
} }

View file

@ -55,11 +55,13 @@ import org.eclipse.cdt.utils.CommandLineUtil;
import org.eclipse.cdt.utils.PathUtil; import org.eclipse.cdt.utils.PathUtil;
import org.eclipse.cdt.utils.envvar.IEnvironmentChangeEvent; import org.eclipse.cdt.utils.envvar.IEnvironmentChangeEvent;
import org.eclipse.cdt.utils.envvar.IEnvironmentChangeListener; import org.eclipse.cdt.utils.envvar.IEnvironmentChangeListener;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
@ -77,14 +79,14 @@ import org.eclipse.core.runtime.jobs.Job;
import org.w3c.dom.Element; import org.w3c.dom.Element;
/** /**
* Abstract parser capable to execute compiler command printing built-in compiler * Abstract parser capable to execute compiler command printing built-in compiler specs and parse built-in
* specs and parse built-in language settings out of it. * language settings out of it.
* <p> * <p>
* <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as * <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as it is not currently (CDT 8.1,
* it is not currently (CDT 8.1, Juno) clear how it may need to be used in future. * Juno) clear how it may need to be used in future. There is no guarantee that this API will work or that it
* There is no guarantee that this API will work or that it will remain the same. * will remain the same. Please do not use this API without consulting with the CDT team.
* Please do not use this API without consulting with the CDT team.
* </p> * </p>
*
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
* *
* @since 8.1 * @since 8.1
@ -159,12 +161,15 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
final String providerName = getName(); final String providerName = getName();
final String providerId = getId(); final String providerId = getId();
// Add markers in a job to avoid deadlocks // Add markers in a job to avoid deadlocks
Job markerJob = new Job(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.AddScannerDiscoveryMarkers")) { //$NON-NLS-1$ Job markerJob = new Job(ManagedMakeMessages
.getResourceString("AbstractBuiltinSpecsDetector.AddScannerDiscoveryMarkers")) { //$NON-NLS-1$
@Override @Override
protected IStatus run(IProgressMonitor monitor) { protected IStatus run(IProgressMonitor monitor) {
// Avoid duplicates as different languages can generate identical errors // Avoid duplicates as different languages can generate identical errors
try { try {
IMarker[] markers = problemMarkerInfo.file.findMarkers(SDMarkerGenerator.SCANNER_DISCOVERY_PROBLEM_MARKER, false, IResource.DEPTH_ZERO); IMarker[] markers = problemMarkerInfo.file.findMarkers(
SDMarkerGenerator.SCANNER_DISCOVERY_PROBLEM_MARKER, false,
IResource.DEPTH_ZERO);
for (IMarker marker : markers) { for (IMarker marker : markers) {
int sev = ((Integer) marker.getAttribute(IMarker.SEVERITY)).intValue(); int sev = ((Integer) marker.getAttribute(IMarker.SEVERITY)).intValue();
if (sev == problemMarkerInfo.severity) { if (sev == problemMarkerInfo.severity) {
@ -175,24 +180,31 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
} }
} catch (CoreException e) { } catch (CoreException e) {
return new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error checking markers.", e); //$NON-NLS-1$ return new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
"Error checking markers.", e); //$NON-NLS-1$
} }
try { try {
IMarker marker = problemMarkerInfo.file.createMarker(SDMarkerGenerator.SCANNER_DISCOVERY_PROBLEM_MARKER); IMarker marker = problemMarkerInfo.file
.createMarker(SDMarkerGenerator.SCANNER_DISCOVERY_PROBLEM_MARKER);
marker.setAttribute(IMarker.MESSAGE, problemMarkerInfo.description); marker.setAttribute(IMarker.MESSAGE, problemMarkerInfo.description);
marker.setAttribute(IMarker.SEVERITY, problemMarkerInfo.severity); marker.setAttribute(IMarker.SEVERITY, problemMarkerInfo.severity);
marker.setAttribute(SDMarkerGenerator.ATTR_PROVIDER, providerId); marker.setAttribute(SDMarkerGenerator.ATTR_PROVIDER, providerId);
if (problemMarkerInfo.file instanceof IWorkspaceRoot) { if (problemMarkerInfo.file instanceof IWorkspaceRoot) {
String msgPreferences = ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationPreferences", providerName); //$NON-NLS-1$ String msgPreferences = ManagedMakeMessages.getFormattedString(
"AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationPreferences", //$NON-NLS-1$
providerName);
marker.setAttribute(IMarker.LOCATION, msgPreferences); marker.setAttribute(IMarker.LOCATION, msgPreferences);
} else { } else {
String msgProperties = ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationProperties", providerName); //$NON-NLS-1$ String msgProperties = ManagedMakeMessages.getFormattedString(
"AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationProperties", //$NON-NLS-1$
providerName);
marker.setAttribute(IMarker.LOCATION, msgProperties); marker.setAttribute(IMarker.LOCATION, msgProperties);
} }
} catch (CoreException e) { } catch (CoreException e) {
return new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error adding markers.", e); //$NON-NLS-1$ return new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
"Error adding markers.", e); //$NON-NLS-1$
} }
return Status.OK_STATUS; return Status.OK_STATUS;
@ -206,19 +218,22 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Delete markers previously set by this provider for the resource. * Delete markers previously set by this provider for the resource.
* *
* @param rc - resource to check markers. * @param rc
* - resource to check markers.
*/ */
public void deleteMarkers(IResource rc) { public void deleteMarkers(IResource rc) {
String providerId = getId(); String providerId = getId();
try { try {
IMarker[] markers = rc.findMarkers(SCANNER_DISCOVERY_PROBLEM_MARKER, false, IResource.DEPTH_ZERO); IMarker[] markers = rc.findMarkers(SCANNER_DISCOVERY_PROBLEM_MARKER, false,
IResource.DEPTH_ZERO);
for (IMarker marker : markers) { for (IMarker marker : markers) {
if (providerId.equals(marker.getAttribute(ATTR_PROVIDER))) { if (providerId.equals(marker.getAttribute(ATTR_PROVIDER))) {
marker.delete(); marker.delete();
} }
} }
} catch (CoreException e) { } catch (CoreException e) {
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error deleting markers.", e)); //$NON-NLS-1$ ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
"Error deleting markers.", e)); //$NON-NLS-1$
} }
} }
@ -229,13 +244,16 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
*/ */
private class ConsoleParserAdapter implements ICBuildOutputParser { private class ConsoleParserAdapter implements ICBuildOutputParser {
@Override @Override
public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker) throws CoreException { public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker)
throws CoreException {
AbstractBuiltinSpecsDetector.this.cwdTracker = cwdTracker; AbstractBuiltinSpecsDetector.this.cwdTracker = cwdTracker;
} }
@Override @Override
public boolean processLine(String line) { public boolean processLine(String line) {
return AbstractBuiltinSpecsDetector.this.processLine(line); return AbstractBuiltinSpecsDetector.this.processLine(line);
} }
@Override @Override
public void shutdown() { public void shutdown() {
AbstractBuiltinSpecsDetector.this.cwdTracker = null; AbstractBuiltinSpecsDetector.this.cwdTracker = null;
@ -243,11 +261,12 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
/** /**
* Compiler command without arguments. This value is used to replace macro ${COMMAND}. * Compiler command without arguments. This value is used to replace macro ${COMMAND}. In particular, this
* In particular, this method is implemented in {@link ToolchainBuiltinSpecsDetector} * method is implemented in {@link ToolchainBuiltinSpecsDetector} which retrieves the command from
* which retrieves the command from tool-chain. * tool-chain.
* *
* @param languageId - language ID. * @param languageId
* - language ID.
* @return compiler command without arguments, i.e. compiler program. * @return compiler command without arguments, i.e. compiler program.
*/ */
protected abstract String getCompilerCommand(String languageId); protected abstract String getCompilerCommand(String languageId);
@ -255,13 +274,12 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* The command to run. Some macros could be specified in there: * The command to run. Some macros could be specified in there:
* <ul> * <ul>
* <b>${COMMAND}</b> - compiler command without arguments (compiler program). * <b>${COMMAND}</b> - compiler command without arguments (compiler program). Normally would come from the
* Normally would come from the tool-chain.<br> * tool-chain.<br>
* <b>${INPUTS}</b> - path to spec file which will be placed in workspace area.<br> * <b>${INPUTS}</b> - path to spec file which will be placed in workspace area.<br>
* <b>${EXT}</b> - file extension calculated from language ID. * <b>${EXT}</b> - file extension calculated from language ID.
* </ul> * </ul>
* The parameter could be taken from the extension * The parameter could be taken from the extension in {@code plugin.xml} or from property file.
* in {@code plugin.xml} or from property file.
* *
* @return the command to run or empty string if command is not defined. * @return the command to run or empty string if command is not defined.
*/ */
@ -271,7 +289,9 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Set custom command for the provider. See {@link #getCommand()}. * Set custom command for the provider. See {@link #getCommand()}.
* @param command - value of custom command to set. *
* @param command
* - value of custom command to set.
*/ */
public void setCommand(String command) { public void setCommand(String command) {
setProperty(ATTR_PARAMETER, command); setProperty(ATTR_PARAMETER, command);
@ -287,19 +307,22 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Enable or disable console output for this provider. * Enable or disable console output for this provider.
* *
* @param enable - {@code true} to enable console output or {@code false} to disable. * @param enable
* - {@code true} to enable console output or {@code false} to disable.
*/ */
public void setConsoleEnabled(boolean enable) { public void setConsoleEnabled(boolean enable) {
isConsoleEnabled = enable; isConsoleEnabled = enable;
} }
/** /**
* Expand macros specified in the compiler command. See {@link #getCommand()} for * Expand macros specified in the compiler command. See {@link #getCommand()} for the recognized list of
* the recognized list of macros. * macros.
* *
* @param languageId - language ID. * @param languageId
* - language ID.
* @return - resolved command to run. * @return - resolved command to run.
* @throws CoreException if something goes wrong. * @throws CoreException
* if something goes wrong.
*/ */
protected String resolveCommand(String languageId) throws CoreException { protected String resolveCommand(String languageId) throws CoreException {
String cmd = getCommand(); String cmd = getCommand();
@ -388,7 +411,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
@Override @Override
public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker) throws CoreException { public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker)
throws CoreException {
super.startup(cfgDescription, cwdTracker); super.startup(cfgDescription, cwdTracker);
mappedRootURI = null; mappedRootURI = null;
@ -433,7 +457,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
if (location != null) { if (location != null) {
java.io.File file = new java.io.File(location.toString()); java.io.File file = new java.io.File(location.toString());
try { try {
// handles symbolic links as java.io.File.getCanonicalPath() resolves symlinks on UNIX // handles symbolic links as java.io.File.getCanonicalPath() resolves symlinks on
// UNIX
file = file.getCanonicalFile(); file = file.getCanonicalFile();
} catch (IOException e) { } catch (IOException e) {
ManagedBuilderCorePlugin.log(e); ManagedBuilderCorePlugin.log(e);
@ -451,12 +476,10 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
/** /**
* This method does 2 related things: * This method does 2 related things: <br>
* <br> * 1. Validate environment, i.e. check that environment for running the command has not changed. If
* 1. Validate environment, i.e. check that environment for running the command has not changed. * environment changed {@link #execute()} will rerun the command even if flag {@link #isExecuted} suggests
* If environment changed {@link #execute()} will rerun the command even if flag {@link #isExecuted} * that it was run already. <br>
* suggests that it was run already.
* <br>
* 2. The relevant environment is cached here so the new one is validated against it at the next call. * 2. The relevant environment is cached here so the new one is validated against it at the next call.
* {@link #validateEnvironment()} will be called right before running the job to execute the command. * {@link #validateEnvironment()} will be called right before running the job to execute the command.
* *
@ -473,8 +496,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
/** /**
* Execute provider's command which is expected to print built-in compiler options (specs) to build output. * Execute provider's command which is expected to print built-in compiler options (specs) to build
* The parser will parse output and generate language settings for corresponding resources. * output. The parser will parse output and generate language settings for corresponding resources.
*/ */
protected void execute() { protected void execute() {
environmentMap = createEnvironmentMap(currentCfgDescription); environmentMap = createEnvironmentMap(currentCfgDescription);
@ -482,7 +505,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return; return;
} }
WorkspaceJob job = new WorkspaceJob(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.DiscoverBuiltInSettingsJobName")) { //$NON-NLS-1$ WorkspaceJob job = new WorkspaceJob(ManagedMakeMessages
.getResourceString("AbstractBuiltinSpecsDetector.DiscoverBuiltInSettingsJobName")) { //$NON-NLS-1$
@Override @Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
isExecuted = false; isExecuted = false;
@ -496,7 +520,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
status = runForEachLanguage(monitor); status = runForEachLanguage(monitor);
} catch (CoreException e) { } catch (CoreException e) {
ManagedBuilderCorePlugin.log(e); ManagedBuilderCorePlugin.log(e);
status = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e); //$NON-NLS-1$ status = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR,
"Error running Builtin Specs Detector", e); //$NON-NLS-1$
} finally { } finally {
isExecuted = true; isExecuted = true;
shutdown(); shutdown();
@ -504,6 +529,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return status; return status;
} }
@Override @Override
public boolean belongsTo(Object family) { public boolean belongsTo(Object family) {
return family == JOB_FAMILY_BUILTIN_SPECS_DETECTOR; return family == JOB_FAMILY_BUILTIN_SPECS_DETECTOR;
@ -527,12 +553,14 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Run built-in specs command for each language. * Run built-in specs command for each language.
* *
* @param monitor - progress monitor in the initial state where {@link IProgressMonitor#beginTask(String, int)} * @param monitor
* has not been called yet. * - progress monitor in the initial state where
* {@link IProgressMonitor#beginTask(String, int)} has not been called yet.
* @return status of operation. * @return status of operation.
*/ */
protected IStatus runForEachLanguage(IProgressMonitor monitor) { protected IStatus runForEachLanguage(IProgressMonitor monitor) {
MultiStatus status = new MultiStatus(ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.OK, "Problem running CDT Scanner Discovery provider " + getId(), null); //$NON-NLS-1$ MultiStatus status = new MultiStatus(ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.OK,
"Problem running CDT Scanner Discovery provider " + getId(), null); //$NON-NLS-1$
if (monitor == null) { if (monitor == null) {
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
@ -543,32 +571,44 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
List<String> languageIds = getLanguageScope(); List<String> languageIds = getLanguageScope();
if (languageIds != null) { if (languageIds != null) {
monitor.beginTask(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.ScannerDiscoveryTaskTitle"), //$NON-NLS-1$ monitor.beginTask(
TICKS_REMOVE_MARKERS + languageIds.size()*TICKS_RUN_FOR_ONE_LANGUAGE + TICKS_SERIALIZATION); ManagedMakeMessages
.getResourceString("AbstractBuiltinSpecsDetector.ScannerDiscoveryTaskTitle"), //$NON-NLS-1$
TICKS_REMOVE_MARKERS + languageIds.size() * TICKS_RUN_FOR_ONE_LANGUAGE
+ TICKS_SERIALIZATION);
IResource markersResource = currentProject != null ? currentProject : ResourcesPlugin.getWorkspace().getRoot(); IResource markersResource = currentProject != null ? currentProject
: ResourcesPlugin.getWorkspace().getRoot();
monitor.subTask(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ClearingMarkers", markersResource.getFullPath().toString())); //$NON-NLS-1$ monitor.subTask(
ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ClearingMarkers", //$NON-NLS-1$
markersResource.getFullPath().toString()));
markerGenerator.deleteMarkers(markersResource); markerGenerator.deleteMarkers(markersResource);
if (monitor.isCanceled()) if (monitor.isCanceled())
throw new OperationCanceledException(); throw new OperationCanceledException();
monitor.worked(TICKS_REMOVE_MARKERS); monitor.worked(TICKS_REMOVE_MARKERS);
IBuildConfiguration currentConfig = Adapters.adapt(currentCfgDescription,
IBuildConfiguration.class);
for (String languageId : languageIds) { for (String languageId : languageIds) {
List<ICLanguageSettingEntry> oldEntries = getSettingEntries(currentCfgDescription, null, languageId); List<ICLanguageSettingEntry> oldEntries = getSettingEntries(currentConfig, null,
languageId);
try { try {
startupForLanguage(languageId); startupForLanguage(languageId);
runForLanguage(new SubProgressMonitor(monitor, TICKS_RUN_FOR_ONE_LANGUAGE)); runForLanguage(new SubProgressMonitor(monitor, TICKS_RUN_FOR_ONE_LANGUAGE));
} catch (Exception e) { } catch (Exception e) {
IStatus s = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e); //$NON-NLS-1$ IStatus s = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
IStatus.ERROR, "Error running Builtin Specs Detector", e); //$NON-NLS-1$
ManagedBuilderCorePlugin.log(s); ManagedBuilderCorePlugin.log(s);
status.merge(s); status.merge(s);
} finally { } finally {
shutdownForLanguage(); shutdownForLanguage();
} }
if (!isChanged) { if (!isChanged) {
List<ICLanguageSettingEntry> newEntries = getSettingEntries(currentCfgDescription, null, languageId); List<ICLanguageSettingEntry> newEntries = getSettingEntries(currentConfig, null,
languageId);
isChanged = newEntries != oldEntries; isChanged = newEntries != oldEntries;
} }
@ -577,7 +617,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
} }
monitor.subTask(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.SerializingResults")); //$NON-NLS-1$ monitor.subTask(
ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.SerializingResults")); //$NON-NLS-1$
if (isChanged) { // avoids resource and settings change notifications if (isChanged) { // avoids resource and settings change notifications
IStatus s = serializeLanguageSettings(currentCfgDescription); IStatus s = serializeLanguageSettings(currentCfgDescription);
status.merge(s); status.merge(s);
@ -587,7 +628,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} catch (OperationCanceledException e) { } catch (OperationCanceledException e) {
// user chose to cancel operation, do not threaten them with red error signs // user chose to cancel operation, do not threaten them with red error signs
} catch (Exception e) { } catch (Exception e) {
status.merge(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e)); //$NON-NLS-1$ status.merge(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR,
"Error running Builtin Specs Detector", e)); //$NON-NLS-1$
ManagedBuilderCorePlugin.log(status); ManagedBuilderCorePlugin.log(status);
} finally { } finally {
monitor.done(); monitor.done();
@ -599,8 +641,10 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Initialize provider before running for a language. * Initialize provider before running for a language.
* *
* @param languageId - language ID. * @param languageId
* @throws CoreException if something goes wrong. * - language ID.
* @throws CoreException
* if something goes wrong.
*/ */
protected void startupForLanguage(String languageId) throws CoreException { protected void startupForLanguage(String languageId) throws CoreException {
currentLanguageId = languageId; currentLanguageId = languageId;
@ -618,7 +662,9 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
protected void shutdownForLanguage() { protected void shutdownForLanguage() {
if (detectedSettingEntries != null && detectedSettingEntries.size() > 0) { if (detectedSettingEntries != null && detectedSettingEntries.size() > 0) {
collected = detectedSettingEntries.size(); collected = detectedSettingEntries.size();
setSettingEntries(currentCfgDescription, currentResource, currentLanguageId, detectedSettingEntries); IBuildConfiguration currentConfig = Adapters.adapt(currentCfgDescription,
IBuildConfiguration.class);
setSettingEntries(currentConfig, currentResource, currentLanguageId, detectedSettingEntries);
} }
detectedSettingEntries = null; detectedSettingEntries = null;
@ -634,8 +680,9 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Run built-in specs command for one language. * Run built-in specs command for one language.
* *
* @param monitor - progress monitor in the initial state where {@link IProgressMonitor#beginTask(String, int)} * @param monitor
* has not been called yet. * - progress monitor in the initial state where
* {@link IProgressMonitor#beginTask(String, int)} has not been called yet.
*/ */
private void runForLanguage(IProgressMonitor monitor) throws CoreException { private void runForLanguage(IProgressMonitor monitor) throws CoreException {
buildRunnerHelper = new BuildRunnerHelper(currentProject); buildRunnerHelper = new BuildRunnerHelper(currentProject);
@ -644,7 +691,9 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
} }
try { try {
monitor.beginTask(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName()), //$NON-NLS-1$ monitor.beginTask(
ManagedMakeMessages.getFormattedString(
"AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName()), //$NON-NLS-1$
TICKS_EXECUTE_COMMAND + TICKS_OUTPUT_PARSING); TICKS_EXECUTE_COMMAND + TICKS_OUTPUT_PARSING);
IConsole console; IConsole console;
@ -652,7 +701,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
console = startProviderConsole(); console = startProviderConsole();
} else { } else {
// that looks in extension points registry and won't find the id, this console is not shown // that looks in extension points registry and won't find the id, this console is not shown
console = CCorePlugin.getDefault().getConsole(ManagedBuilderCorePlugin.PLUGIN_ID + ".console.hidden"); //$NON-NLS-1$ console = CCorePlugin.getDefault()
.getConsole(ManagedBuilderCorePlugin.PLUGIN_ID + ".console.hidden"); //$NON-NLS-1$
} }
console.start(currentProject); console.start(currentProject);
@ -673,27 +723,32 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
String[] envp = toEnvp(environmentMap); String[] envp = toEnvp(environmentMap);
// Using GMAKE_ERROR_PARSER_ID as it can handle generated error messages // Using GMAKE_ERROR_PARSER_ID as it can handle generated error messages
ErrorParserManager epm = new ErrorParserManager(currentProject, buildDirURI, markerGenerator, new String[] {GMAKE_ERROR_PARSER_ID}); ErrorParserManager epm = new ErrorParserManager(currentProject, buildDirURI, markerGenerator,
new String[] { GMAKE_ERROR_PARSER_ID });
ConsoleParserAdapter consoleParser = new ConsoleParserAdapter(); ConsoleParserAdapter consoleParser = new ConsoleParserAdapter();
consoleParser.startup(currentCfgDescription, epm); consoleParser.startup(currentCfgDescription, epm);
List<IConsoleParser> parsers = new ArrayList<IConsoleParser>(); List<IConsoleParser> parsers = new ArrayList<IConsoleParser>();
parsers.add(consoleParser); parsers.add(consoleParser);
buildRunnerHelper.setLaunchParameters(launcher, program, args, buildDirURI, envp); buildRunnerHelper.setLaunchParameters(launcher, program, args, buildDirURI, envp);
buildRunnerHelper.prepareStreams(epm, parsers, console, new SubProgressMonitor(monitor, TICKS_OUTPUT_PARSING)); buildRunnerHelper.prepareStreams(epm, parsers, console,
new SubProgressMonitor(monitor, TICKS_OUTPUT_PARSING));
buildRunnerHelper.greeting(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName())); //$NON-NLS-1$ buildRunnerHelper.greeting(ManagedMakeMessages
.getFormattedString("AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName())); //$NON-NLS-1$
OutputStream outStream = buildRunnerHelper.getOutputStream(); OutputStream outStream = buildRunnerHelper.getOutputStream();
OutputStream errStream = buildRunnerHelper.getErrorStream(); OutputStream errStream = buildRunnerHelper.getErrorStream();
runProgramForLanguage(currentLanguageId, currentCommandResolved, envp, buildDirURI, outStream, errStream, runProgramForLanguage(currentLanguageId, currentCommandResolved, envp, buildDirURI, outStream,
new SubProgressMonitor(monitor, TICKS_EXECUTE_COMMAND, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); errStream, new SubProgressMonitor(monitor, TICKS_EXECUTE_COMMAND,
SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
buildRunnerHelper.close(); buildRunnerHelper.close();
buildRunnerHelper.goodbye(); buildRunnerHelper.goodbye();
} catch (Exception e) { } catch (Exception e) {
ManagedBuilderCorePlugin.log(new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error running Builtin Specs Detector" , e))); //$NON-NLS-1$ ManagedBuilderCorePlugin.log(new CoreException(new Status(IStatus.ERROR,
ManagedBuilderCorePlugin.PLUGIN_ID, "Error running Builtin Specs Detector", e))); //$NON-NLS-1$
} finally { } finally {
try { try {
buildRunnerHelper.close(); buildRunnerHelper.close();
@ -705,8 +760,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
/** /**
* Returns list of environment variables to be used during execution of provider's command. * Returns list of environment variables to be used during execution of provider's command. Implementers
* Implementers are expected to add their variables to the end of the list. * are expected to add their variables to the end of the list.
* *
* @return list of environment variables. * @return list of environment variables.
* @since 8.2 * @since 8.2
@ -715,7 +770,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
if (envMngr == null) { if (envMngr == null) {
envMngr = CCorePlugin.getDefault().getBuildEnvironmentManager(); envMngr = CCorePlugin.getDefault().getBuildEnvironmentManager();
} }
List<IEnvironmentVariable> vars = new ArrayList<IEnvironmentVariable>(Arrays.asList(envMngr.getVariables(currentCfgDescription, true))); List<IEnvironmentVariable> vars = new ArrayList<IEnvironmentVariable>(
Arrays.asList(envMngr.getVariables(currentCfgDescription, true)));
// On POSIX (Linux, UNIX) systems reset language variables to default (English) // On POSIX (Linux, UNIX) systems reset language variables to default (English)
// with UTF-8 encoding since GNU compilers can handle only UTF-8 characters. // with UTF-8 encoding since GNU compilers can handle only UTF-8 characters.
@ -755,7 +811,9 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return envp.toArray(new String[envp.size()]); return envp.toArray(new String[envp.size()]);
} }
protected int runProgramForLanguage(String languageId, String command, String[] envp, URI workingDirectoryURI, OutputStream consoleOut, OutputStream consoleErr, IProgressMonitor monitor) throws CoreException, IOException { protected int runProgramForLanguage(String languageId, String command, String[] envp,
URI workingDirectoryURI, OutputStream consoleOut, OutputStream consoleErr,
IProgressMonitor monitor) throws CoreException, IOException {
return buildRunnerHelper.build(monitor); return buildRunnerHelper.build(monitor);
} }
@ -774,6 +832,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/** /**
* Create and start the provider console. * Create and start the provider console.
*
* @return CDT console. * @return CDT console.
*/ */
private IConsole startProviderConsole() { private IConsole startProviderConsole() {
@ -788,32 +847,39 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
ILanguage ld = LanguageManager.getInstance().getLanguage(currentLanguageId); ILanguage ld = LanguageManager.getInstance().getLanguage(currentLanguageId);
if (ld != null) { if (ld != null) {
String consoleId = ManagedBuilderCorePlugin.PLUGIN_ID + '.' + getId() + '.' + currentLanguageId; String consoleId = ManagedBuilderCorePlugin.PLUGIN_ID + '.' + getId() + '.'
+ currentLanguageId;
String consoleName = getName() + ", " + ld.getName(); //$NON-NLS-1$ String consoleName = getName() + ", " + ld.getName(); //$NON-NLS-1$
URL defaultIcon = Platform.getBundle(CDT_MANAGEDBUILDER_UI_PLUGIN_ID).getEntry(DEFAULT_CONSOLE_ICON); URL defaultIcon = Platform.getBundle(CDT_MANAGEDBUILDER_UI_PLUGIN_ID)
.getEntry(DEFAULT_CONSOLE_ICON);
if (defaultIcon == null) { if (defaultIcon == null) {
@SuppressWarnings("nls") @SuppressWarnings("nls")
String msg = "Unable to find icon " + DEFAULT_CONSOLE_ICON + " in plugin " + CDT_MANAGEDBUILDER_UI_PLUGIN_ID; String msg = "Unable to find icon " + DEFAULT_CONSOLE_ICON + " in plugin "
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg)); + CDT_MANAGEDBUILDER_UI_PLUGIN_ID;
ManagedBuilderCorePlugin
.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg));
} }
console = CCorePlugin.getDefault().getConsole(extConsoleId, consoleId, consoleName, defaultIcon); console = CCorePlugin.getDefault().getConsole(extConsoleId, consoleId, consoleName,
defaultIcon);
} }
} }
if (console == null) { if (console == null) {
// that looks in extension points registry and won't find the id, this console is not shown // that looks in extension points registry and won't find the id, this console is not shown
console = CCorePlugin.getDefault().getConsole(ManagedBuilderCorePlugin.PLUGIN_ID + ".console.hidden"); //$NON-NLS-1$ console = CCorePlugin.getDefault()
.getConsole(ManagedBuilderCorePlugin.PLUGIN_ID + ".console.hidden"); //$NON-NLS-1$
} }
return console; return console;
} }
/** /**
* Get path to spec file which normally would be placed in workspace area. * Get path to spec file which normally would be placed in workspace area. This value is used to replace
* This value is used to replace macro ${INPUTS}. * macro ${INPUTS}.
* *
* @param languageId - language ID. * @param languageId
* - language ID.
* @return full path to the specs file. * @return full path to the specs file.
*/ */
protected String getSpecFile(String languageId) { protected String getSpecFile(String languageId) {
@ -843,11 +909,12 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
/** /**
* Determine file extension by language id. This implementation retrieves first extension * Determine file extension by language id. This implementation retrieves first extension from the list as
* from the list as there could be multiple extensions associated with the given language. * there could be multiple extensions associated with the given language. This value is used to replace
* This value is used to replace macro ${EXT}. * macro ${EXT}.
* *
* @param languageId - given language ID. * @param languageId
* - given language ID.
* @return file extension associated with the language or {@code null} if not found. * @return file extension associated with the language or {@code null} if not found.
*/ */
protected String getSpecFileExtension(String languageId) { protected String getSpecFileExtension(String languageId) {
@ -864,16 +931,18 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} }
if (ext == null) { if (ext == null) {
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Unable to find file extension for language " + languageId)); //$NON-NLS-1$ ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
"Unable to find file extension for language " + languageId)); //$NON-NLS-1$
} }
return ext; return ext;
} }
/** /**
* Determine additional options to pass to scanner discovery command. * Determine additional options to pass to scanner discovery command. These options are intended to come
* These options are intended to come from the tool-chain. * from the tool-chain.
* *
* @param languageId - language ID. * @param languageId
* - language ID.
* @return additional options to pass to scanner discovery command. * @return additional options to pass to scanner discovery command.
* *
* @since 8.3 * @since 8.3
@ -907,7 +976,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
try { try {
envPathHash = Long.parseLong(envPathHashStr); envPathHash = Long.parseLong(envPathHashStr);
} catch (Exception e) { } catch (Exception e) {
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Wrong integer format [" + envPathHashStr + "]", e)); //$NON-NLS-1$ //$NON-NLS-2$ ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID,
"Wrong integer format [" + envPathHashStr + "]", e)); //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
} }

View file

@ -42,12 +42,14 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.utils.EFSExtensionManager; import org.eclipse.cdt.utils.EFSExtensionManager;
import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver;
import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
@ -61,19 +63,22 @@ import org.w3c.dom.Element;
/** /**
* Abstract class for language settings providers capable to parse build output. * Abstract class for language settings providers capable to parse build output.
* <p> * <p>
* <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as * <strong>EXPERIMENTAL</strong>. This class interface is not stable yet as it is not currently (CDT
* it is not currently (CDT 8.1, Juno) clear how it may need to be used in future. * 8.1, Juno) clear how it may need to be used in future. There is no guarantee that this API will
* There is no guarantee that this API will work or that it will remain the same. * work or that it will remain the same. Please do not use this API without consulting with the CDT
* Please do not use this API without consulting with the CDT team. * team.
* </p> * </p>
*
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
* *
* @since 8.1 * @since 8.1
*/ */
public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSettingsSerializableProvider implements ICBuildOutputParser { public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSettingsSerializableProvider
implements ICBuildOutputParser {
protected static final String ATTR_KEEP_RELATIVE_PATHS = "keep-relative-paths"; //$NON-NLS-1$ protected static final String ATTR_KEEP_RELATIVE_PATHS = "keep-relative-paths"; //$NON-NLS-1$
// evaluates to "/${ProjName)/" // evaluates to "/${ProjName)/"
private static final String PROJ_NAME_PREFIX = '/' + CdtVariableResolver.createVariableReference(CdtVariableResolver.VAR_PROJ_NAME) + '/'; private static final String PROJ_NAME_PREFIX = '/'
+ CdtVariableResolver.createVariableReference(CdtVariableResolver.VAR_PROJ_NAME) + '/';
protected ICConfigurationDescription currentCfgDescription = null; protected ICConfigurationDescription currentCfgDescription = null;
protected IWorkingDirectoryTracker cwdTracker = null; protected IWorkingDirectoryTracker cwdTracker = null;
@ -89,26 +94,32 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
private static final EFSExtensionProvider efsProviderDefault = new EFSExtensionProvider() { private static final EFSExtensionProvider efsProviderDefault = new EFSExtensionProvider() {
final EFSExtensionManager efsManager = EFSExtensionManager.getDefault(); final EFSExtensionManager efsManager = EFSExtensionManager.getDefault();
@Override @Override
public String getPathFromURI(URI locationURI) { public String getPathFromURI(URI locationURI) {
return efsManager.getPathFromURI(locationURI); return efsManager.getPathFromURI(locationURI);
} }
@Override @Override
public URI getLinkedURI(URI locationURI) { public URI getLinkedURI(URI locationURI) {
return efsManager.getLinkedURI(locationURI); return efsManager.getLinkedURI(locationURI);
} }
@Override @Override
public URI createNewURIFromPath(URI locationOnSameFilesystem, String path) { public URI createNewURIFromPath(URI locationOnSameFilesystem, String path) {
return efsManager.createNewURIFromPath(locationOnSameFilesystem, path); return efsManager.createNewURIFromPath(locationOnSameFilesystem, path);
} }
@Override @Override
public String getMappedPath(URI locationURI) { public String getMappedPath(URI locationURI) {
return efsManager.getMappedPath(locationURI); return efsManager.getMappedPath(locationURI);
} }
@Override @Override
public boolean isVirtual(URI locationURI) { public boolean isVirtual(URI locationURI) {
return efsManager.isVirtual(locationURI); return efsManager.isVirtual(locationURI);
} }
@Override @Override
public URI append(URI baseURI, String extension) { public URI append(URI baseURI, String extension) {
return efsManager.append(baseURI, extension); return efsManager.append(baseURI, extension);
@ -116,9 +127,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
}; };
/** /**
* Abstract class defining common functionality for option parsers. * Abstract class defining common functionality for option parsers. The purpose of this parser
* The purpose of this parser is to parse a portion of string representing * is to parse a portion of string representing a single option and create a language settings
* a single option and create a language settings entry out of it. * entry out of it.
* *
* See {@link GCCBuildCommandParser} for an example how to define the parsers. * See {@link GCCBuildCommandParser} for an example how to define the parsers.
*/ */
@ -136,13 +147,19 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Constructor. * Constructor.
* *
* @param kind - kind of language settings entries being parsed by the parser. * @param kind
* @param pattern - regular expression pattern being parsed by the parser. * - kind of language settings entries being parsed by the parser.
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param valueExpression - capturing group expression defining value of an entry. * - regular expression pattern being parsed by the parser.
* @param extraFlag - extra-flag to add while creating language settings entry. * @param nameExpression
* - capturing group expression defining name of an entry.
* @param valueExpression
* - capturing group expression defining value of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public AbstractOptionParser(int kind, String pattern, String nameExpression, String valueExpression, int extraFlag) { public AbstractOptionParser(int kind, String pattern, String nameExpression, String valueExpression,
int extraFlag) {
this.kind = kind; this.kind = kind;
this.patternStr = pattern; this.patternStr = pattern;
this.nameExpression = nameExpression; this.nameExpression = nameExpression;
@ -153,11 +170,16 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Create language settings entry of appropriate kind and considering extra-flag passed in constructor. * Create language settings entry of appropriate kind and considering extra-flag passed in
* constructor.
* *
* @param name - name of language settings entry. * @param name
* @param value - value of language settings entry. * - name of language settings entry.
* @param flag - flag to set. Note that the flag will be amended with the extra-flag defined in constructor. * @param value
* - value of language settings entry.
* @param flag
* - flag to set. Note that the flag will be amended with the extra-flag defined
* in constructor.
* @return new language settings entry. * @return new language settings entry.
*/ */
public ICLanguageSettingEntry createEntry(String name, String value, int flag) { public ICLanguageSettingEntry createEntry(String name, String value, int flag) {
@ -192,12 +214,13 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Test for a match and parse a portion of input string representing a single option * Test for a match and parse a portion of input string representing a single option to
* to retrieve name and value. * retrieve name and value.
* *
* @param optionString - an option to test and parse, possibly with an argument. * @param optionString
* @return {@code true} if the option is a match to parser's regular expression * - an option to test and parse, possibly with an argument.
* or {@code false} otherwise. * @return {@code true} if the option is a match to parser's regular expression or
* {@code false} otherwise.
*/ */
public boolean parseOption(String optionString) { public boolean parseOption(String optionString) {
// get rid of extra text at the end (for example file name could be confused for an argument) // get rid of extra text at the end (for example file name could be confused for an argument)
@ -221,6 +244,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
public IncludePathOptionParser(String pattern, String nameExpression) { public IncludePathOptionParser(String pattern, String nameExpression) {
super(ICLanguageSettingEntry.INCLUDE_PATH, pattern, nameExpression, nameExpression, 0); super(ICLanguageSettingEntry.INCLUDE_PATH, pattern, nameExpression, nameExpression, 0);
} }
public IncludePathOptionParser(String pattern, String nameExpression, int extraFlag) { public IncludePathOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.INCLUDE_PATH, pattern, nameExpression, nameExpression, extraFlag); super(ICLanguageSettingEntry.INCLUDE_PATH, pattern, nameExpression, nameExpression, extraFlag);
} }
@ -232,17 +256,25 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
protected static class IncludeFileOptionParser extends AbstractOptionParser { protected static class IncludeFileOptionParser extends AbstractOptionParser {
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
*/ */
public IncludeFileOptionParser(String pattern, String nameExpression) { public IncludeFileOptionParser(String pattern, String nameExpression) {
super(ICLanguageSettingEntry.INCLUDE_FILE, pattern, nameExpression, nameExpression, 0); super(ICLanguageSettingEntry.INCLUDE_FILE, pattern, nameExpression, nameExpression, 0);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param extraFlag - extra-flag to add while creating language settings entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public IncludeFileOptionParser(String pattern, String nameExpression, int extraFlag) { public IncludeFileOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.INCLUDE_FILE, pattern, nameExpression, nameExpression, extraFlag); super(ICLanguageSettingEntry.INCLUDE_FILE, pattern, nameExpression, nameExpression, extraFlag);
@ -255,28 +287,44 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
protected static class MacroOptionParser extends AbstractOptionParser { protected static class MacroOptionParser extends AbstractOptionParser {
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param valueExpression - capturing group expression defining value of an entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param valueExpression
* - capturing group expression defining value of an entry.
*/ */
public MacroOptionParser(String pattern, String nameExpression, String valueExpression) { public MacroOptionParser(String pattern, String nameExpression, String valueExpression) {
super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, valueExpression, 0); super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, valueExpression, 0);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param valueExpression - capturing group expression defining value of an entry. * - regular expression pattern being parsed by the parser.
* @param extraFlag - extra-flag to add while creating language settings entry. * @param nameExpression
* - capturing group expression defining name of an entry.
* @param valueExpression
* - capturing group expression defining value of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public MacroOptionParser(String pattern, String nameExpression, String valueExpression, int extraFlag) { public MacroOptionParser(String pattern, String nameExpression, String valueExpression,
int extraFlag) {
super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, valueExpression, extraFlag); super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, valueExpression, extraFlag);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param extraFlag - extra-flag to add while creating language settings entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public MacroOptionParser(String pattern, String nameExpression, int extraFlag) { public MacroOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, null, extraFlag); super(ICLanguageSettingEntry.MACRO, pattern, nameExpression, null, extraFlag);
@ -289,17 +337,25 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
protected static class MacroFileOptionParser extends AbstractOptionParser { protected static class MacroFileOptionParser extends AbstractOptionParser {
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
*/ */
public MacroFileOptionParser(String pattern, String nameExpression) { public MacroFileOptionParser(String pattern, String nameExpression) {
super(ICLanguageSettingEntry.MACRO_FILE, pattern, nameExpression, nameExpression, 0); super(ICLanguageSettingEntry.MACRO_FILE, pattern, nameExpression, nameExpression, 0);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param extraFlag - extra-flag to add while creating language settings entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public MacroFileOptionParser(String pattern, String nameExpression, int extraFlag) { public MacroFileOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.MACRO_FILE, pattern, nameExpression, nameExpression, extraFlag); super(ICLanguageSettingEntry.MACRO_FILE, pattern, nameExpression, nameExpression, extraFlag);
@ -312,17 +368,25 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
protected static class LibraryPathOptionParser extends AbstractOptionParser { protected static class LibraryPathOptionParser extends AbstractOptionParser {
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
*/ */
public LibraryPathOptionParser(String pattern, String nameExpression) { public LibraryPathOptionParser(String pattern, String nameExpression) {
super(ICLanguageSettingEntry.LIBRARY_PATH, pattern, nameExpression, nameExpression, 0); super(ICLanguageSettingEntry.LIBRARY_PATH, pattern, nameExpression, nameExpression, 0);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param extraFlag - extra-flag to add while creating language settings entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public LibraryPathOptionParser(String pattern, String nameExpression, int extraFlag) { public LibraryPathOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.LIBRARY_PATH, pattern, nameExpression, nameExpression, extraFlag); super(ICLanguageSettingEntry.LIBRARY_PATH, pattern, nameExpression, nameExpression, extraFlag);
@ -335,17 +399,25 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
protected static class LibraryFileOptionParser extends AbstractOptionParser { protected static class LibraryFileOptionParser extends AbstractOptionParser {
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
*/ */
public LibraryFileOptionParser(String pattern, String nameExpression) { public LibraryFileOptionParser(String pattern, String nameExpression) {
super(ICLanguageSettingEntry.LIBRARY_FILE, pattern, nameExpression, nameExpression, 0); super(ICLanguageSettingEntry.LIBRARY_FILE, pattern, nameExpression, nameExpression, 0);
} }
/** /**
* Constructor. * Constructor.
* @param pattern - regular expression pattern being parsed by the parser. *
* @param nameExpression - capturing group expression defining name of an entry. * @param pattern
* @param extraFlag - extra-flag to add while creating language settings entry. * - regular expression pattern being parsed by the parser.
* @param nameExpression
* - capturing group expression defining name of an entry.
* @param extraFlag
* - extra-flag to add while creating language settings entry.
*/ */
public LibraryFileOptionParser(String pattern, String nameExpression, int extraFlag) { public LibraryFileOptionParser(String pattern, String nameExpression, int extraFlag) {
super(ICLanguageSettingEntry.LIBRARY_FILE, pattern, nameExpression, nameExpression, extraFlag); super(ICLanguageSettingEntry.LIBRARY_FILE, pattern, nameExpression, nameExpression, extraFlag);
@ -353,60 +425,63 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Parse the line returning the resource name as appears in the output. * Parse the line returning the resource name as appears in the output. This is the resource
* This is the resource where {@link ICLanguageSettingEntry} list is being added. * where {@link ICLanguageSettingEntry} list is being added.
* *
* @param line - one input line from the output stripped from end of line characters. * @param line
* @return the resource name as appears in the output or {@code null}. * - one input line from the output stripped from end of line characters.
* Note that {@code null} can have different semantics and can mean "no resource found" * @return the resource name as appears in the output or {@code null}. Note that {@code null}
* or "applicable to any resource". By default "no resource found" is used in this * can have different semantics and can mean "no resource found" or "applicable to any
* abstract class but extenders can handle otherwise. * resource". By default "no resource found" is used in this abstract class but
* extenders can handle otherwise.
*/ */
protected abstract String parseResourceName(String line); protected abstract String parseResourceName(String line);
/** /**
* Parse the line returning the list of substrings to be treated each as input to * Parse the line returning the list of substrings to be treated each as input to the option
* the option parsers. It is assumed that each substring presents one * parsers. It is assumed that each substring presents one {@link ICLanguageSettingEntry} (for
* {@link ICLanguageSettingEntry} (for example compiler options {@code -I/path} or * example compiler options {@code -I/path} or {@code -DMACRO=1}).
* {@code -DMACRO=1}).
* *
* @param line - one input line from the output stripped from end of line characters. * @param line
* - one input line from the output stripped from end of line characters.
* @return list of substrings representing language settings entries. * @return list of substrings representing language settings entries.
*/ */
protected abstract List<String> parseOptions(String line); protected abstract List<String> parseOptions(String line);
/** /**
* @return array of option parsers defining how to parse a string to * @return array of option parsers defining how to parse a string to
* {@link ICLanguageSettingEntry}. * {@link ICLanguageSettingEntry}. See {@link AbstractOptionParser} and its specific
* See {@link AbstractOptionParser} and its specific extenders. * extenders.
*/ */
protected abstract AbstractOptionParser[] getOptionParsers(); protected abstract AbstractOptionParser[] getOptionParsers();
/** /**
* @return {@code true} when the provider tries to resolve relative or remote paths * @return {@code true} when the provider tries to resolve relative or remote paths to the
* to the existing paths in the workspace or local file-system using certain heuristics. * existing paths in the workspace or local file-system using certain heuristics.
*/ */
public boolean isResolvingPaths() { public boolean isResolvingPaths() {
return isResolvingPaths; return isResolvingPaths;
} }
/** /**
* Enable or disable resolving relative or remote paths to the existing paths * Enable or disable resolving relative or remote paths to the existing paths in the workspace
* in the workspace or local file-system. * or local file-system.
* *
* @param resolvePaths - set {@code true} to enable or {@code false} to disable * @param resolvePaths
* resolving paths. When this parameter is set to {@code false} the paths will * - set {@code true} to enable or {@code false} to disable resolving paths. When
* be kept as they appear in the build output. * this parameter is set to {@code false} the paths will be kept as they appear in
* the build output.
*/ */
public void setResolvingPaths(boolean resolvePaths) { public void setResolvingPaths(boolean resolvePaths) {
this.isResolvingPaths = resolvePaths; this.isResolvingPaths = resolvePaths;
} }
@Override @Override
public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker) throws CoreException { public void startup(ICConfigurationDescription cfgDescription, IWorkingDirectoryTracker cwdTracker)
throws CoreException {
this.currentCfgDescription = cfgDescription; this.currentCfgDescription = cfgDescription;
this.currentProject = cfgDescription != null ? cfgDescription.getProjectDescription().getProject() : null; this.currentProject = cfgDescription != null ? cfgDescription.getProjectDescription().getProject()
: null;
this.cwdTracker = cwdTracker; this.cwdTracker = cwdTracker;
this.efsProvider = getEFSProvider(); this.efsProvider = getEFSProvider();
} }
@ -432,18 +507,18 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* URI of directory where the build is happening. This URI could point to a remote file-system * URI of directory where the build is happening. This URI could point to a remote
* for remote builds. Most often it is the same file-system as for currentResource but * file-system for remote builds. Most often it is the same file-system as for
* it can be different file-system (and different URI schema). * currentResource but it can be different file-system (and different URI schema).
*/ */
URI buildDirURI = null; URI buildDirURI = null;
/** /**
* Where source tree starts if mapped. This kind of mapping is useful for example in cases when * Where source tree starts if mapped. This kind of mapping is useful for example in cases
* the absolute path to the source file on the remote system is simulated inside a project in the * when the absolute path to the source file on the remote system is simulated inside a
* workspace. * project in the workspace. This URI is rooted on the same file-system where
* This URI is rooted on the same file-system where currentResource resides. In general this file-system * currentResource resides. In general this file-system (or even URI schema) does not have
* (or even URI schema) does not have to match that of buildDirURI. * to match that of buildDirURI.
*/ */
URI mappedRootURI = null; URI mappedRootURI = null;
@ -462,7 +537,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
try { try {
if (optionParser.parseOption(option)) { if (optionParser.parseOption(option)) {
ICLanguageSettingEntry entry = null; ICLanguageSettingEntry entry = null;
if (isResolvingPaths && (optionParser.isForFile() || optionParser.isForFolder())) { if (isResolvingPaths
&& (optionParser.isForFile() || optionParser.isForFolder())) {
URI baseURI = mappedRootURI; URI baseURI = mappedRootURI;
if (buildDirURI != null && !new Path(optionParser.parsedName).isAbsolute()) { if (buildDirURI != null && !new Path(optionParser.parsedName).isAbsolute()) {
if (mappedRootURI != null) { if (mappedRootURI != null) {
@ -471,9 +547,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
baseURI = buildDirURI; baseURI = buildDirURI;
} }
} }
entry = createResolvedPathEntry(optionParser, optionParser.parsedName, 0, baseURI); entry = createResolvedPathEntry(optionParser, optionParser.parsedName, 0,
baseURI);
} else { } else {
entry = optionParser.createEntry(optionParser.parsedName, optionParser.parsedValue, 0); entry = optionParser.createEntry(optionParser.parsedName,
optionParser.parsedValue, 0);
} }
if (entry != null && !entries.contains(entry)) { if (entry != null && !entries.contains(entry)) {
@ -483,8 +561,10 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
} catch (Throwable e) { } catch (Throwable e) {
@SuppressWarnings("nls") @SuppressWarnings("nls")
String msg = "Exception trying to parse option [" + option + "], class " + getClass().getSimpleName(); String msg = "Exception trying to parse option [" + option + "], class "
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg, e)); + getClass().getSimpleName();
ManagedBuilderCorePlugin
.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg, e));
} }
} }
} }
@ -498,13 +578,14 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* In case when absolute path is mapped to the source tree in a project * In case when absolute path is mapped to the source tree in a project this function will try
* this function will try to figure mapping and return "mapped root", * to figure mapping and return "mapped root", i.e URI where the root path would be mapped. The
* i.e URI where the root path would be mapped. The mapped root will be * mapped root will be used to prepend to other "absolute" paths where appropriate.
* used to prepend to other "absolute" paths where appropriate.
* *
* @param resource - a resource referred by parsed path * @param resource
* @param parsedResourceName - path as appears in the output * - a resource referred by parsed path
* @param parsedResourceName
* - path as appears in the output
* @return mapped path as URI * @return mapped path as URI
*/ */
protected URI getMappedRootURI(IResource resource, String parsedResourceName) { protected URI getMappedRootURI(IResource resource, String parsedResourceName) {
@ -542,7 +623,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
* Determine current build directory considering currentResource (resource being compiled), * Determine current build directory considering currentResource (resource being compiled),
* parsedResourceName and mappedRootURI. * parsedResourceName and mappedRootURI.
* *
* @param mappedRootURI - root of the source tree when mapped to remote file-system. * @param mappedRootURI
* - root of the source tree when mapped to remote file-system.
* @return {@link URI} of current build directory * @return {@link URI} of current build directory
*/ */
protected URI getBuildDirURI(URI mappedRootURI) { protected URI getBuildDirURI(URI mappedRootURI) {
@ -550,7 +632,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
// try to deduce build directory from full path of currentResource and partial path of parsedResourceName // try to deduce build directory from full path of currentResource and partial path of parsedResourceName
URI cwdURI = null; URI cwdURI = null;
if (currentResource != null && parsedResourceName != null && !new Path(parsedResourceName).isAbsolute()) { if (currentResource != null && parsedResourceName != null
&& !new Path(parsedResourceName).isAbsolute()) {
cwdURI = findBaseLocationURI(currentResource.getLocationURI(), parsedResourceName); cwdURI = findBaseLocationURI(currentResource.getLocationURI(), parsedResourceName);
} }
String cwdPath = cwdURI != null ? efsProvider.getPathFromURI(cwdURI) : null; String cwdPath = cwdURI != null ? efsProvider.getPathFromURI(cwdURI) : null;
@ -603,13 +686,15 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Sets language settings entries for current configuration description, current resource * Sets language settings entries for current configuration description, current resource and
* and current language ID. * current language ID.
* *
* @param entries - language settings entries to set. * @param entries
* - language settings entries to set.
*/ */
protected void setSettingEntries(List<? extends ICLanguageSettingEntry> entries) { protected void setSettingEntries(List<? extends ICLanguageSettingEntry> entries) {
setSettingEntries(currentCfgDescription, currentResource, currentLanguageId, entries); IBuildConfiguration currentConfig = Adapters.adapt(currentCfgDescription, IBuildConfiguration.class);
setSettingEntries(currentConfig, currentResource, currentLanguageId, entries);
} }
/** /**
@ -638,7 +723,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Determine if the language is in scope of the provider. * Determine if the language is in scope of the provider.
* *
* @param languageId - language ID. * @param languageId
* - language ID.
* @return {@code true} if the language is in scope, {@code false } otherwise. * @return {@code true} if the language is in scope, {@code false } otherwise.
*/ */
protected boolean isLanguageInScope(String languageId) { protected boolean isLanguageInScope(String languageId) {
@ -647,10 +733,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Find file resource in the workspace for a given URI with a preference for the resource * Find file resource in the workspace for a given URI with a preference for the resource to
* to reside in the given project. * reside in the given project.
*/ */
private static IResource findFileForLocationURI(URI uri, IProject preferredProject, boolean checkExistence) { private static IResource findFileForLocationURI(URI uri, IProject preferredProject,
boolean checkExistence) {
IResource sourceFile = null; IResource sourceFile = null;
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IResource[] resources = root.findFilesForLocationURI(uri); IResource[] resources = root.findFilesForLocationURI(uri);
@ -669,10 +756,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Return a resource in workspace corresponding the given folder {@link URI} preferable residing in * Return a resource in workspace corresponding the given folder {@link URI} preferable residing
* the provided project. * in the provided project.
*/ */
private static IResource findContainerForLocationURI(URI uri, IProject preferredProject, boolean checkExistence) { private static IResource findContainerForLocationURI(URI uri, IProject preferredProject,
boolean checkExistence) {
IResource resource = null; IResource resource = null;
IResource[] resources = ResourcesPlugin.getWorkspace().getRoot().findContainersForLocationURI(uri); IResource[] resources = ResourcesPlugin.getWorkspace().getRoot().findContainersForLocationURI(uri);
for (IResource rc : resources) { for (IResource rc : resources) {
@ -730,7 +818,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} catch (Exception e) { } catch (Exception e) {
@SuppressWarnings("nls") @SuppressWarnings("nls")
String msg = "Exception trying to resolve value [" + strBuilderCWD + "]"; String msg = "Exception trying to resolve value [" + strBuilderCWD + "]";
ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg, e)); ManagedBuilderCorePlugin
.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, msg, e));
} }
builderCWD = new Path(strBuilderCWD); builderCWD = new Path(strBuilderCWD);
@ -749,9 +838,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Find base location of the file, i.e. location of the directory which * Find base location of the file, i.e. location of the directory which results from removing
* results from removing trailing relativeFileName from fileURI or * trailing relativeFileName from fileURI or {@code null} if fileURI doesn't represent
* {@code null} if fileURI doesn't represent relativeFileName. * relativeFileName.
*/ */
private static URI findBaseLocationURI(URI fileURI, String relativeFileName) { private static URI findBaseLocationURI(URI fileURI, String relativeFileName) {
URI cwdURI = null; URI cwdURI = null;
@ -780,8 +869,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
try { try {
cwdURI = new URI(fileURI.getScheme(), fileURI.getUserInfo(), fileURI.getHost(), cwdURI = new URI(fileURI.getScheme(), fileURI.getUserInfo(), fileURI.getHost(), fileURI.getPort(),
fileURI.getPort(), path + '/', fileURI.getQuery(), fileURI.getFragment()); path + '/', fileURI.getQuery(), fileURI.getFragment());
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
// It should be valid URI here or something is really wrong // It should be valid URI here or something is really wrong
ManagedBuilderCorePlugin.log(e); ManagedBuilderCorePlugin.log(e);
@ -791,10 +880,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* The manipulations here are done to resolve problems such as "../" navigation for symbolic links where * The manipulations here are done to resolve problems such as "../" navigation for symbolic
* "link/.." cannot be collapsed as it must follow the real file-system path. {@link java.io.File#getCanonicalPath()} * links where "link/.." cannot be collapsed as it must follow the real file-system path.
* deals with that correctly but {@link Path} or {@link URI} try to normalize the path which would be incorrect here. * {@link java.io.File#getCanonicalPath()} deals with that correctly but {@link Path} or
* Another issue being resolved here is fixing drive letters in URI syntax. * {@link URI} try to normalize the path which would be incorrect here. Another issue being
* resolved here is fixing drive letters in URI syntax.
*/ */
private static URI resolvePathFromBaseLocation(String pathStr0, IPath baseLocation) { private static URI resolvePathFromBaseLocation(String pathStr0, IPath baseLocation) {
String pathStr = pathStr0; String pathStr = pathStr0;
@ -851,8 +941,10 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Determine URI on the local file-system considering possible mapping. * Determine URI on the local file-system considering possible mapping.
* *
* @param pathStr - path to the resource, can be absolute or relative * @param pathStr
* @param baseURI - base {@link URI} where path to the resource is rooted * - path to the resource, can be absolute or relative
* @param baseURI
* - base {@link URI} where path to the resource is rooted
* @return {@link URI} of the resource * @return {@link URI} of the resource
*/ */
private URI determineMappedURI(String pathStr, URI baseURI) { private URI determineMappedURI(String pathStr, URI baseURI) {
@ -869,7 +961,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
uri = resolvePathFromBaseLocation(pathStr, baseLocation); uri = resolvePathFromBaseLocation(pathStr, baseLocation);
} else { } else {
// location on a remote file-system // location on a remote file-system
IPath path = new Path(pathStr); // use canonicalized path here, in particular replace all '\' with '/' for Windows paths IPath path = new Path(pathStr); // use canonicalized path here, in particular replace all '\' with
// '/' for Windows paths
URI remoteUri = efsProvider.append(baseURI, path.toString()); URI remoteUri = efsProvider.append(baseURI, path.toString());
if (remoteUri != null) { if (remoteUri != null) {
String localPath = efsProvider.getMappedPath(remoteUri); String localPath = efsProvider.getMappedPath(remoteUri);
@ -964,7 +1057,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
if (projects.length > 0) { if (projects.length > 0) {
IResource rc = null; IResource rc = null;
for (IProject prj : projects) { for (IProject prj : projects) {
if (!prj.equals(currentProject) && !referencedProjectsNames.contains(prj.getName()) && prj.isOpen()) { if (!prj.equals(currentProject) && !referencedProjectsNames.contains(prj.getName())
&& prj.isOpen()) {
List<IResource> result = findPathInFolder(path, prj); List<IResource> result = findPathInFolder(path, prj);
int size = result.size(); int size = result.size();
if (size == 1 && rc == null) { if (size == 1 && rc == null) {
@ -986,7 +1080,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Get location on the local file-system considering possible mapping by EFS provider. See {@link EFSExtensionManager}. * Get location on the local file-system considering possible mapping by EFS provider. See
* {@link EFSExtensionManager}.
*/ */
private IPath getFilesystemLocation(URI uri) { private IPath getFilesystemLocation(URI uri) {
if (uri == null) if (uri == null)
@ -1013,14 +1108,17 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Resolve and create language settings path entry. * Resolve and create language settings path entry.
*/ */
private ICLanguageSettingEntry createResolvedPathEntry(AbstractOptionParser optionParser, String parsedPath, int flag, URI baseURI) { private ICLanguageSettingEntry createResolvedPathEntry(AbstractOptionParser optionParser,
String parsedPath, int flag, URI baseURI) {
URI uri = determineMappedURI(parsedPath, baseURI); URI uri = determineMappedURI(parsedPath, baseURI);
boolean isRelative = !new Path(parsedPath).isAbsolute(); boolean isRelative = !new Path(parsedPath).isAbsolute();
// is mapped something that is not a project root // is mapped something that is not a project root
boolean isRemapped = baseURI != null && currentProject != null && !baseURI.equals(currentProject.getLocationURI()); boolean isRemapped = baseURI != null && currentProject != null
&& !baseURI.equals(currentProject.getLocationURI());
boolean presentAsRelative = isRelative || isRemapped; boolean presentAsRelative = isRelative || isRemapped;
ICLanguageSettingEntry entry = resolvePathEntryInWorkspace(optionParser, uri, flag, presentAsRelative); ICLanguageSettingEntry entry = resolvePathEntryInWorkspace(optionParser, uri, flag,
presentAsRelative);
if (entry != null) { if (entry != null) {
return entry; return entry;
} }
@ -1044,10 +1142,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Create a language settings entry for a given resource. * Create a language settings entry for a given resource. This will represent relative path
* This will represent relative path using CDT variable ${ProjName}. * using CDT variable ${ProjName}.
*/ */
private ICLanguageSettingEntry createPathEntry(AbstractOptionParser optionParser, IResource rc, boolean isRelative, int flag) { private ICLanguageSettingEntry createPathEntry(AbstractOptionParser optionParser, IResource rc,
boolean isRelative, int flag) {
String path; String path;
if (isRelative && rc.getProject().equals(currentProject)) { if (isRelative && rc.getProject().equals(currentProject)) {
path = PROJ_NAME_PREFIX + rc.getFullPath().removeFirstSegments(1); path = PROJ_NAME_PREFIX + rc.getFullPath().removeFirstSegments(1);
@ -1062,7 +1161,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Find an existing resource in the workspace and create a language settings entry for it. * Find an existing resource in the workspace and create a language settings entry for it.
*/ */
private ICLanguageSettingEntry resolvePathEntryInWorkspace(AbstractOptionParser optionParser, URI uri, int flag, boolean isRelative) { private ICLanguageSettingEntry resolvePathEntryInWorkspace(AbstractOptionParser optionParser, URI uri,
int flag, boolean isRelative) {
if (uri != null && uri.isAbsolute()) { if (uri != null && uri.isAbsolute()) {
IResource rc = null; IResource rc = null;
if (optionParser.isForFolder()) { if (optionParser.isForFolder()) {
@ -1080,7 +1180,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
/** /**
* Find a resource on the file-system and create a language settings entry for it. * Find a resource on the file-system and create a language settings entry for it.
*/ */
private ICLanguageSettingEntry resolvePathEntryInFilesystem(AbstractOptionParser optionParser, URI uri, int flag) { private ICLanguageSettingEntry resolvePathEntryInFilesystem(AbstractOptionParser optionParser, URI uri,
int flag) {
IPath location = getFilesystemLocation(uri); IPath location = getFilesystemLocation(uri);
if (location != null) { if (location != null) {
String loc = location.toString(); String loc = location.toString();
@ -1092,9 +1193,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Find a best fit for the resource in the workspace and create a language settings entry for it. * Find a best fit for the resource in the workspace and create a language settings entry for
* it.
*/ */
private ICLanguageSettingEntry resolvePathEntryInWorkspaceAsBestFit(AbstractOptionParser optionParser, String parsedPath, int flag, boolean isRelative) { private ICLanguageSettingEntry resolvePathEntryInWorkspaceAsBestFit(AbstractOptionParser optionParser,
String parsedPath, int flag, boolean isRelative) {
IResource rc = findBestFitInWorkspace(parsedPath); IResource rc = findBestFitInWorkspace(parsedPath);
if (rc != null) { if (rc != null) {
return createPathEntry(optionParser, rc, isRelative, flag); return createPathEntry(optionParser, rc, isRelative, flag);
@ -1103,9 +1206,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Try to map a resource in the workspace even if it does not exist and create a language settings entry for it. * Try to map a resource in the workspace even if it does not exist and create a language
* settings entry for it.
*/ */
private ICLanguageSettingEntry resolvePathEntryInWorkspaceToNonexistingResource(AbstractOptionParser optionParser, URI uri, int flag, boolean isRelative) { private ICLanguageSettingEntry resolvePathEntryInWorkspaceToNonexistingResource(
AbstractOptionParser optionParser, URI uri, int flag, boolean isRelative) {
if (uri != null && uri.isAbsolute()) { if (uri != null && uri.isAbsolute()) {
IResource rc = null; IResource rc = null;
if (optionParser.isForFolder()) { if (optionParser.isForFolder()) {
@ -1121,9 +1226,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Try to map a resource on the file-system even if it does not exist and create a language settings entry for it. * Try to map a resource on the file-system even if it does not exist and create a language
* settings entry for it.
*/ */
private ICLanguageSettingEntry resolvePathEntryInFilesystemToNonExistingResource(AbstractOptionParser optionParser, URI uri, int flag) { private ICLanguageSettingEntry resolvePathEntryInFilesystemToNonExistingResource(
AbstractOptionParser optionParser, URI uri, int flag) {
IPath location = getFilesystemLocation(uri); IPath location = getFilesystemLocation(uri);
if (location != null) { if (location != null) {
return optionParser.createEntry(location.toString(), location.toString(), flag); return optionParser.createEntry(location.toString(), location.toString(), flag);
@ -1132,10 +1239,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Count how many groups are present in regular expression. * Count how many groups are present in regular expression. The implementation is simplistic but
* The implementation is simplistic but should be sufficient for the cause. * should be sufficient for the cause.
* *
* @param str - regular expression to count the groups. * @param str
* - regular expression to count the groups.
* @return number of the groups (groups are enclosed in round brackets) present. * @return number of the groups (groups are enclosed in round brackets) present.
*/ */
protected static int countGroups(String str) { protected static int countGroups(String str) {
@ -1164,8 +1272,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
} }
/** /**
* Construct regular expression to find any file extension for C or C++. * Construct regular expression to find any file extension for C or C++. Returns expression
* Returns expression shaped in form of "((cpp)|(c++)|(c))". * shaped in form of "((cpp)|(c++)|(c))".
* *
* @return regular expression for searching C/C++ file extensions. * @return regular expression for searching C/C++ file extensions.
*/ */
@ -1189,9 +1297,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
* This {@link EFSExtensionProvider} is capable to translate EFS paths to and from local * This {@link EFSExtensionProvider} is capable to translate EFS paths to and from local
* file-system. Added mostly for Cygwin translations. * file-system. Added mostly for Cygwin translations.
* *
* This usage of {@link EFSExtensionProvider} is somewhat a misnomer. This provider is not * This usage of {@link EFSExtensionProvider} is somewhat a misnomer. This provider is not an
* an "extension" provider but rather a wrapper on {@link EFSExtensionManager} which in fact * "extension" provider but rather a wrapper on {@link EFSExtensionManager} which in fact will
* will use genuine {@link EFSExtensionProvider}s defined as extensions. * use genuine {@link EFSExtensionProvider}s defined as extensions.
* *
* @since 8.2 * @since 8.2
*/ */
@ -1210,7 +1318,8 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett
public void loadAttributes(Element providerNode) { public void loadAttributes(Element providerNode) {
super.loadAttributes(providerNode); super.loadAttributes(providerNode);
String expandRelativePathsValue = XmlUtil.determineAttributeValue(providerNode, ATTR_KEEP_RELATIVE_PATHS); String expandRelativePathsValue = XmlUtil.determineAttributeValue(providerNode,
ATTR_KEEP_RELATIVE_PATHS);
if (expandRelativePathsValue != null) if (expandRelativePathsValue != null)
isResolvingPaths = !Boolean.parseBoolean(expandRelativePathsValue); isResolvingPaths = !Boolean.parseBoolean(expandRelativePathsValue);
} }

View file

@ -59,288 +59,4 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disa
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.7 org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=120
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

View file

@ -1,4 +1,3 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
formatter_settings_version=12 formatter_settings_version=12
internal.default.compliance=user internal.default.compliance=user

View file

@ -14,8 +14,6 @@ package org.eclipse.cdt.core.language.settings.providers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.AbstractExecutableExtensionBase; import org.eclipse.cdt.core.AbstractExecutableExtensionBase;
import org.eclipse.cdt.core.settings.model.CIncludeFileEntry; import org.eclipse.cdt.core.settings.model.CIncludeFileEntry;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
@ -31,12 +29,18 @@ import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSetting
import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider; import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider;
import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescription; import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescription;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import junit.framework.TestSuite;
/** /**
* Test cases testing {@link LanguageSettingsManager} utility methods. * Test cases testing {@link LanguageSettingsManager} utility methods.
@ -62,48 +66,85 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
/** /**
* Mock configuration description. * Mock configuration description.
*/ */
class MockConfigurationDescription extends CModelMock.DummyCConfigurationDescription implements ILanguageSettingsProvidersKeeper { class MockConfigurationDescription extends CModelMock.DummyCConfigurationDescription
implements ILanguageSettingsProvidersKeeper {
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
String[] defaultProvidersIds = null; String[] defaultProvidersIds = null;
public MockConfigurationDescription(String id) { public MockConfigurationDescription(String id) {
super(id); super(id);
} }
@Override @Override
public void setLanguageSettingProviders(List<? extends ILanguageSettingsProvider> providers) { public void setLanguageSettingProviders(List<? extends ILanguageSettingsProvider> providers) {
this.providers = new ArrayList<ILanguageSettingsProvider>(providers); this.providers = new ArrayList<ILanguageSettingsProvider>(providers);
} }
@Override @Override
public List<ILanguageSettingsProvider> getLanguageSettingProviders() { public List<ILanguageSettingsProvider> getLanguageSettingProviders() {
return providers; return providers;
} }
@Override @Override
public void setDefaultLanguageSettingsProvidersIds(String[] ids) { public void setDefaultLanguageSettingsProvidersIds(String[] ids) {
defaultProvidersIds = ids; defaultProvidersIds = ids;
} }
@Override @Override
public String[] getDefaultLanguageSettingsProvidersIds() { public String[] getDefaultLanguageSettingsProvidersIds() {
return defaultProvidersIds; return defaultProvidersIds;
} }
} }
private class MockBuildConfiguration implements IBuildConfiguration {
private final MockConfigurationDescription cfgDesc;
public MockBuildConfiguration(MockConfigurationDescription cfgDesc) {
this.cfgDesc = cfgDesc;
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter.isInstance(cfgDesc)) {
return (T) cfgDesc;
}
return null;
}
@Override
public IProject getProject() {
return null;
}
@Override
public String getName() {
return cfgDesc.getId();
}
}
/** /**
* Mock language sttings provider. * Mock language sttings provider.
*/ */
private class MockProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider { private class MockProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider {
private List<ICLanguageSettingEntry> entries; private List<ICLanguageSettingEntry> entries;
public MockProvider(String id, String name, List<ICLanguageSettingEntry> entries) { public MockProvider(String id, String name, List<ICLanguageSettingEntry> entries) {
super(id, name); super(id, name);
this.entries = entries; this.entries = entries;
} }
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
return entries; return entries;
} }
} }
/** /**
* Constructor. * Constructor.
* @param name - name of the test. *
* @param name
* - name of the test.
*/ */
public LanguageSettingsManagerTests(String name) { public LanguageSettingsManagerTests(String name) {
super(name); super(name);
@ -113,6 +154,18 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
@Override
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
MockConfigurationDescription cfgDesc = (MockConfigurationDescription) adaptableObject;
return (T) new MockBuildConfiguration(cfgDesc);
}
@Override
public Class<?>[] getAdapterList() {
return new Class<?>[] { IBuildConfiguration.class };
}
}, MockConfigurationDescription.class);
} }
@Override @Override
@ -131,7 +184,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
/** /**
* main function of the class. * main function of the class.
* *
* @param args - arguments * @param args
* - arguments
*/ */
public static void main(String[] args) { public static void main(String[] args) {
junit.textui.TestRunner.run(suite()); junit.textui.TestRunner.run(suite());
@ -174,7 +228,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// Create model project and accompanied descriptions // Create model project and accompanied descriptions
String projectName = getName(); String projectName = getName();
IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IProject project = ResourceHelper.createCDTProjectWithConfig(projectName);
ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, true);
ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations();
ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0]; ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0];
@ -202,6 +257,9 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
public void testRudeProviders() throws Exception { public void testRudeProviders() throws Exception {
// mock configuration description // mock configuration description
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// set impolite provider returning null by getSettingEntries() // set impolite provider returning null by getSettingEntries()
ILanguageSettingsProvider providerNull = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null); ILanguageSettingsProvider providerNull = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null);
{ {
@ -212,14 +270,14 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// use provider returning null, no exception should be recorded // use provider returning null, no exception should be recorded
{ {
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(providerNull,
.getSettingEntriesUpResourceTree(providerNull, cfgDescription, FILE_0, LANG_ID); config, FILE_0, LANG_ID);
assertNotNull(actual); assertNotNull(actual);
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
{ {
List<ICLanguageSettingEntry> actual = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> actual = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, 0); FILE_0, LANG_ID, 0);
assertNotNull(actual); assertNotNull(actual);
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
@ -240,13 +298,13 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// use provider returning null as item in array // use provider returning null as item in array
{ {
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager
.getSettingEntriesUpResourceTree(providerNull_2, cfgDescription, FILE_0, LANG_ID); .getSettingEntriesUpResourceTree(providerNull_2, config, FILE_0, LANG_ID);
assertNotNull(actual); assertNotNull(actual);
assertEquals(1, actual.size()); assertEquals(1, actual.size());
} }
{ {
List<ICLanguageSettingEntry> actual = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> actual = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, 0); FILE_0, LANG_ID, 0);
assertNotNull(actual); assertNotNull(actual);
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
@ -257,7 +315,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
ILanguageSettingsProvider providerNPE = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null) { ILanguageSettingsProvider providerNPE = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null) {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
throw new NullPointerException("Can you handle me?"); throw new NullPointerException("Can you handle me?");
} }
}; };
@ -277,16 +336,20 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testProvider_Basic() throws Exception { public void testProvider_Basic() throws Exception {
final MockConfigurationDescription modelCfgDescription = new MockConfigurationDescription(CFG_ID); final MockConfigurationDescription modelCfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration modelConfig = Adapters.adapt(modelCfgDescription, IBuildConfiguration.class);
assertNotNull(modelConfig);
final List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); final List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
// define provider returning entries when configuration id matches and null otherwise // define provider returning entries when configuration id matches and
// null otherwise
ILanguageSettingsProvider providerYes = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) { ILanguageSettingsProvider providerYes = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
if (cfgDescription.getId().equals(modelCfgDescription.getId())) { String languageId) {
if (config.getName().equals(modelCfgDescription.getId())) {
return entries; return entries;
} }
return null; return null;
@ -294,11 +357,13 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
}; };
providers.add(providerYes); providers.add(providerYes);
// define provider returning entries when configuration id does NOT match and null otherwise // define provider returning entries when configuration id does NOT
// match and null otherwise
ILanguageSettingsProvider providerNo = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null) { ILanguageSettingsProvider providerNo = new MockProvider(PROVIDER_1, PROVIDER_NAME_1, null) {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
if (cfgDescription!= null && !cfgDescription.getId().equals(modelCfgDescription.getId())) { String languageId) {
if (config != null && !config.getName().equals(modelCfgDescription.getId())) {
return entries; return entries;
} }
return null; return null;
@ -310,16 +375,16 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve the entries with provider returning the given list // retrieve the entries with provider returning the given list
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(providerYes,
.getSettingEntriesUpResourceTree(providerYes, modelCfgDescription, FILE_0, LANG_ID); modelConfig, FILE_0, LANG_ID);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size()); assertEquals(entries.size(), actual.size());
} }
{ {
// retrieve the entries with provider returning empty list // retrieve the entries with provider returning empty list
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(providerNo,
.getSettingEntriesUpResourceTree(providerNo, modelCfgDescription, FILE_0, LANG_ID); modelConfig, FILE_0, LANG_ID);
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
} }
@ -329,6 +394,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testProvider_Regular() throws Exception { public void testProvider_Regular() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// create couple of providers // create couple of providers
List<ICLanguageSettingEntry> entries1 = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries1 = new ArrayList<ICLanguageSettingEntry>();
@ -349,8 +416,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve the entries for provider-1 // retrieve the entries for provider-1
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider1,
.getSettingEntriesUpResourceTree(provider1, cfgDescription, FILE_0, LANG_ID); config, FILE_0, LANG_ID);
assertNotSame(entries1, actual); assertNotSame(entries1, actual);
ICLanguageSettingEntry[] entriesArray = entries1.toArray(new ICLanguageSettingEntry[0]); ICLanguageSettingEntry[] entriesArray = entries1.toArray(new ICLanguageSettingEntry[0]);
@ -363,8 +430,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve the entries for provider-2 // retrieve the entries for provider-2
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider2,
.getSettingEntriesUpResourceTree(provider2, cfgDescription, FILE_0, LANG_ID); config, FILE_0, LANG_ID);
assertNotSame(entries2, actual); assertNotSame(entries2, actual);
ICLanguageSettingEntry[] entriesArray = entries2.toArray(new ICLanguageSettingEntry[0]); ICLanguageSettingEntry[] entriesArray = entries2.toArray(new ICLanguageSettingEntry[0]);
@ -383,11 +450,14 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// Create model project and accompanied descriptions // Create model project and accompanied descriptions
String projectName = getName(); String projectName = getName();
IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IProject project = ResourceHelper.createCDTProjectWithConfig(projectName);
ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, true);
ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations();
ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0]; ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0];
assertTrue(cfgDescriptionWritable instanceof CConfigurationDescription); assertTrue(cfgDescriptionWritable instanceof CConfigurationDescription);
IBuildConfiguration configWritable = Adapters.adapt(cfgDescriptionWritable, IBuildConfiguration.class);
assertNotNull(configWritable);
final IFolder parentFolder = ResourceHelper.createFolder(project, "/ParentFolder/"); final IFolder parentFolder = ResourceHelper.createFolder(project, "/ParentFolder/");
assertNotNull(parentFolder); assertNotNull(parentFolder);
@ -400,7 +470,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
ILanguageSettingsProvider provider = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) { ILanguageSettingsProvider provider = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (rc != null && rc.equals(parentFolder)) { if (rc != null && rc.equals(parentFolder)) {
return entries; return entries;
} }
@ -417,8 +488,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve entries for a derived resource (in a subfolder) // retrieve entries for a derived resource (in a subfolder)
IFile derived = ResourceHelper.createFile(project, "/ParentFolder/Subfolder/resource"); IFile derived = ResourceHelper.createFile(project, "/ParentFolder/Subfolder/resource");
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider,
.getSettingEntriesUpResourceTree(provider, cfgDescriptionWritable, derived, LANG_ID); configWritable, derived, LANG_ID);
// taken from parent folder // taken from parent folder
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size()); assertEquals(entries.size(), actual.size());
@ -426,16 +497,17 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve entries for not related resource // retrieve entries for not related resource
IFile notRelated = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/AnotherFolder/Subfolder/resource")); IFile notRelated = ResourcesPlugin.getWorkspace().getRoot()
List<ICLanguageSettingEntry> actual = LanguageSettingsManager .getFile(new Path("/AnotherFolder/Subfolder/resource"));
.getSettingEntriesUpResourceTree(provider, cfgDescriptionWritable, notRelated, LANG_ID); List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider,
configWritable, notRelated, LANG_ID);
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
{ {
// test distinction between no settings and empty settings // test distinction between no settings and empty settings
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider,
.getSettingEntriesUpResourceTree(provider, cfgDescriptionWritable, emptySettingsPath, LANG_ID); configWritable, emptySettingsPath, LANG_ID);
// NOT taken from parent folder // NOT taken from parent folder
assertEquals(0, actual.size()); assertEquals(0, actual.size());
} }
@ -448,11 +520,14 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// Create model project and accompanied descriptions // Create model project and accompanied descriptions
String projectName = getName(); String projectName = getName();
IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IProject project = ResourceHelper.createCDTProjectWithConfig(projectName);
ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, true);
ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations();
ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0]; ICConfigurationDescription cfgDescriptionWritable = cfgDescriptions[0];
assertTrue(cfgDescriptionWritable instanceof CConfigurationDescription); assertTrue(cfgDescriptionWritable instanceof CConfigurationDescription);
IBuildConfiguration configWritable = Adapters.adapt(cfgDescriptionWritable, IBuildConfiguration.class);
assertNotNull(configWritable);
final IFolder parentFolder = ResourceHelper.createFolder(project, "/ParentFolder/"); final IFolder parentFolder = ResourceHelper.createFolder(project, "/ParentFolder/");
assertNotNull(parentFolder); assertNotNull(parentFolder);
@ -465,8 +540,9 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
ILanguageSettingsProvider provider = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) { ILanguageSettingsProvider provider = new MockProvider(PROVIDER_0, PROVIDER_NAME_0, null) {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
if (cfgDescription==null && rc==null) { String languageId) {
if (config == null && rc == null) {
return entries; return entries;
} }
return null; return null;
@ -479,8 +555,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve entries for a resource // retrieve entries for a resource
IFile derived = ResourceHelper.createFile(project, "/ParentFolder/Subfolder/resource"); IFile derived = ResourceHelper.createFile(project, "/ParentFolder/Subfolder/resource");
List<ICLanguageSettingEntry> actual = LanguageSettingsManager List<ICLanguageSettingEntry> actual = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider,
.getSettingEntriesUpResourceTree(provider, cfgDescriptionWritable, derived, LANG_ID); configWritable, derived, LANG_ID);
// default entries given // default entries given
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
assertEquals(entries.size(), actual.size()); assertEquals(entries.size(), actual.size());
@ -492,6 +568,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_Regular() throws Exception { public void testEntriesByKind_Regular() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// contribute the entries // contribute the entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -507,15 +585,15 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
// retrieve entries by kind // retrieve entries by kind
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(new CIncludePathEntry("path0", 0), includes.get(0)); assertEquals(new CIncludePathEntry("path0", 0), includes.get(0));
assertEquals(new CIncludePathEntry("path1", 0), includes.get(1)); assertEquals(new CIncludePathEntry("path1", 0), includes.get(1));
assertEquals(new CIncludePathEntry("path2", 0), includes.get(2)); assertEquals(new CIncludePathEntry("path2", 0), includes.get(2));
assertEquals(3, includes.size()); assertEquals(3, includes.size());
List<ICLanguageSettingEntry> macros = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> macros = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.MACRO); FILE_0, LANG_ID, ICSettingEntry.MACRO);
assertEquals(new CMacroEntry("MACRO0", "value0", 0), macros.get(0)); assertEquals(new CMacroEntry("MACRO0", "value0", 0), macros.get(0));
assertEquals(new CMacroEntry("MACRO1", "value1", 0), macros.get(1)); assertEquals(new CMacroEntry("MACRO1", "value1", 0), macros.get(1));
assertEquals(2, macros.size()); assertEquals(2, macros.size());
@ -526,6 +604,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_ConflictingEntries() throws Exception { public void testEntriesByKind_ConflictingEntries() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// contribute the entries // contribute the entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -539,7 +619,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
// retrieve entries by kind, only first entry should be returned // retrieve entries by kind, only first entry should be returned
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(1, includes.size()); assertEquals(1, includes.size());
assertEquals(entries.get(0), includes.get(0)); assertEquals(entries.get(0), includes.get(0));
} }
@ -549,6 +630,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_Undefined() throws Exception { public void testEntriesByKind_Undefined() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// contribute the entries // contribute the entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -561,8 +644,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
// retrieve entries by kind, no entries should be returned // retrieve entries by kind, no entries should be returned
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(0, includes.size()); assertEquals(0, includes.size());
} }
@ -571,6 +654,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_LocalAndSystem() throws Exception { public void testEntriesByKind_LocalAndSystem() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// contribute the entries // contribute the entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -587,7 +672,7 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve local entries // retrieve local entries
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer
.getLocalSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); .getLocalSettingEntriesByKind(config, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(localIncludeEntry, includes.get(0)); assertEquals(localIncludeEntry, includes.get(0));
assertEquals(1, includes.size()); assertEquals(1, includes.size());
} }
@ -595,15 +680,15 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// retrieve system entries // retrieve system entries
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer
.getSystemSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); .getSystemSettingEntriesByKind(config, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(systemIncludeEntry, includes.get(0)); assertEquals(systemIncludeEntry, includes.get(0));
assertEquals(1, includes.size()); assertEquals(1, includes.size());
} }
{ {
// retrieve both local and system // retrieve both local and system
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
assertEquals(entries.get(0), includes.get(0)); assertEquals(entries.get(0), includes.get(0));
assertEquals(entries.get(1), includes.get(1)); assertEquals(entries.get(1), includes.get(1));
assertEquals(2, includes.size()); assertEquals(2, includes.size());
@ -615,6 +700,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_ConflictingProviders() throws Exception { public void testEntriesByKind_ConflictingProviders() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// contribute the entries // contribute the entries
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
@ -639,8 +726,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
// retrieve entries by kind // retrieve entries by kind
List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> includes = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH); FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH);
// path0 is taken from higher priority provider // path0 is taken from higher priority provider
assertEquals(entriesHigh.get(0), includes.get(0)); assertEquals(entriesHigh.get(0), includes.get(0));
// path1 disablement by lower priority provider is ignored // path1 disablement by lower priority provider is ignored
@ -656,6 +743,7 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testEntriesByKind_CompositeKind() throws Exception { public void testEntriesByKind_CompositeKind() throws Exception {
MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID); MockConfigurationDescription cfgDescription = new MockConfigurationDescription(CFG_ID);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
// contribute the entries // contribute the entries
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -673,8 +761,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
cfgDescription.setLanguageSettingProviders(providers); cfgDescription.setLanguageSettingProviders(providers);
// retrieve entries by kind // retrieve entries by kind
List<ICLanguageSettingEntry> result = LanguageSettingsProvidersSerializer List<ICLanguageSettingEntry> result = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config,
.getSettingEntriesByKind(cfgDescription, FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH | ICSettingEntry.MACRO); FILE_0, LANG_ID, ICSettingEntry.INCLUDE_PATH | ICSettingEntry.MACRO);
assertEquals(new CIncludePathEntry("path0", 0), result.get(0)); assertEquals(new CIncludePathEntry("path0", 0), result.get(0));
assertEquals(new CMacroEntry("MACRO0", "value0", 0), result.get(1)); assertEquals(new CMacroEntry("MACRO0", "value0", 0), result.get(1));
assertEquals(new CIncludePathEntry("path1", 0), result.get(2)); assertEquals(new CIncludePathEntry("path1", 0), result.get(2));
@ -690,19 +778,22 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
// Create model project and accompanied descriptions // Create model project and accompanied descriptions
String projectName = getName(); String projectName = getName();
IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IProject project = ResourceHelper.createCDTProjectWithConfig(projectName);
ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance().getProjectDescription(project, true); ICProjectDescription prjDescriptionWritable = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, true);
ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = prjDescriptionWritable.getConfigurations();
ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ICConfigurationDescription cfgDescription = cfgDescriptions[0];
assertTrue(cfgDescription instanceof CConfigurationDescription); assertTrue(cfgDescription instanceof CConfigurationDescription);
// Select a sample workspace provider for the test // Select a sample workspace provider for the test
ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_BASE_PROVIDER_ID); ILanguageSettingsProvider workspaceProvider = LanguageSettingsManager
.getWorkspaceProvider(EXTENSION_BASE_PROVIDER_ID);
assertNotNull(workspaceProvider); assertNotNull(workspaceProvider);
{ {
// ensure no test provider is set yet but default providers // ensure no test provider is set yet but default providers
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, providers.get(0).getId()); assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, providers.get(0).getId());
assertEquals(ReferencedProjectsLanguageSettingsProvider.ID, providers.get(1).getId()); assertEquals(ReferencedProjectsLanguageSettingsProvider.ID, providers.get(1).getId());
assertEquals(ScannerDiscoveryLegacySupport.MBS_LANGUAGE_SETTINGS_PROVIDER_ID, providers.get(2).getId()); assertEquals(ScannerDiscoveryLegacySupport.MBS_LANGUAGE_SETTINGS_PROVIDER_ID, providers.get(2).getId());
@ -716,7 +807,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
} }
{ {
// check that test provider got there // check that test provider got there
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
assertEquals(workspaceProvider, providers.get(0)); assertEquals(workspaceProvider, providers.get(0));
} }
@ -730,12 +822,14 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// check that test provider got loaded // check that test provider got loaded
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, false); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, false);
ICConfigurationDescription[] loadedCfgDescriptions = prjDescription.getConfigurations(); ICConfigurationDescription[] loadedCfgDescriptions = prjDescription.getConfigurations();
ICConfigurationDescription loadedCfgDescription = loadedCfgDescriptions[0]; ICConfigurationDescription loadedCfgDescription = loadedCfgDescriptions[0];
assertTrue(cfgDescription instanceof CConfigurationDescription); assertTrue(cfgDescription instanceof CConfigurationDescription);
List<ILanguageSettingsProvider> loadedProviders = ((ILanguageSettingsProvidersKeeper) loadedCfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> loadedProviders = ((ILanguageSettingsProvidersKeeper) loadedCfgDescription)
.getLanguageSettingProviders();
assertTrue(LanguageSettingsManager.isWorkspaceProvider(loadedProviders.get(0))); assertTrue(LanguageSettingsManager.isWorkspaceProvider(loadedProviders.get(0)));
} }
@ -746,7 +840,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testWorkspaceProvider_Basic() throws Exception { public void testWorkspaceProvider_Basic() throws Exception {
// get workspace provider // get workspace provider
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager
.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, provider.getId()); assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, provider.getId());
assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_NAME, provider.getName()); assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_NAME, provider.getName());
@ -760,9 +855,10 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// make sure entries are the same // make sure entries are the same
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> entries = provider.getSettingEntries((IBuildConfiguration) null, null, null);
assertEquals(1, entries.size()); // defined in the extension assertEquals(1, entries.size()); // defined in the extension
List<ICLanguageSettingEntry> rawEntries = rawProvider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> rawEntries = rawProvider.getSettingEntries((IBuildConfiguration) null, null,
null);
assertEquals(entries, rawEntries); assertEquals(entries, rawEntries);
} }
@ -774,7 +870,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
((LanguageSettingsSerializableProvider) rawProvider).setSettingEntries(null, null, null, newEntries); ((LanguageSettingsSerializableProvider) rawProvider).setSettingEntries(null, null, null, newEntries);
// check that the workspace provider gets them too // check that the workspace provider gets them too
List<ICLanguageSettingEntry> newRawEntries = rawProvider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> newRawEntries = rawProvider.getSettingEntries((IBuildConfiguration) null, null,
null);
assertEquals(newEntries, newRawEntries); assertEquals(newEntries, newRawEntries);
assertEquals(2, newEntries.size()); assertEquals(2, newEntries.size());
} }
@ -784,8 +881,10 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
* Test workspace providers equality. * Test workspace providers equality.
*/ */
public void testWorkspaceProvider_Equals() throws Exception { public void testWorkspaceProvider_Equals() throws Exception {
ILanguageSettingsProvider providerA = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); ILanguageSettingsProvider providerA = LanguageSettingsManager
ILanguageSettingsProvider providerB = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); .getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
ILanguageSettingsProvider providerB = LanguageSettingsManager
.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
assertEquals(providerA, providerB); assertEquals(providerA, providerB);
} }
@ -794,10 +893,11 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testWorkspaceProvider_ReplaceRawProvider() throws Exception { public void testWorkspaceProvider_ReplaceRawProvider() throws Exception {
// get sample workspace provider // get sample workspace provider
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager
.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID);
{ {
// check on its entries (1 predefined entry via extension point) // check on its entries (1 predefined entry via extension point)
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> entries = provider.getSettingEntries((IBuildConfiguration) null, null, null);
assertEquals(1, entries.size()); // defined in the extension assertEquals(1, entries.size()); // defined in the extension
} }
@ -810,7 +910,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// replace raw provider // replace raw provider
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
LanguageSettingsSerializableProvider newRawProvider = new LanguageSettingsSerializableProvider(EXTENSION_EDITABLE_PROVIDER_ID, PROVIDER_NAME_0); LanguageSettingsSerializableProvider newRawProvider = new LanguageSettingsSerializableProvider(
EXTENSION_EDITABLE_PROVIDER_ID, PROVIDER_NAME_0);
newRawProvider.setSettingEntries(null, null, null, newEntries); newRawProvider.setSettingEntries(null, null, null, newEntries);
providers.add(newRawProvider); providers.add(newRawProvider);
LanguageSettingsManager.setWorkspaceProviders(providers); LanguageSettingsManager.setWorkspaceProviders(providers);
@ -818,7 +919,7 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
{ {
// check that provider provides the new entries // check that provider provides the new entries
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> entries = provider.getSettingEntries((IBuildConfiguration) null, null, null);
assertEquals(newEntries.size(), entries.size()); assertEquals(newEntries.size(), entries.size());
assertEquals(newEntries, entries); assertEquals(newEntries, entries);
} }
@ -829,7 +930,8 @@ public class LanguageSettingsManagerTests extends BaseTestCase {
*/ */
public void testWorkspaceProvider_ReplaceWithWorkspaceProvider() throws Exception { public void testWorkspaceProvider_ReplaceWithWorkspaceProvider() throws Exception {
// get sample workspace provider // get sample workspace provider
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); ILanguageSettingsProvider provider = LanguageSettingsManager
.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID);
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider);
assertNotSame(provider, rawProvider); assertNotSame(provider, rawProvider);

View file

@ -18,8 +18,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
@ -31,16 +29,22 @@ import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider; import org.eclipse.cdt.internal.core.language.settings.providers.ReferencedProjectsLanguageSettingsProvider;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import junit.framework.TestSuite;
/** /**
* Test cases testing ReferencedProjectsLanguageSettingsProvider functionality * Test cases testing ReferencedProjectsLanguageSettingsProvider functionality
*/ */
public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCase { public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCase {
/** /**
* Constructor. * Constructor.
* @param name - name of the test. *
* @param name
* - name of the test.
*/ */
public LanguageSettingsProviderReferencedProjectsTests(String name) { public LanguageSettingsProviderReferencedProjectsTests(String name) {
super(name); super(name);
@ -67,7 +71,8 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
/** /**
* main function of the class. * main function of the class.
* *
* @param args - arguments * @param args
* - arguments
*/ */
public static void main(String[] args) { public static void main(String[] args) {
junit.textui.TestRunner.run(suite()); junit.textui.TestRunner.run(suite());
@ -103,8 +108,13 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
ICConfigurationDescription[] cfgDescriptions = projectDescription.getConfigurations(); ICConfigurationDescription[] cfgDescriptions = projectDescription.getConfigurations();
ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ICConfigurationDescription cfgDescription = cfgDescriptions[0];
final ICConfigurationDescription cfgDescriptionReferenced = getConfigurationDescriptions(projectReferenced)[0]; final ICConfigurationDescription cfgDescriptionReferenced = getConfigurationDescriptions(
cfgDescription.setReferenceInfo(new HashMap<String, String>() {{ put(projectReferenced.getName(), cfgDescriptionReferenced.getId()); }}); projectReferenced)[0];
cfgDescription.setReferenceInfo(new HashMap<String, String>() {
{
put(projectReferenced.getName(), cfgDescriptionReferenced.getId());
}
});
coreModel.setProjectDescription(project, projectDescription); coreModel.setProjectDescription(project, projectDescription);
} }
@ -124,9 +134,10 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
* Test that null arguments don't crash the provider. * Test that null arguments don't crash the provider.
*/ */
public void testNulls() throws Exception { public void testNulls() throws Exception {
ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID); ILanguageSettingsProvider provider = LanguageSettingsManager
.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID);
assertNotNull(provider); assertNotNull(provider);
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> entries = provider.getSettingEntries((IBuildConfiguration) null, null, null);
assertEquals(null, entries); assertEquals(null, entries);
} }
@ -144,27 +155,34 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
// get cfgDescription // get cfgDescription
ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project);
ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ICConfigurationDescription cfgDescription = cfgDescriptions[0];
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
{ {
// double-check that provider for referenced projects is set in the configuration // double-check that provider for referenced projects is set in the configuration
ILanguageSettingsProvider refProjectsProvider = LanguageSettingsManager.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID); ILanguageSettingsProvider refProjectsProvider = LanguageSettingsManager
.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID);
assertNotNull(refProjectsProvider); assertNotNull(refProjectsProvider);
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
assertTrue(providers.contains(refProjectsProvider)); assertTrue(providers.contains(refProjectsProvider));
} }
// Check that no setting entries are set initially // Check that no setting entries are set initially
{ {
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(cfgDescription, project, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(config, project,
null, ICSettingEntry.ALL);
assertEquals(0, entries.size()); assertEquals(0, entries.size());
} }
// Add an entry into a non-referenced project // Add an entry into a non-referenced project
CIncludePathEntry nonRefEntry = CDataUtil.createCIncludePathEntry("non-referenced-exported", ICSettingEntry.EXPORTED); CIncludePathEntry nonRefEntry = CDataUtil.createCIncludePathEntry("non-referenced-exported",
ICSettingEntry.EXPORTED);
{ {
ICConfigurationDescription[] nonRefCfgDescriptions = getConfigurationDescriptions(nonReferencedProject); ICConfigurationDescription[] nonRefCfgDescriptions = getConfigurationDescriptions(nonReferencedProject);
ICConfigurationDescription nonRefCfgDescription = nonRefCfgDescriptions[0]; ICConfigurationDescription nonRefCfgDescription = nonRefCfgDescriptions[0];
List<ILanguageSettingsProvider> providersNonRef = ((ILanguageSettingsProvidersKeeper) nonRefCfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providersNonRef = ((ILanguageSettingsProvidersKeeper) nonRefCfgDescription)
.getLanguageSettingProviders();
// get user provider which is the first one // get user provider which is the first one
ILanguageSettingsProvider userProviderNonRef = providersNonRef.get(0); ILanguageSettingsProvider userProviderNonRef = providersNonRef.get(0);
assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderNonRef.getId()); assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderNonRef.getId());
@ -176,7 +194,8 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
} }
// Confirm that that does not add entries to the main project // Confirm that that does not add entries to the main project
{ {
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(cfgDescription, project, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(config, project,
null, ICSettingEntry.ALL);
assertEquals(0, entries.size()); assertEquals(0, entries.size());
} }
@ -185,7 +204,10 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
{ {
ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(referencedProject); ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(referencedProject);
ICConfigurationDescription refCfgDescription = refCfgDescriptions[0]; ICConfigurationDescription refCfgDescription = refCfgDescriptions[0];
List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription).getLanguageSettingProviders(); IBuildConfiguration refConfig = Adapters.adapt(refCfgDescription, IBuildConfiguration.class);
assertNotNull(refConfig);
List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription)
.getLanguageSettingProviders();
// get user provider which is the first one // get user provider which is the first one
ILanguageSettingsProvider userProviderRef = providersRef.get(0); ILanguageSettingsProvider userProviderRef = providersRef.get(0);
assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId()); assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId());
@ -196,12 +218,15 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
entries.add(refEntry); entries.add(refEntry);
entries.add(refEntryNotExported); entries.add(refEntryNotExported);
((LanguageSettingsGenericProvider) userProviderRef).setSettingEntries(null, null, null, entries); ((LanguageSettingsGenericProvider) userProviderRef).setSettingEntries(null, null, null, entries);
List<ICLanguageSettingEntry> entriesActual = LanguageSettingsManager.getSettingEntriesByKind(refCfgDescription, project, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entriesActual = LanguageSettingsManager.getSettingEntriesByKind(refConfig,
project, null, ICSettingEntry.ALL);
assertEquals(entries, entriesActual); assertEquals(entries, entriesActual);
} }
// Check that the new entries from referenced project made it to the main project // Check that the new entries from referenced project made it to the
// main project
{ {
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(cfgDescription, project, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(config, project,
null, ICSettingEntry.ALL);
assertEquals(CDataUtil.createCIncludePathEntry(refEntry.getName(), 0), entries.get(0)); assertEquals(CDataUtil.createCIncludePathEntry(refEntry.getName(), 0), entries.get(0));
assertEquals(1, entries.size()); assertEquals(1, entries.size());
} }
@ -222,30 +247,41 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
// get cfgDescriptions to work with // get cfgDescriptions to work with
ICConfigurationDescription[] cfgDescriptionsA = getConfigurationDescriptions(projectA); ICConfigurationDescription[] cfgDescriptionsA = getConfigurationDescriptions(projectA);
ICConfigurationDescription cfgDescriptionA = cfgDescriptionsA[0]; ICConfigurationDescription cfgDescriptionA = cfgDescriptionsA[0];
IBuildConfiguration configA = Adapters.adapt(cfgDescriptionA, IBuildConfiguration.class);
assertNotNull(configA);
ICConfigurationDescription[] cfgDescriptionsB = getConfigurationDescriptions(projectB); ICConfigurationDescription[] cfgDescriptionsB = getConfigurationDescriptions(projectB);
ICConfigurationDescription cfgDescriptionB = cfgDescriptionsB[0]; ICConfigurationDescription cfgDescriptionB = cfgDescriptionsB[0];
IBuildConfiguration configB = Adapters.adapt(cfgDescriptionB, IBuildConfiguration.class);
assertNotNull(configB);
// double-check that provider for referenced projects is set in the configurations // double-check that provider for referenced projects is set in the configurations
ILanguageSettingsProvider refProjectsProvider = LanguageSettingsManager.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID); ILanguageSettingsProvider refProjectsProvider = LanguageSettingsManager
.getWorkspaceProvider(ReferencedProjectsLanguageSettingsProvider.ID);
assertNotNull(refProjectsProvider); assertNotNull(refProjectsProvider);
List<ILanguageSettingsProvider> providersA = ((ILanguageSettingsProvidersKeeper) cfgDescriptionA).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providersA = ((ILanguageSettingsProvidersKeeper) cfgDescriptionA)
.getLanguageSettingProviders();
assertTrue(providersA.contains(refProjectsProvider)); assertTrue(providersA.contains(refProjectsProvider));
List<ILanguageSettingsProvider> providersB = ((ILanguageSettingsProvidersKeeper) cfgDescriptionB).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providersB = ((ILanguageSettingsProvidersKeeper) cfgDescriptionB)
.getLanguageSettingProviders();
assertTrue(providersB.contains(refProjectsProvider)); assertTrue(providersB.contains(refProjectsProvider));
// Check that no setting entries are set initially // Check that no setting entries are set initially
List<ICLanguageSettingEntry> entriesA = LanguageSettingsManager.getSettingEntriesByKind(cfgDescriptionA, projectA, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entriesA = LanguageSettingsManager.getSettingEntriesByKind(configA, projectA,
null, ICSettingEntry.ALL);
assertEquals(0, entriesA.size()); assertEquals(0, entriesA.size());
List<ICLanguageSettingEntry> entriesB = LanguageSettingsManager.getSettingEntriesByKind(cfgDescriptionA, projectB, null, ICSettingEntry.ALL); List<ICLanguageSettingEntry> entriesB = LanguageSettingsManager.getSettingEntriesByKind(configB, projectB,
null, ICSettingEntry.ALL);
assertEquals(0, entriesB.size()); assertEquals(0, entriesB.size());
} }
CIncludePathEntry entryExportedA = CDataUtil.createCIncludePathEntry("referenced-exported-A", ICSettingEntry.EXPORTED); CIncludePathEntry entryExportedA = CDataUtil.createCIncludePathEntry("referenced-exported-A",
ICSettingEntry.EXPORTED);
CIncludePathEntry entryNotExportedA = CDataUtil.createCIncludePathEntry("referenced-not-exported-A", 0); CIncludePathEntry entryNotExportedA = CDataUtil.createCIncludePathEntry("referenced-not-exported-A", 0);
// Add entries into a project A // Add entries into a project A
{ {
ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(projectA); ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(projectA);
ICConfigurationDescription refCfgDescription = refCfgDescriptions[0]; ICConfigurationDescription refCfgDescription = refCfgDescriptions[0];
List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription)
.getLanguageSettingProviders();
// get user provider which is the first one // get user provider which is the first one
ILanguageSettingsProvider userProviderRef = providersRef.get(0); ILanguageSettingsProvider userProviderRef = providersRef.get(0);
assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId()); assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId());
@ -257,13 +293,15 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
((LanguageSettingsGenericProvider) userProviderRef).setSettingEntries(null, null, null, entries); ((LanguageSettingsGenericProvider) userProviderRef).setSettingEntries(null, null, null, entries);
} }
CIncludePathEntry entryExportedB = CDataUtil.createCIncludePathEntry("referenced-exported-B", ICSettingEntry.EXPORTED); CIncludePathEntry entryExportedB = CDataUtil.createCIncludePathEntry("referenced-exported-B",
ICSettingEntry.EXPORTED);
CIncludePathEntry entryNotExportedB = CDataUtil.createCIncludePathEntry("referenced-not-exported-B", 0); CIncludePathEntry entryNotExportedB = CDataUtil.createCIncludePathEntry("referenced-not-exported-B", 0);
// Add entries into a project B // Add entries into a project B
{ {
ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(projectB); ICConfigurationDescription[] refCfgDescriptions = getConfigurationDescriptions(projectB);
ICConfigurationDescription refCfgDescription = refCfgDescriptions[0]; ICConfigurationDescription refCfgDescription = refCfgDescriptions[0];
List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> providersRef = ((ILanguageSettingsProvidersKeeper) refCfgDescription)
.getLanguageSettingProviders();
// get user provider which is the first one // get user provider which is the first one
ILanguageSettingsProvider userProviderRef = providersRef.get(0); ILanguageSettingsProvider userProviderRef = providersRef.get(0);
assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId()); assertEquals(ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID, userProviderRef.getId());
@ -279,7 +317,10 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
{ {
ICConfigurationDescription[] cfgDescriptionsA = getConfigurationDescriptions(projectA); ICConfigurationDescription[] cfgDescriptionsA = getConfigurationDescriptions(projectA);
ICConfigurationDescription cfgDescriptionA = cfgDescriptionsA[0]; ICConfigurationDescription cfgDescriptionA = cfgDescriptionsA[0];
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(cfgDescriptionA, projectA, null, ICSettingEntry.ALL); IBuildConfiguration configA = Adapters.adapt(cfgDescriptionA, IBuildConfiguration.class);
assertNotNull(configA);
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(configA, projectA,
null, ICSettingEntry.ALL);
assertEquals(entryExportedA, entries.get(0)); assertEquals(entryExportedA, entries.get(0));
assertEquals(entryNotExportedA, entries.get(1)); assertEquals(entryNotExportedA, entries.get(1));
assertEquals(CDataUtil.createCIncludePathEntry(entryExportedB.getName(), 0), entries.get(2)); assertEquals(CDataUtil.createCIncludePathEntry(entryExportedB.getName(), 0), entries.get(2));
@ -289,7 +330,9 @@ public class LanguageSettingsProviderReferencedProjectsTests extends BaseTestCas
{ {
ICConfigurationDescription[] cfgDescriptionsB = getConfigurationDescriptions(projectB); ICConfigurationDescription[] cfgDescriptionsB = getConfigurationDescriptions(projectB);
ICConfigurationDescription cfgDescriptionB = cfgDescriptionsB[0]; ICConfigurationDescription cfgDescriptionB = cfgDescriptionsB[0];
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(cfgDescriptionB, projectB, null, ICSettingEntry.ALL); IBuildConfiguration configB = Adapters.adapt(cfgDescriptionB, IBuildConfiguration.class);
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesByKind(configB, projectB,
null, ICSettingEntry.ALL);
assertEquals(entryExportedB, entries.get(0)); assertEquals(entryExportedB, entries.get(0));
assertEquals(entryNotExportedB, entries.get(1)); assertEquals(entryNotExportedB, entries.get(1));
assertEquals(CDataUtil.createCIncludePathEntry(entryExportedA.getName(), 0), entries.get(2)); assertEquals(CDataUtil.createCIncludePathEntry(entryExportedA.getName(), 0), entries.get(2));

View file

@ -15,8 +15,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.LanguageManager; import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.parser.ExtendedScannerInfo; import org.eclipse.cdt.core.parser.ExtendedScannerInfo;
@ -34,15 +32,19 @@ import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsScannerInfoProvider; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsScannerInfoProvider;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import junit.framework.TestSuite;
/** /**
* Test cases testing LanguageSettingsProvider functionality * Test cases testing LanguageSettingsProvider functionality
*/ */
@ -65,14 +67,17 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
} }
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
return entries; return entries;
} }
} }
/** /**
* Constructor. * Constructor.
* @param name - name of the test. *
* @param name
* - name of the test.
*/ */
public LanguageSettingsScannerInfoProviderTests(String name) { public LanguageSettingsScannerInfoProviderTests(String name) {
super(name); super(name);
@ -99,7 +104,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
/** /**
* main function of the class. * main function of the class.
* *
* @param args - arguments * @param args
* - arguments
*/ */
public static void main(String[] args) { public static void main(String[] args) {
junit.textui.TestRunner.run(suite()); junit.textui.TestRunner.run(suite());
@ -124,7 +130,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
} }
{ {
// triplecheck builderCWD for different project/configuration descriptions // triplecheck builderCWD for different project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, READ_ONLY); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, READ_ONLY);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -153,7 +160,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
{ {
// Handle prjDescription==null // Handle prjDescription==null
IProject project = FAKE_FILE.getProject(); IProject project = FAKE_FILE.getProject();
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, READ_ONLY); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, READ_ONLY);
assertNull(prjDescription); assertNull(prjDescription);
LanguageSettingsScannerInfoProvider scannerInfoProvider = new LanguageSettingsScannerInfoProvider(); LanguageSettingsScannerInfoProvider scannerInfoProvider = new LanguageSettingsScannerInfoProvider();
@ -171,7 +179,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
IFile file = ResourceHelper.createFile(project, "file"); IFile file = ResourceHelper.createFile(project, "file");
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, READ_ONLY); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, READ_ONLY);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -199,7 +208,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
IFile file = ResourceHelper.createFile(project, "file.c"); IFile file = ResourceHelper.createFile(project, "file.c");
// confirm that language==null // confirm that language==null
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, READ_ONLY); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
READ_ONLY);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -221,7 +231,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
public void testRegular() throws Exception { public void testRegular() throws Exception {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -293,7 +304,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
public void testLocal() throws Exception { public void testLocal() throws Exception {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -347,7 +359,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
public void testFramework() throws Exception { public void testFramework() throws Exception {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -390,7 +403,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
public void testDuplicate() throws Exception { public void testDuplicate() throws Exception {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -440,7 +454,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
public void testWorkspacePath() throws Exception { public void testWorkspacePath() throws Exception {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -467,9 +482,12 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// contribute the entries // contribute the entries
CIncludePathEntry incWorkspaceEntry_1 = new CIncludePathEntry(incWorkspace_1, 0); CIncludePathEntry incWorkspaceEntry_1 = new CIncludePathEntry(incWorkspace_1, 0);
CIncludePathEntry incWorkspaceEntry_2 = new CIncludePathEntry(incWorkspacePath_2, ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED); CIncludePathEntry incWorkspaceEntry_2 = new CIncludePathEntry(incWorkspacePath_2,
CIncludePathEntry incWorkspaceEntry_3 = new CIncludePathEntry(incWorkspaceRelativePath_3, ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED); ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED);
CIncludePathEntry incWorkspaceEntry_4 = new CIncludePathEntry(incWorkspacePathNoResolved_4, ICSettingEntry.VALUE_WORKSPACE_PATH); CIncludePathEntry incWorkspaceEntry_3 = new CIncludePathEntry(incWorkspaceRelativePath_3,
ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED);
CIncludePathEntry incWorkspaceEntry_4 = new CIncludePathEntry(incWorkspacePathNoResolved_4,
ICSettingEntry.VALUE_WORKSPACE_PATH);
CIncludePathEntry incFilesystemEntry = new CIncludePathEntry(incFilesystem, 0); CIncludePathEntry incFilesystemEntry = new CIncludePathEntry(incFilesystem, 0);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -511,12 +529,13 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// change drive on build working directory // change drive on build working directory
String buildCwdDevice = project.getLocation().getDevice(); String buildCwdDevice = project.getLocation().getDevice();
// // Test manually with a device which is different from project location device (path should exist) // Test manually with a device which is different from project location device (path should exist)
// IPath buildCWD = new Path("D:/build/path"); // IPath buildCWD = new Path("D:/build/path");
// String buildCwdDevice = buildCWD.getDevice(); // String buildCwdDevice = buildCWD.getDevice();
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -563,12 +582,14 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
IFolder relativeFolder = ResourceHelper.createFolder(project, "buildDir/" + relativePath); IFolder relativeFolder = ResourceHelper.createFolder(project, "buildDir/" + relativePath);
IFolder relativeFolderProjName = ResourceHelper.createFolder(project, "buildDir/" + prjName); IFolder relativeFolderProjName = ResourceHelper.createFolder(project, "buildDir/" + prjName);
String markedResolved = "-MarkedResolved"; String markedResolved = "-MarkedResolved";
IFolder relativeFolderProjNameResolved = ResourceHelper.createFolder(project, "buildDir/" + prjName+markedResolved); IFolder relativeFolderProjNameResolved = ResourceHelper.createFolder(project,
"buildDir/" + prjName + markedResolved);
IPath buildCWD = buildFolder.getLocation(); IPath buildCWD = buildFolder.getLocation();
setBuilderCWD(project, buildCWD); setBuilderCWD(project, buildCWD);
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -580,7 +601,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// contribute the entries // contribute the entries
CIncludePathEntry incRelativeEntry = new CIncludePathEntry(new Path(relativePath), 0); CIncludePathEntry incRelativeEntry = new CIncludePathEntry(new Path(relativePath), 0);
CIncludePathEntry incProjNameEntry = new CIncludePathEntry(new Path("${ProjName}"), 0); CIncludePathEntry incProjNameEntry = new CIncludePathEntry(new Path("${ProjName}"), 0);
CIncludePathEntry incProjNameMarkedResolvedEntry = new CIncludePathEntry(new Path("${ProjName}"+markedResolved), ICSettingEntry.RESOLVED); CIncludePathEntry incProjNameMarkedResolvedEntry = new CIncludePathEntry(
new Path("${ProjName}" + markedResolved), ICSettingEntry.RESOLVED);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(incRelativeEntry); entries.add(incRelativeEntry);
entries.add(incProjNameEntry); entries.add(incProjNameEntry);
@ -638,7 +660,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
IFolder incFolder_dotdot_slash_path = ResourceHelper.createFolder(project, "include2"); // "/ProjPath/buildDir/../include2" IFolder incFolder_dotdot_slash_path = ResourceHelper.createFolder(project, "include2"); // "/ProjPath/buildDir/../include2"
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -649,13 +672,17 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// contribute the entries // contribute the entries
CIncludePathEntry incRelativeEntry_dot = new CIncludePathEntry(new Path(relativePath_dot), 0); CIncludePathEntry incRelativeEntry_dot = new CIncludePathEntry(new Path(relativePath_dot), 0);
CIncludePathEntry incRelativeEntry_dot_slash_path = new CIncludePathEntry(new Path(relativePath_dot_slash_path), 0); CIncludePathEntry incRelativeEntry_dot_slash_path = new CIncludePathEntry(new Path(relativePath_dot_slash_path),
0);
CIncludePathEntry incRelativeEntry_dotdot = new CIncludePathEntry(new Path(relativePath_dotdot), 0); CIncludePathEntry incRelativeEntry_dotdot = new CIncludePathEntry(new Path(relativePath_dotdot), 0);
CIncludePathEntry incRelativeEntry_dotdot_slash_path = new CIncludePathEntry(new Path(relativePath_dotdot_slash_path), 0); CIncludePathEntry incRelativeEntry_dotdot_slash_path = new CIncludePathEntry(
new Path(relativePath_dotdot_slash_path), 0);
CIncludePathEntry incEntry_dotdot_path = new CIncludePathEntry(locationPath_dotdot_path, 0); CIncludePathEntry incEntry_dotdot_path = new CIncludePathEntry(locationPath_dotdot_path, 0);
// use LOCAL flag not to clash with plain dot entries // use LOCAL flag not to clash with plain dot entries
CIncludePathEntry incRelativeEntry_dotdot_slash = new CIncludePathEntry(new Path(relativePath_dotdot_slash), ICSettingEntry.LOCAL); CIncludePathEntry incRelativeEntry_dotdot_slash = new CIncludePathEntry(new Path(relativePath_dotdot_slash),
CIncludePathEntry incRelativeEntry_dot_slash = new CIncludePathEntry(new Path(relativePath_dot_slash), ICSettingEntry.LOCAL); ICSettingEntry.LOCAL);
CIncludePathEntry incRelativeEntry_dot_slash = new CIncludePathEntry(new Path(relativePath_dot_slash),
ICSettingEntry.LOCAL);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(incRelativeEntry_dot); entries.add(incRelativeEntry_dot);
@ -721,7 +748,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
String envPathStr = "${ProjDirPath}/Folder"; String envPathStr = "${ProjDirPath}/Folder";
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -768,7 +796,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
} }
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (this.rc.equals(rc)) if (this.rc.equals(rc))
return entries; return entries;
return null; return null;
@ -777,11 +806,14 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// create a project // create a project
IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); IProject project = ResourceHelper.createCDTProjectWithConfig(getName());
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper); assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
assertNotNull(config);
// sample file // sample file
IFolder parentFolder = ResourceHelper.createFolder(project, "ParentFolder"); IFolder parentFolder = ResourceHelper.createFolder(project, "ParentFolder");
@ -796,8 +828,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
// add provider for parent folder // add provider for parent folder
ILanguageSettingsProvider provider = new MockProviderForResource(parentFolder, entries); ILanguageSettingsProvider provider = new MockProviderForResource(parentFolder, entries);
assertNull(provider.getSettingEntries(cfgDescription, file, null)); assertNull(provider.getSettingEntries(config, file, null));
assertEquals(includePathEntry, provider.getSettingEntries(cfgDescription, parentFolder, null).get(0)); assertEquals(includePathEntry, provider.getSettingEntries(config, parentFolder, null).get(0));
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>();
providers.add(provider); providers.add(provider);
@ -825,7 +857,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
String envPathStr = "${ProjDirPath}/Folder"; String envPathStr = "${ProjDirPath}/Folder";
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);
@ -893,7 +926,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
} }
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (langId == null || langId.equals(languageId)) if (langId == null || langId.equals(languageId))
return entries; return entries;
return new ArrayList<ICLanguageSettingEntry>(); return new ArrayList<ICLanguageSettingEntry>();
@ -909,7 +943,8 @@ public class LanguageSettingsScannerInfoProviderTests extends BaseTestCase {
IFolder incFolderC = ResourceHelper.createFolder(project, "includeC"); IFolder incFolderC = ResourceHelper.createFolder(project, "includeC");
// get project/configuration descriptions // get project/configuration descriptions
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, WRITEABLE); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project,
WRITEABLE);
assertNotNull(prjDescription); assertNotNull(prjDescription);
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
assertNotNull(cfgDescription); assertNotNull(cfgDescription);

View file

@ -14,8 +14,6 @@ package org.eclipse.cdt.core.language.settings.providers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.settings.model.CIncludeFileEntry; import org.eclipse.cdt.core.settings.model.CIncludeFileEntry;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.CLibraryFileEntry; import org.eclipse.cdt.core.settings.model.CLibraryFileEntry;
@ -29,15 +27,21 @@ import org.eclipse.cdt.core.testplugin.CModelMock;
import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import junit.framework.TestSuite;
/** /**
* Test cases testing serialization of LanguageSettingsProviders. * Test cases testing serialization of LanguageSettingsProviders.
*/ */
@ -67,7 +71,9 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
/** /**
* Constructor. * Constructor.
* @param name - name of the test. *
* @param name
* - name of the test.
*/ */
public LanguageSettingsSerializableProviderTests(String name) { public LanguageSettingsSerializableProviderTests(String name) {
super(name); super(name);
@ -77,6 +83,18 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
@Override
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
CModelMock.DummyCConfigurationDescription cfgDesc = (CModelMock.DummyCConfigurationDescription) adaptableObject;
return (T) new CModelMock.DummyBuildConfiguration(cfgDesc);
}
@Override
public Class<?>[] getAdapterList() {
return new Class<?>[] { IBuildConfiguration.class };
}
}, CModelMock.DummyCConfigurationDescription.class);
} }
@Override @Override
@ -94,7 +112,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
/** /**
* main function of the class. * main function of the class.
* *
* @param args - arguments * @param args
* - arguments
*/ */
public static void main(String[] args) { public static void main(String[] args) {
junit.textui.TestRunner.run(suite()); junit.textui.TestRunner.run(suite());
@ -111,7 +130,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
languages.add(LANG_ID); languages.add(LANG_ID);
// create a provider // create a provider
LanguageSettingsSerializableProvider mockProvider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider mockProvider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
// test isEmpty() // test isEmpty()
assertTrue(mockProvider.isEmpty()); assertTrue(mockProvider.isEmpty());
@ -144,7 +164,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
*/ */
public void testProvider_SetStoringEntriesInProjectArea() throws Exception { public void testProvider_SetStoringEntriesInProjectArea() throws Exception {
// create a provider // create a provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider));
LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true);
@ -160,7 +181,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create customized provider // create customized provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true);
provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
@ -208,7 +230,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create customized provider // create customized provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true);
provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
@ -256,7 +279,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element rootElement; Element rootElement;
{ {
// create customized provider // create customized provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true);
provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
@ -284,7 +308,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_2, PROVIDER_NAME_2); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_2,
PROVIDER_NAME_2);
provider.loadEntries(rootElement); provider.loadEntries(rootElement);
assertEquals(PROVIDER_2, provider.getId()); assertEquals(PROVIDER_2, provider.getId());
assertEquals(PROVIDER_NAME_2, provider.getName()); assertEquals(PROVIDER_NAME_2, provider.getName());
@ -309,7 +334,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create null provider // create null provider
LanguageSettingsSerializableProvider providerNull = new LanguageSettingsSerializableProvider(PROVIDER_NULL, PROVIDER_NAME_NULL); LanguageSettingsSerializableProvider providerNull = new LanguageSettingsSerializableProvider(PROVIDER_NULL,
PROVIDER_NAME_NULL);
assertNull(providerNull.getSettingEntries(null, null, null)); assertNull(providerNull.getSettingEntries(null, null, null));
// set and get null entries // set and get null entries
providerNull.setSettingEntries(null, null, null, null); providerNull.setSettingEntries(null, null, null, null);
@ -337,7 +363,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create provider with custom parameter // create provider with custom parameter
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER)); assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER));
@ -361,7 +388,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create provider storing entries in project area // create provider storing entries in project area
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider));
LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true);
assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider));
@ -391,7 +419,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create provider with custom language scope // create provider with custom language scope
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setLanguageScope(expectedLanguageIds); provider.setLanguageScope(expectedLanguageIds);
List<String> actualIds = provider.getLanguageScope(); List<String> actualIds = provider.getLanguageScope();
assertEquals(LANG_ID, actualIds.get(0)); assertEquals(LANG_ID, actualIds.get(0));
@ -431,7 +460,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
Element elementProvider; Element elementProvider;
{ {
// create provider with no scope by default // create provider with no scope by default
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
// set entries for the whole language scope (now langId=null) // set entries for the whole language scope (now langId=null)
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
{ {
@ -511,7 +541,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, MOCK_RC, LANG_ID, entries); provider.setSettingEntries(null, MOCK_RC, LANG_ID, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -536,13 +567,16 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
*/ */
public void testNullLanguageDOM() throws Exception { public void testNullLanguageDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
Element elementProvider; Element elementProvider;
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
provider.setSettingEntries(MOCK_CFG, MOCK_RC, null, entries); PROVIDER_NAME_1);
provider.setSettingEntries(config, MOCK_RC, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
@ -556,12 +590,11 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider);
assertEquals(PROVIDER_1, provider.getId()); assertEquals(PROVIDER_1, provider.getId());
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(MOCK_CFG, MOCK_RC, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(config, MOCK_RC, null);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
} }
} }
/** /**
* Test serialization of entries when language scope is null. * Test serialization of entries when language scope is null.
*/ */
@ -572,11 +605,15 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
List<ICLanguageSettingEntry> entriesLanguage = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entriesLanguage = new ArrayList<ICLanguageSettingEntry>();
entriesLanguage.add(new CIncludePathEntry("path", 0)); entriesLanguage.add(new CIncludePathEntry("path", 0));
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
Element elementProvider; Element elementProvider;
{ {
// create a provider // create a provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
assertEquals(null, provider.getLanguageScope()); assertEquals(null, provider.getLanguageScope());
// add null language // add null language
@ -596,7 +633,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
} }
// add non-null language // add non-null language
provider.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, entriesLanguage); provider.setSettingEntries(config, MOCK_RC, LANG_ID, entriesLanguage);
assertNull(provider.getLanguageScope()); assertNull(provider.getLanguageScope());
{ {
// getter by null language // getter by null language
@ -644,12 +681,15 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
public void testNullResourceDOM() throws Exception { public void testNullResourceDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
provider.setSettingEntries(MOCK_CFG, null, LANG_ID, entries); PROVIDER_NAME_1);
provider.setSettingEntries(config, null, LANG_ID, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
@ -663,7 +703,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider);
assertEquals(PROVIDER_1, provider.getId()); assertEquals(PROVIDER_1, provider.getId());
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(MOCK_CFG, null, LANG_ID); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(config, null, LANG_ID);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
} }
} }
@ -678,7 +718,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, MOCK_RC, null, entries); provider.setSettingEntries(null, MOCK_RC, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -709,7 +750,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, LANG_ID, entries); provider.setSettingEntries(null, null, LANG_ID, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -736,12 +778,15 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
public void testNullLanguageResourceDOM() throws Exception { public void testNullLanguageResourceDOM() throws Exception {
// provider/configuration/language/resource/settingEntry // provider/configuration/language/resource/settingEntry
Element elementProvider; Element elementProvider;
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
entries.add(new CIncludePathEntry("path0", 0)); entries.add(new CIncludePathEntry("path0", 0));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
provider.setSettingEntries(MOCK_CFG, null, null, entries); PROVIDER_NAME_1);
provider.setSettingEntries(config, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST);
@ -756,7 +801,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider);
assertEquals(PROVIDER_1, provider.getId()); assertEquals(PROVIDER_1, provider.getId());
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(MOCK_CFG, null, null); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(config, null, null);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
} }
} }
@ -772,7 +817,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludePathEntry("path0", flag)); entries.add(new CIncludePathEntry("path0", flag));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -804,7 +850,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludePathEntry("path0", 1)); entries.add(new CIncludePathEntry("path0", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -838,7 +885,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CIncludeFileEntry("a-path", 1)); entries.add(new CIncludeFileEntry("a-path", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -871,7 +919,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CMacroEntry("MACRO0", "value0", 1)); entries.add(new CMacroEntry("MACRO0", "value0", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -904,7 +953,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CMacroFileEntry("a-path", 1)); entries.add(new CMacroFileEntry("a-path", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -937,7 +987,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CLibraryPathEntry("a-path", 1)); entries.add(new CLibraryPathEntry("a-path", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -970,7 +1021,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CLibraryFileEntry("a-path", 1)); entries.add(new CLibraryFileEntry("a-path", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -1005,7 +1057,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
entries.add(new CMacroEntry("MACRO0", "value0", 1)); entries.add(new CMacroEntry("MACRO0", "value0", 1));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -1039,11 +1092,11 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
| ICSettingEntry.RESOLVED | ICSettingEntry.RESOLVED
| ICSettingEntry.UNDEFINED | ICSettingEntry.UNDEFINED
| ICSettingEntry.FRAMEWORKS_MAC | ICSettingEntry.FRAMEWORKS_MAC
| ICSettingEntry.EXPORTED | ICSettingEntry.EXPORTED));
));
{ {
// create a provider and serialize its settings // create a provider and serialize its settings
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, entries); provider.setSettingEntries(null, null, null, entries);
Document doc = XmlUtil.newDocument(); Document doc = XmlUtil.newDocument();
@ -1093,7 +1146,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(
elementProvider);
List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, null, null);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
@ -1132,7 +1186,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(
elementProvider);
List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, null, LANG_ID_1); List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, null, LANG_ID_1);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
@ -1179,7 +1234,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
} }
{ {
// re-load and check language settings of the newly loaded provider // re-load and check language settings of the newly loaded provider
LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(elementProvider); LanguageSettingsSerializableProvider loadedProvider = new LanguageSettingsSerializableProvider(
elementProvider);
List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, rc1, null); List<ICLanguageSettingEntry> actual = loadedProvider.getSettingEntries(null, rc1, null);
assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.get(0), actual.get(0));
@ -1205,7 +1261,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
assertNotNull(emptySettingsPath); assertNotNull(emptySettingsPath);
// Create provider // Create provider
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
// store the entries in parent folder // store the entries in parent folder
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
@ -1230,7 +1287,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
{ {
// retrieve entries for not related resource // retrieve entries for not related resource
IFile notRelated = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/AnotherFolder/Subfolder/resource")); IFile notRelated = ResourcesPlugin.getWorkspace().getRoot()
.getFile(new Path("/AnotherFolder/Subfolder/resource"));
List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, notRelated, LANG_ID); List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, notRelated, LANG_ID);
assertEquals(null, actual); assertEquals(null, actual);
} }
@ -1247,6 +1305,9 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
* Test equals() and hashCode(). * Test equals() and hashCode().
*/ */
public void testEquals() throws Exception { public void testEquals() throws Exception {
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
// create sample entries // create sample entries
List<ICLanguageSettingEntry> sampleEntries_1 = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> sampleEntries_1 = new ArrayList<ICLanguageSettingEntry>();
sampleEntries_1.add(new CMacroEntry("MACRO0", "value0", 1)); sampleEntries_1.add(new CMacroEntry("MACRO0", "value0", 1));
@ -1261,21 +1322,23 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
sampleLanguages.add(LANG_ID); sampleLanguages.add(LANG_ID);
// create a model provider // create a model provider
LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider1.setLanguageScope(sampleLanguages); provider1.setLanguageScope(sampleLanguages);
provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1));
LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true);
provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(config, MOCK_RC, LANG_ID, sampleEntries_1);
provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2);
// create another provider with the same data // create another provider with the same data
LanguageSettingsSerializableProvider provider2 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider2 = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
{ {
provider2.setLanguageScope(sampleLanguages); provider2.setLanguageScope(sampleLanguages);
provider2.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider2.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
LanguageSettingsManager.setStoringEntriesInProjectArea(provider2, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider2, true);
provider2.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider2.setSettingEntries(config, MOCK_RC, LANG_ID, sampleEntries_1);
provider2.setSettingEntries(null, null, LANG_ID, sampleEntries_2); provider2.setSettingEntries(null, null, LANG_ID, sampleEntries_2);
// All set now, so they should be equal // All set now, so they should be equal
assertTrue(provider1.hashCode() == provider2.hashCode()); assertTrue(provider1.hashCode() == provider2.hashCode());
@ -1331,11 +1394,11 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
// replace entries // replace entries
List<ICLanguageSettingEntry> changedEntries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> changedEntries = new ArrayList<ICLanguageSettingEntry>();
changedEntries.add(new CMacroEntry("MACROX", "valueX", 1)); changedEntries.add(new CMacroEntry("MACROX", "valueX", 1));
provider2.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, changedEntries); provider2.setSettingEntries(config, MOCK_RC, LANG_ID, changedEntries);
assertFalse(provider1.hashCode() == provider2.hashCode()); assertFalse(provider1.hashCode() == provider2.hashCode());
assertFalse(provider1.equals(provider2)); assertFalse(provider1.equals(provider2));
// restore provider // restore provider
provider2.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider2.setSettingEntries(config, MOCK_RC, LANG_ID, sampleEntries_1);
assertTrue(provider1.hashCode() == provider2.hashCode()); assertTrue(provider1.hashCode() == provider2.hashCode());
assertTrue(provider1.equals(provider2)); assertTrue(provider1.equals(provider2));
} }
@ -1357,8 +1420,10 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
{ {
// check that subclasses are not equal // check that subclasses are not equal
LanguageSettingsSerializableProvider providerSub1 = new LanguageSettingsSerializableProvider() {}; LanguageSettingsSerializableProvider providerSub1 = new LanguageSettingsSerializableProvider() {
LanguageSettingsSerializableProvider providerSub2 = new LanguageSettingsSerializableProvider() {}; };
LanguageSettingsSerializableProvider providerSub2 = new LanguageSettingsSerializableProvider() {
};
assertFalse(providerSub1.hashCode() == providerSub2.hashCode()); assertFalse(providerSub1.hashCode() == providerSub2.hashCode());
assertFalse(providerSub1.equals(providerSub2)); assertFalse(providerSub1.equals(providerSub2));
} }
@ -1369,8 +1434,10 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
*/ */
public void testEquals_DefaultProperties() throws Exception { public void testEquals_DefaultProperties() throws Exception {
// create model providers // create model providers
LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1,
LanguageSettingsSerializableProvider provider2 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); PROVIDER_NAME_1);
LanguageSettingsSerializableProvider provider2 = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
// equality for setProperty(String, String) // equality for setProperty(String, String)
{ {
@ -1415,6 +1482,9 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
* Test cloning of provider. * Test cloning of provider.
*/ */
public void testClone() throws Exception { public void testClone() throws Exception {
IBuildConfiguration config = Adapters.adapt(MOCK_CFG, IBuildConfiguration.class);
assertNotNull(config);
// define sample data // define sample data
List<ICLanguageSettingEntry> sampleEntries_1 = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> sampleEntries_1 = new ArrayList<ICLanguageSettingEntry>();
sampleEntries_1.add(new CIncludePathEntry("path0", 1)); sampleEntries_1.add(new CIncludePathEntry("path0", 1));
@ -1432,6 +1502,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
public MockSerializableProvider(String id, String name) { public MockSerializableProvider(String id, String name) {
super(id, name); super(id, name);
} }
@Override @Override
public MockSerializableProvider clone() throws CloneNotSupportedException { public MockSerializableProvider clone() throws CloneNotSupportedException {
return (MockSerializableProvider) super.clone(); return (MockSerializableProvider) super.clone();
@ -1443,7 +1514,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER);
assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1));
LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true);
provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(config, MOCK_RC, LANG_ID, sampleEntries_1);
provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2);
// clone provider // clone provider
@ -1457,14 +1528,17 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
provider1.setProperty(ATTR_PARAMETER, ""); provider1.setProperty(ATTR_PARAMETER, "");
assertFalse(provider1.getProperty(ATTR_PARAMETER).equals(providerClone.getProperty(ATTR_PARAMETER))); assertFalse(provider1.getProperty(ATTR_PARAMETER).equals(providerClone.getProperty(ATTR_PARAMETER)));
assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1),
LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone));
// ensure we did not clone reference // ensure we did not clone reference
LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, !LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1,
assertFalse(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1) == LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); !LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone));
assertFalse(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1) == LanguageSettingsManager
.isStoringEntriesInProjectArea(providerClone));
assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0));
List<ICLanguageSettingEntry> actual1 = providerClone.getSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID); List<ICLanguageSettingEntry> actual1 = providerClone.getSettingEntries(config, MOCK_RC, LANG_ID);
assertNotSame(sampleEntries_1, actual1); assertNotSame(sampleEntries_1, actual1);
assertEquals(sampleEntries_1.get(0), actual1.get(0)); assertEquals(sampleEntries_1.get(0), actual1.get(0));
assertEquals(sampleEntries_1.get(1), actual1.get(1)); assertEquals(sampleEntries_1.get(1), actual1.get(1));
@ -1490,6 +1564,7 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
public MockSerializableProvider(String id, String name) { public MockSerializableProvider(String id, String name) {
super(id, name); super(id, name);
} }
@Override @Override
public MockSerializableProvider cloneShallow() throws CloneNotSupportedException { public MockSerializableProvider cloneShallow() throws CloneNotSupportedException {
return (MockSerializableProvider) super.cloneShallow(); return (MockSerializableProvider) super.cloneShallow();
@ -1512,7 +1587,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
assertFalse(provider1.equals(providerClone)); assertFalse(provider1.equals(providerClone));
assertTrue(provider1.getClass() == providerClone.getClass()); assertTrue(provider1.getClass() == providerClone.getClass());
assertEquals(provider1.getProperty(ATTR_PARAMETER), providerClone.getProperty(ATTR_PARAMETER)); assertEquals(provider1.getProperty(ATTR_PARAMETER), providerClone.getProperty(ATTR_PARAMETER));
assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1),
LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone));
assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0));
List<ICLanguageSettingEntry> actual = providerClone.getSettingEntries(null, null, null); List<ICLanguageSettingEntry> actual = providerClone.getSettingEntries(null, null, null);
@ -1553,7 +1629,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
unsortedEntries.add(libraryPathEntry2); unsortedEntries.add(libraryPathEntry2);
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly
@ -1611,7 +1688,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
unsortedEntries.add(libraryPathEntry2); unsortedEntries.add(libraryPathEntry2);
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly
@ -1654,7 +1732,8 @@ public class LanguageSettingsSerializableProviderTests extends BaseTestCase {
unsortedEntries.add(macroEntry2C); unsortedEntries.add(macroEntry2C);
// create a provider and set the entries // create a provider and set the entries
LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1,
PROVIDER_NAME_1);
provider.setSettingEntries(null, null, null, unsortedEntries); provider.setSettingEntries(null, null, null, unsortedEntries);
// retrieve and check that language settings got sorted properly // retrieve and check that language settings got sorted properly

View file

@ -14,8 +14,8 @@ package org.eclipse.cdt.core.language.settings.providers;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.AbstractExecutableExtensionBase; import org.eclipse.cdt.core.AbstractExecutableExtensionBase;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
/** /**
@ -23,7 +23,7 @@ import org.eclipse.core.resources.IResource;
*/ */
public class MockLanguageSettingsProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider { public class MockLanguageSettingsProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc, String languageId) {
return null; return null;
} }
} }

View file

@ -32,6 +32,7 @@ import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting;
import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.WriteAccessException;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -42,8 +43,8 @@ import org.eclipse.core.runtime.QualifiedName;
*/ */
public class CModelMock { public class CModelMock {
/** /**
* Dummy implementation of ICProjectDescription for testing. * Dummy implementation of ICProjectDescription for testing. Feel free to
* Feel free to override the methods you are interested to mock. * override the methods you are interested to mock.
*/ */
public static class DummyCProjectDescription implements ICProjectDescription { public static class DummyCProjectDescription implements ICProjectDescription {
@ -88,8 +89,7 @@ public class CModelMock {
} }
@Override @Override
public ICStorageElement getStorage(String id, boolean create) public ICStorageElement getStorage(String id, boolean create) throws CoreException {
throws CoreException {
return null; return null;
} }
@ -136,20 +136,17 @@ public class CModelMock {
} }
@Override @Override
public void setActiveConfiguration(ICConfigurationDescription cfg) public void setActiveConfiguration(ICConfigurationDescription cfg) throws WriteAccessException {
throws WriteAccessException {
} }
@Override @Override
public ICConfigurationDescription createConfiguration(String id, public ICConfigurationDescription createConfiguration(String id, String name, ICConfigurationDescription base)
String name, ICConfigurationDescription base)
throws CoreException, WriteAccessException { throws CoreException, WriteAccessException {
return null; return null;
} }
@Override @Override
public ICConfigurationDescription createConfiguration( public ICConfigurationDescription createConfiguration(String buildSystemId, CConfigurationData data)
String buildSystemId, CConfigurationData data)
throws CoreException, WriteAccessException { throws CoreException, WriteAccessException {
return null; return null;
} }
@ -165,13 +162,11 @@ public class CModelMock {
} }
@Override @Override
public void removeConfiguration(String name) public void removeConfiguration(String name) throws WriteAccessException {
throws WriteAccessException {
} }
@Override @Override
public void removeConfiguration(ICConfigurationDescription cfg) public void removeConfiguration(ICConfigurationDescription cfg) throws WriteAccessException {
throws WriteAccessException {
} }
@Override @Override
@ -200,8 +195,7 @@ public class CModelMock {
} }
@Override @Override
public void setDefaultSettingConfiguration( public void setDefaultSettingConfiguration(ICConfigurationDescription cfg) {
ICConfigurationDescription cfg) {
} }
@Override @Override
@ -216,8 +210,8 @@ public class CModelMock {
} }
/** /**
* Dummy implementation of ICConfigurationDescription for testing. * Dummy implementation of ICConfigurationDescription for testing. Feel free
* Feel free to override the methods you are interested to mock. * to override the methods you are interested to mock.
*/ */
public static class DummyCConfigurationDescription implements ICConfigurationDescription { public static class DummyCConfigurationDescription implements ICConfigurationDescription {
private String id; private String id;
@ -267,8 +261,7 @@ public class CModelMock {
} }
@Override @Override
public ICStorageElement getStorage(String id, boolean create) public ICStorageElement getStorage(String id, boolean create) throws CoreException {
throws CoreException {
return null; return null;
} }
@ -326,27 +319,23 @@ public class CModelMock {
} }
@Override @Override
public ICResourceDescription getResourceDescription(IPath path, public ICResourceDescription getResourceDescription(IPath path, boolean exactPath) {
boolean exactPath) {
return null; return null;
} }
@Override @Override
public void removeResourceDescription(ICResourceDescription des) public void removeResourceDescription(ICResourceDescription des) throws CoreException, WriteAccessException {
}
@Override
public ICFileDescription createFileDescription(IPath path, ICResourceDescription base)
throws CoreException, WriteAccessException { throws CoreException, WriteAccessException {
}
@Override
public ICFileDescription createFileDescription(IPath path,
ICResourceDescription base) throws CoreException,
WriteAccessException {
return null; return null;
} }
@Override @Override
public ICFolderDescription createFolderDescription(IPath path, public ICFolderDescription createFolderDescription(IPath path, ICFolderDescription base)
ICFolderDescription base) throws CoreException, throws CoreException, WriteAccessException {
WriteAccessException {
return null; return null;
} }
@ -407,9 +396,8 @@ public class CModelMock {
} }
@Override @Override
public ICExternalSetting createExternalSetting(String[] languageIDs, public ICExternalSetting createExternalSetting(String[] languageIDs, String[] contentTypeIds,
String[] contentTypeIds, String[] extensions, String[] extensions, ICSettingEntry[] entries) throws WriteAccessException {
ICSettingEntry[] entries) throws WriteAccessException {
return null; return null;
} }
@ -489,6 +477,37 @@ public class CModelMock {
public CConfigurationStatus getConfigurationStatus() { public CConfigurationStatus getConfigurationStatus() {
return null; return null;
} }
}
public static class DummyBuildConfiguration implements IBuildConfiguration {
private final DummyCConfigurationDescription desc;
public DummyBuildConfiguration(DummyCConfigurationDescription desc) {
this.desc = desc;
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter.isInstance(desc)) {
return (T) desc;
}
return null;
}
@Override
public IProject getProject() {
ICProjectDescription projDesc = desc.getProjectDescription();
if (projDesc != null) {
return projDesc.getProject();
} else {
return null;
}
}
@Override
public String getName() {
return desc.getName();
}
} }
} }

View file

@ -78,287 +78,4 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=110
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

View file

@ -1,4 +1,3 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
formatter_profile=_CDT
formatter_settings_version=12 formatter_settings_version=12
internal.default.compliance=user internal.default.compliance=user

View file

@ -10,32 +10,21 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.language.settings.providers; package org.eclipse.cdt.core.language.settings.providers;
import java.util.List;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IResource;
/** /**
* This interface is to be implemented by providers which want to broadcast the changes in their setting entries * This interface is to be implemented by providers which want to broadcast the changes in their
* with {@link ILanguageSettingsChangeEvent}. * setting entries with {@link ILanguageSettingsChangeEvent}.
* *
* @since 5.4 * @since 5.4
*/ */
public interface ILanguageSettingsBroadcastingProvider extends ILanguageSettingsProvider { public interface ILanguageSettingsBroadcastingProvider extends ILanguageSettingsProvider {
@Override
public String getId();
@Override
public String getName();
@Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId);
/** /**
* Return a copy of internal storage. This should be a deep copy/clone of the storage. * Return a copy of internal storage. This should be a deep copy/clone of the storage. It is
* It is used to calculate the delta and being kept in the last state object of configuration * used to calculate the delta and being kept in the last state object of configuration
* description to compare to a new state later. * description to compare to a new state later.
* *
* @return a copy of internal storage. * @return a copy of internal storage.
*/ */
public LanguageSettingsStorage copyStorage(); public LanguageSettingsStorage copyStorage();
} }

View file

@ -14,42 +14,67 @@ import java.util.List;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
/** /**
* This interface is used in UI to identify classes allowing user to modify settings externally * This interface is used in UI to identify classes allowing user to modify settings externally
* contrary to some subclasses of {@link LanguageSettingsSerializableProvider} managing * contrary to some subclasses of {@link LanguageSettingsSerializableProvider} managing their
* their settings themselves and not providing such option to the user. * settings themselves and not providing such option to the user.
* *
* @since 5.4 * @since 5.4
*/ */
public interface ILanguageSettingsEditableProvider extends ILanguageSettingsBroadcastingProvider, Cloneable { public interface ILanguageSettingsEditableProvider extends ILanguageSettingsBroadcastingProvider, Cloneable {
@Override
public String getId();
@Override
public String getName();
@Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId);
/** /**
* Sets language settings entries for the provider. * Sets language settings entries for the provider.
* *
* @param cfgDescription - configuration description. * @param config
* @param rc - resource such as file or folder. If {@code null} the entries are * configuration.
* considered to be being defined as default entries for resources. * @param rc
* @param languageId - language id. If {@code null}, then entries are considered * resource such as file or folder. If {@code null} the entries are considered to be
* to be defined as default entries for languages. * being defined as default entries for resources.
* @param entries - language settings entries to set. * @param languageId
* language id. If {@code null}, then entries are considered to be defined as default
* entries for languages.
* @param entries
* language settings entries to set.
* @since 6.0
*/ */
public void setSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId, default public void setSettingEntries(IBuildConfiguration config, IResource rc, String languageId,
List<? extends ICLanguageSettingEntry> entries); List<? extends ICLanguageSettingEntry> entries) {
// Call the old method by default
setSettingEntries(config.getAdapter(ICConfigurationDescription.class), rc, languageId, entries);
}
/** /**
* Shallow clone of the provider. "Shallow" is defined here as the exact copy except that * Sets language settings entries for the provider.
* the copy will have zero language settings entries. *
* @param cfgDescription
* configuration description.
* @param rc
* resource such as file or folder. If {@code null} the entries are considered to be
* being defined as default entries for resources.
* @param languageId
* language id. If {@code null}, then entries are considered to be defined as default
* entries for languages.
* @param entries
* language settings entries to set.
* @deprecated use {@link #getSettingEntries(IBuildConfiguration, IResource, String)}
*/
@Deprecated
default public void setSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId,
List<? extends ICLanguageSettingEntry> entries) {
// Do nothing by default
}
/**
* Shallow clone of the provider. "Shallow" is defined here as the exact copy except that the
* copy will have zero language settings entries.
* *
* @return shallow copy of the provider. * @return shallow copy of the provider.
* @throws CloneNotSupportedException in case {@link #clone()} throws the exception. * @throws CloneNotSupportedException
* in case {@link #clone()} throws the exception.
*/ */
public ILanguageSettingsEditableProvider cloneShallow() throws CloneNotSupportedException; public ILanguageSettingsEditableProvider cloneShallow() throws CloneNotSupportedException;
@ -57,4 +82,5 @@ public interface ILanguageSettingsEditableProvider extends ILanguageSettingsBroa
* @see Object#clone() * @see Object#clone()
*/ */
public ILanguageSettingsEditableProvider clone() throws CloneNotSupportedException; public ILanguageSettingsEditableProvider clone() throws CloneNotSupportedException;
} }

View file

@ -17,35 +17,36 @@ import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
/** /**
* Base interface to provide list of {@link ICLanguageSettingEntry}. * Base interface to provide list of {@link ICLanguageSettingEntry}. This interface is used to
* This interface is used to deliver additions to compiler options such as * deliver additions to compiler options such as include paths (-I) or preprocessor defines (-D) and
* include paths (-I) or preprocessor defines (-D) and others (see * others (see {@link ICSettingEntry#INCLUDE_PATH} and other kinds). <br>
* {@link ICSettingEntry#INCLUDE_PATH} and other kinds). * <br>
* <br><br>
* To define a provider like that use extension point * To define a provider like that use extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} and implement this * {@code org.eclipse.cdt.core.LanguageSettingsProvider} and implement this interface. The
* interface. The recommended way of implementing is to extend * recommended way of implementing is to extend {@link LanguageSettingsSerializableProvider} and
* {@link LanguageSettingsSerializableProvider} and implement {@link ILanguageSettingsEditableProvider}. * implement {@link ILanguageSettingsEditableProvider}. That will give the ability to persist and
* That will give the ability to persist and edit/clean entries by user in UI. * edit/clean entries by user in UI. The clone methods defined by
* The clone methods defined by {@link ILanguageSettingsEditableProvider} should be * {@link ILanguageSettingsEditableProvider} should be chained as done for example by
* chained as done for example by {@link LanguageSettingsGenericProvider}. * {@link LanguageSettingsGenericProvider}. <br>
* <br><br> * <br>
* CDT provides a few general use implementations in the core such as {@link LanguageSettingsBaseProvider} * CDT provides a few general use implementations in the core such as
* or {@link LanguageSettingsSerializableProvider} or {@link LanguageSettingsGenericProvider} * {@link LanguageSettingsBaseProvider} or {@link LanguageSettingsSerializableProvider} or
* which could be used out of the box or built upon. There are also abstract classes in build * {@link LanguageSettingsGenericProvider} which could be used out of the box or built upon. There
* plugins {@code AbstractBuildCommandParser} and {@code AbstractBuiltinSpecsDetector} which * are also abstract classes in build plugins {@code AbstractBuildCommandParser} and
* serve as a base for output parsers and built-in compiler language settings detectors. * {@code AbstractBuiltinSpecsDetector} which serve as a base for output parsers and built-in
* See also extension point schema description LanguageSettingsProvider.exsd. * compiler language settings detectors. See also extension point schema description
* LanguageSettingsProvider.exsd.
* *
* @since 5.4 * @since 5.4
*/ */
public interface ILanguageSettingsProvider { public interface ILanguageSettingsProvider {
/** /**
* Id is used to keep track of the providers internally. Use unique id * Id is used to keep track of the providers internally. Use unique id to represent the
* to represent the provider. * provider.
* *
* @return Id of the provider. * @return Id of the provider.
*/ */
@ -59,28 +60,72 @@ public interface ILanguageSettingsProvider {
public String getName(); public String getName();
/** /**
* Returns the list of setting entries for the given configuration description, * Returns the list of setting entries for the given configuration description, resource and
* resource and language. * language. <br>
* <br><br> * <br>
* Note to implementers - this method should not be used to do any long running * Note to implementers - this method should not be used to do any long running operations such
* operations such as extensive calculations or reading files. If you need to do * as extensive calculations or reading files. If you need to do so, the recommended way is to
* so, the recommended way is to do the calculations outside of * do the calculations outside of this function call - in advance and on appropriate event. For
* this function call - in advance and on appropriate event. For example, Build * example, Build Output Parser prepares the list and stores it in internal cache while parsing
* Output Parser prepares the list and stores it in internal cache while parsing output. * output. {@link #getSettingEntries(IBuildConfiguration, IResource, String)} will return cached
* {@link #getSettingEntries(ICConfigurationDescription, IResource, String)} will * entries when asked. You can also implement {@link ICListenerAgent} interface to get
* return cached entries when asked. You can also implement {@link ICListenerAgent} * registered and listen to arbitrary events.
* interface to get registered and listen to arbitrary events.
* *
* @param cfgDescription - configuration description. * @param config
* @param rc - resource such as file or folder. * - configuration.
* If {@code null}, the default entries for all resources are returned. * @param rc
* @param languageId - language id. * - resource such as file or folder. If {@code null}, the default entries for all
* If {@code null}, the default entries for all languages are returned. * resources are returned.
* (see {@link LanguageManager#getLanguageForFile(org.eclipse.core.resources.IFile, ICConfigurationDescription)}). * @param languageId
* - language id. If {@code null}, the default entries for all languages are
* returned. (see
* {@link LanguageManager#getLanguageForFile(org.eclipse.core.resources.IFile, ICConfigurationDescription)}
* ).
* *
* @return the list of setting entries or {@code null} if no settings defined. * @return the list of setting entries or {@code null} if no settings defined. The list needs to
* The list needs to be a pooled list created by {@link LanguageSettingsStorage#getPooledList(List)} * be a pooled list created by {@link LanguageSettingsStorage#getPooledList(List)} to
* to save memory and avoid deep equality comparisons. * save memory and avoid deep equality comparisons.
* @since 6.0
*/ */
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId); default public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
// call the old one by default
return getSettingEntries(config.getAdapter(ICConfigurationDescription.class), rc, languageId);
}
/**
* Returns the list of setting entries for the given configuration description, resource and
* language. <br>
* <br>
* Note to implementers - this method should not be used to do any long running operations such
* as extensive calculations or reading files. If you need to do so, the recommended way is to
* do the calculations outside of this function call - in advance and on appropriate event. For
* example, Build Output Parser prepares the list and stores it in internal cache while parsing
* output. {@link #getSettingEntries(IBuildConfiguration, IResource, String)} will return cached
* entries when asked. You can also implement {@link ICListenerAgent} interface to get
* registered and listen to arbitrary events.
*
* @param cfgDescription
* - configuration description.
* @param rc
* - resource such as file or folder. If {@code null}, the default entries for all
* resources are returned.
* @param languageId
* - language id. If {@code null}, the default entries for all languages are
* returned. (see
* {@link LanguageManager#getLanguageForFile(org.eclipse.core.resources.IFile, ICConfigurationDescription)}
* ).
*
* @return the list of setting entries or {@code null} if no settings defined. The list needs to
* be a pooled list created by {@link LanguageSettingsStorage#getPooledList(List)} to
* save memory and avoid deep equality comparisons.
* @deprecated use {@link #getSettingEntries(IBuildConfiguration, IResource, String)}
*/
@Deprecated
default public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription,
IResource rc, String languageId) {
// return null by default
return null;
}
} }

View file

@ -23,19 +23,24 @@ import org.eclipse.cdt.core.AbstractExecutableExtensionBase;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.internal.core.settings.model.SettingsModelMessages; import org.eclipse.cdt.internal.core.settings.model.SettingsModelMessages;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
/** /**
* {@code LanguageSettingsBaseProvider} is a basic implementation of {@link ILanguageSettingsProvider} * {@code LanguageSettingsBaseProvider} is a basic implementation of
* for the extensions defined by {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. * {@link ILanguageSettingsProvider} for the extensions defined by
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point.
* *
* This implementation supports "static" list of entries for languages specified in * This implementation supports "static" list of entries for languages specified in the extension
* the extension point. * point.
* *
* @since 5.4 * @since 5.4
*/ */
public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider { public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBase
/** Language scope, i.e. list of languages the entries will be provided for. */ implements ILanguageSettingsProvider {
/**
* Language scope, i.e. list of languages the entries will be provided for.
*/
protected List<String> languageScope = null; protected List<String> languageScope = null;
/** Provider-specific properties */ /** Provider-specific properties */
@ -54,8 +59,10 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
/** /**
* Constructor. Creates an "empty" non-configured provider. * Constructor. Creates an "empty" non-configured provider.
* *
* @param id - id of the provider. * @param id
* @param name - name of the provider to be presented to a user. * - id of the provider.
* @param name
* - name of the provider to be presented to a user.
*/ */
public LanguageSettingsBaseProvider(String id, String name) { public LanguageSettingsBaseProvider(String id, String name) {
super(id, name); super(id, name);
@ -64,13 +71,16 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
/** /**
* Constructor. * Constructor.
* *
* @param id - id of the provider. * @param id
* @param name - name of the provider to be presented to a user. * - id of the provider.
* @param languages - list of languages the {@code entries} provided for. * @param name
* {@code languages} can be {@code null}, in this case the {@code entries} * - name of the provider to be presented to a user.
* are provided for any language. * @param languages
* @param entries - the list of language settings entries this provider provides. * - list of languages the {@code entries} provided for. {@code languages} can be
* If {@code null} is passed, the provider creates an empty list. * {@code null}, in this case the {@code entries} are provided for any language.
* @param entries
* - the list of language settings entries this provider provides. If {@code null} is
* passed, the provider creates an empty list.
*/ */
public LanguageSettingsBaseProvider(String id, String name, List<String> languages, public LanguageSettingsBaseProvider(String id, String name, List<String> languages,
List<ICLanguageSettingEntry> entries) { List<ICLanguageSettingEntry> entries) {
@ -82,14 +92,18 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
/** /**
* Constructor. * Constructor.
* *
* @param id - id of the provider. * @param id
* @param name - name of the provider to be presented to a user. * - id of the provider.
* @param languages - list of languages the {@code entries} provided for. * @param name
* {@code languages} can be {@code null}, in this case the {@code entries} * - name of the provider to be presented to a user.
* are provided for any language. * @param languages
* @param entries - the list of language settings entries this provider provides. * - list of languages the {@code entries} provided for. {@code languages} can be
* If {@code null} is passed, the provider creates an empty list. * {@code null}, in this case the {@code entries} are provided for any language.
* @param properties - custom properties as the means to customize providers. * @param entries
* - the list of language settings entries this provider provides. If {@code null} is
* passed, the provider creates an empty list.
* @param properties
* - custom properties as the means to customize providers.
*/ */
public LanguageSettingsBaseProvider(String id, String name, List<String> languages, public LanguageSettingsBaseProvider(String id, String name, List<String> languages,
List<ICLanguageSettingEntry> entries, Map<String, String> properties) { List<ICLanguageSettingEntry> entries, Map<String, String> properties) {
@ -101,28 +115,33 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
} }
/** /**
* A method to configure the provider. The initialization of provider from * A method to configure the provider. The initialization of provider from the extension point
* the extension point is done in 2 steps. First, the class is created as * is done in 2 steps. First, the class is created as an executable extension using the default
* an executable extension using the default provider. Then this method is * provider. Then this method is used to configure the provider. <br>
* used to configure the provider. * <br>
*<br><br>
* It is not allowed to reconfigure the provider. * It is not allowed to reconfigure the provider.
* *
* @param id - id of the provider. * @param id
* @param name - name of the provider to be presented to a user. * - id of the provider.
* @param languages - list of languages the {@code entries} provided for. * @param name
* {@code languages} can be {@code null}, in this case the {@code entries} * - name of the provider to be presented to a user.
* are provided for any language. * @param languages
* @param entries - the list of language settings entries this provider provides. * - list of languages the {@code entries} provided for. {@code languages} can be
* If {@code null} is passed, the provider creates an empty list. * {@code null}, in this case the {@code entries} are provided for any language.
* @param properties - custom properties as the means to customize providers. * @param entries
* - the list of language settings entries this provider provides. If {@code null} is
* passed, the provider creates an empty list.
* @param properties
* - custom properties as the means to customize providers.
* *
* @throws UnsupportedOperationException if an attempt to reconfigure provider is made. * @throws UnsupportedOperationException
* if an attempt to reconfigure provider is made.
*/ */
public void configureProvider(String id, String name, List<String> languages, public void configureProvider(String id, String name, List<String> languages,
List<ICLanguageSettingEntry> entries, Map<String, String> properties) { List<ICLanguageSettingEntry> entries, Map<String, String> properties) {
if (this.entries != null || !this.properties.isEmpty()) if (this.entries != null || !this.properties.isEmpty())
throw new UnsupportedOperationException(SettingsModelMessages.getString("LanguageSettingsBaseProvider.CanBeConfiguredOnlyOnce")); //$NON-NLS-1$ throw new UnsupportedOperationException(
SettingsModelMessages.getString("LanguageSettingsBaseProvider.CanBeConfiguredOnlyOnce")); //$NON-NLS-1$
setId(id); setId(id);
setName(name); setName(name);
@ -133,16 +152,16 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
} }
/** /**
* {@code LanguageSettingsBaseProvider} keeps the list of key-value pairs * {@code LanguageSettingsBaseProvider} keeps the list of key-value pairs so extenders of this
* so extenders of this class can customize the provider. The properties * class can customize the provider. The properties of {@code LanguageSettingsBaseProvider} come
* of {@code LanguageSettingsBaseProvider} come from the extension in plugin.xml * from the extension in plugin.xml although the extenders can provide their own method. <br>
* although the extenders can provide their own method. * <br>
* <br><br> * Please note that empty string value is treated as "default" value and the same as
* Please note that empty string value is treated as "default" value and * {@code null} and the same as missing property, which allows {@link #equals(Object)} evaluate
* the same as {@code null} and the same as missing property, which allows * the property as equal while comparing providers.
* {@link #equals(Object)} evaluate the property as equal while comparing providers.
* *
* @param key - property to check the value. * @param key
* - property to check the value.
* @return value of the property. If the property is missing returns empty string. * @return value of the property. If the property is missing returns empty string.
*/ */
public String getProperty(String key) { public String getProperty(String key) {
@ -155,11 +174,13 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
/** /**
* Convenience method to get boolean property. * Convenience method to get boolean property.
*
* @see #getProperty(String) * @see #getProperty(String)
* *
* @param key - property to check the value. * @param key
* @return boolean value of the property. If the property is missing or cannot be * - property to check the value.
* interpreted as boolean returns {@code false}. * @return boolean value of the property. If the property is missing or cannot be interpreted as
* boolean returns {@code false}.
*/ */
public boolean getPropertyBool(String key) { public boolean getPropertyBool(String key) {
return Boolean.parseBoolean(properties.get(key)); return Boolean.parseBoolean(properties.get(key));
@ -175,30 +196,43 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
* @param languageId - language id. If {@code null}, then entries defined for * @param languageId
* the language scope are returned. See {@link #getLanguageScope()} * - language id. If {@code null}, then entries defined for the language scope are
* returned. See {@link #getLanguageScope()}
* *
* @return unmodifiable list of setting entries or {@code null} if no settings defined. * @return unmodifiable list of setting entries or {@code null} if no settings defined. the list
* the list is internally pooled and guaranteed to be the same object for equal * is internally pooled and guaranteed to be the same object for equal lists.
* lists. * @since 6.0
*/ */
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc, String languageId) {
IResource rc, String languageId) { // For backwards compatibility
if (config != null) {
ICConfigurationDescription cfgDesc = config.getAdapter(ICConfigurationDescription.class);
if (cfgDesc != null) {
List<ICLanguageSettingEntry> entriesOld = getSettingEntries(cfgDesc, rc, languageId);
if (entriesOld != null) {
return entriesOld;
}
}
}
if (languageScope == null) { if (languageScope == null) {
return entries; return entries;
} }
for (String lang : languageScope) { for (String lang : languageScope) {
if (lang.equals(languageId)) { if (lang.equals(languageId)) {
return entries; return entries;
} }
} }
return null; return null;
} }
/** /**
* @return the unmodifiable list of languages this provider provides for. * @return the unmodifiable list of languages this provider provides for. If {@code null}, the
* If {@code null}, the provider provides for any language. * provider provides for any language.
*/ */
public List<String> getLanguageScope() { public List<String> getLanguageScope() {
if (languageScope == null) if (languageScope == null)
@ -267,7 +301,8 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas
} else if (other.properties == null) { } else if (other.properties == null) {
return false; return false;
} else { } else {
// The trouble to ensure default properties are equal to missing ones. // The trouble to ensure default properties are equal to missing
// ones.
Set<String> keys = new HashSet<String>(properties.keySet()); Set<String> keys = new HashSet<String>(properties.keySet());
keys.addAll(other.properties.keySet()); keys.addAll(other.properties.keySet());
for (String key : keys) { for (String key : keys) {

View file

@ -28,78 +28,90 @@ import org.eclipse.cdt.core.settings.model.ICResourceDescription;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsExtensionManager; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsExtensionManager;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
/** /**
* A collection of utility methods to manage language settings providers. * A collection of utility methods to manage language settings providers. See
* See {@link ILanguageSettingsProvider}. * {@link ILanguageSettingsProvider}.
* *
* @since 5.4 * @since 5.4
*/ */
public class LanguageSettingsManager { public class LanguageSettingsManager {
/** /**
* Returns the list of setting entries of a certain kind (such as include paths) * Returns the list of setting entries of a certain kind (such as include paths) for the given
* for the given configuration description, resource and language. This is a * configuration description, resource and language. This is a combined list for all providers
* combined list for all providers taking into account settings of parent folder * taking into account settings of parent folder if settings for the given resource are not
* if settings for the given resource are not defined. For include paths both * defined. For include paths both local (#include "...") and system (#include <...>) entries
* local (#include "...") and system (#include <...>) entries are returned. * are returned.
* *
* @param cfgDescription - configuration description. * @param config
* @param rc - resource such as file or folder. * - configuration.
* @param languageId - language id. * @param rc
* @param kind - kind of language settings entries, such as * - resource such as file or folder.
* {@link ICSettingEntry#INCLUDE_PATH} etc. This is a binary flag * @param languageId
* and it is possible to specify composite kind. * - language id.
* Use {@link ICSettingEntry#ALL} to get all kinds. * @param kind
* - kind of language settings entries, such as {@link ICSettingEntry#INCLUDE_PATH}
* etc. This is a binary flag and it is possible to specify composite kind. Use
* {@link ICSettingEntry#ALL} to get all kinds.
* *
* @return the list of setting entries. * @return the list of setting entries.
* *
* @since 5.5 * @since 6.0
*/ */
public static List<ICLanguageSettingEntry> getSettingEntriesByKind(ICConfigurationDescription cfgDescription, IResource rc, String languageId, int kind) { public static List<ICLanguageSettingEntry> getSettingEntriesByKind(IBuildConfiguration config,
return LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, rc, languageId, kind); IResource rc, String languageId, int kind) {
return LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config, rc, languageId, kind);
} }
/** /**
* Returns the list of setting entries of the given provider * Returns the list of setting entries of the given provider for the given configuration
* for the given configuration description, resource and language. * description, resource and language. This method reaches to the parent folder of the resource
* This method reaches to the parent folder of the resource recursively * recursively if the resource does not define the entries for the given provider.
* if the resource does not define the entries for the given provider.
* *
* @param provider - language settings provider. * @param provider
* @param cfgDescription - configuration description. * - language settings provider.
* @param rc - resource such as file or folder. * @param config
* @param languageId - language id. * - configuration.
* @param rc
* - resource such as file or folder.
* @param languageId
* - language id.
* *
* @return the list of setting entries. Never returns {@code null} * @return the list of setting entries. Never returns {@code null} although individual providers
* although individual providers return {@code null} if no settings defined. * return {@code null} if no settings defined.
* @since 6.0
*/ */
public static List<ICLanguageSettingEntry> getSettingEntriesUpResourceTree(ILanguageSettingsProvider provider, ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public static List<ICLanguageSettingEntry> getSettingEntriesUpResourceTree(
return LanguageSettingsProvidersSerializer.getSettingEntriesUpResourceTree(provider, cfgDescription, rc, languageId); ILanguageSettingsProvider provider, IBuildConfiguration config, IResource rc, String languageId) {
return LanguageSettingsProvidersSerializer.getSettingEntriesUpResourceTree(provider, config, rc,
languageId);
} }
/** /**
* Get Language Settings Provider from the list of workspace providers, * Get Language Settings Provider from the list of workspace providers, see
* see {@link #getWorkspaceProviders()}. * {@link #getWorkspaceProviders()}.
* *
* @param id - id of provider to find. * @param id
* @return the workspace provider. If workspace provider is not defined * - id of provider to find.
* a new instance is created and returned. * @return the workspace provider. If workspace provider is not defined a new instance is
* created and returned.
*/ */
public static ILanguageSettingsProvider getWorkspaceProvider(String id) { public static ILanguageSettingsProvider getWorkspaceProvider(String id) {
return LanguageSettingsProvidersSerializer.getWorkspaceProvider(id); return LanguageSettingsProvidersSerializer.getWorkspaceProvider(id);
} }
/** /**
* Get Language Settings Providers defined in the workspace. That includes * Get Language Settings Providers defined in the workspace. That includes user-defined
* user-defined providers and after that providers defined as extensions via * providers and after that providers defined as extensions via
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. * {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. Note that this returns
* Note that this returns wrappers around workspace provider so underlying * wrappers around workspace provider so underlying provider could be replaced internally
* provider could be replaced internally without need to change configuration. * without need to change configuration. See also
* See also {@link #getRawProvider(ILanguageSettingsProvider)}. * {@link #getRawProvider(ILanguageSettingsProvider)}.
* *
* @return list of workspace providers. * @return list of workspace providers.
*/ */
@ -108,12 +120,12 @@ public class LanguageSettingsManager {
} }
/** /**
* Checks if the provider is a workspace level provider. * Checks if the provider is a workspace level provider. This method is intended to check
* This method is intended to check providers retrieved from a configuration. * providers retrieved from a configuration. Raw providers from
* Raw providers from {@link #getRawProvider(ILanguageSettingsProvider)} * {@link #getRawProvider(ILanguageSettingsProvider)} are not considered as workspace providers.
* are not considered as workspace providers.
* *
* @param provider - provider to check. * @param provider
* - provider to check.
* @return {@code true} if the given provider is workspace provider, {@code false} otherwise. * @return {@code true} if the given provider is workspace provider, {@code false} otherwise.
*/ */
public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) { public static boolean isWorkspaceProvider(ILanguageSettingsProvider provider) {
@ -123,11 +135,14 @@ public class LanguageSettingsManager {
/** /**
* Helper method to get to real underlying provider collecting entries as opposed to wrapper * Helper method to get to real underlying provider collecting entries as opposed to wrapper
* which is normally used for workspace provider. * which is normally used for workspace provider.
*
* @see LanguageSettingsProvidersSerializer#isWorkspaceProvider(ILanguageSettingsProvider) * @see LanguageSettingsProvidersSerializer#isWorkspaceProvider(ILanguageSettingsProvider)
* *
* @param provider - the provider to get raw provider for. Can be either workspace provider * @param provider
* or regular one. * - the provider to get raw provider for. Can be either workspace provider or
* @return raw underlying provider for workspace provider or provider itself if no wrapper is used. * regular one.
* @return raw underlying provider for workspace provider or provider itself if no wrapper is
* used.
*/ */
public static ILanguageSettingsProvider getRawProvider(ILanguageSettingsProvider provider) { public static ILanguageSettingsProvider getRawProvider(ILanguageSettingsProvider provider) {
if (isWorkspaceProvider(provider)) { if (isWorkspaceProvider(provider)) {
@ -136,38 +151,42 @@ public class LanguageSettingsManager {
return provider; return provider;
} }
/** /**
* Set and store in workspace area user defined providers. * Set and store in workspace area user defined providers.
* *
* @param providers - array of user defined workspace providers. * @param providers
* Note that those providers will shadow extension providers with the same ID. * - array of user defined workspace providers. Note that those providers will shadow
* All not shadowed extension providers will be added to the list to be present * extension providers with the same ID. All not shadowed extension providers will be
* as workspace providers. {@code null} is equivalent to passing an empty array * added to the list to be present as workspace providers. {@code null} is equivalent
* and so will reset workspace providers to match extension providers. * to passing an empty array and so will reset workspace providers to match extension
* @throws CoreException in case of problems (such as problems with persistence). * providers.
* @throws CoreException
* in case of problems (such as problems with persistence).
*/ */
public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException { public static void setWorkspaceProviders(List<ILanguageSettingsProvider> providers) throws CoreException {
LanguageSettingsProvidersSerializer.setWorkspaceProviders(providers); LanguageSettingsProvidersSerializer.setWorkspaceProviders(providers);
} }
/** /**
* Copy language settings provider. It is different from clone() methods in that * Copy language settings provider. It is different from clone() methods in that it does not
* it does not throw {@code CloneNotSupportedException} but returns {@code null} * throw {@code CloneNotSupportedException} but returns {@code null} instead.
* instead.
* *
* @param provider - language settings provider to copy. * @param provider
* @param deep - {@code true} to request deep copy including copying settings entries * - language settings provider to copy.
* or {@code false} to return shallow copy with no settings entries. * @param deep
* - {@code true} to request deep copy including copying settings entries or
* {@code false} to return shallow copy with no settings entries.
* *
* @return a copy of the provider or null if copying is not possible. * @return a copy of the provider or null if copying is not possible.
*/ */
public static ILanguageSettingsEditableProvider getProviderCopy(ILanguageSettingsEditableProvider provider, boolean deep) { public static ILanguageSettingsEditableProvider getProviderCopy(
ILanguageSettingsEditableProvider provider, boolean deep) {
return LanguageSettingsExtensionManager.getProviderCopy(provider, deep); return LanguageSettingsExtensionManager.getProviderCopy(provider, deep);
} }
/** /**
* Returns list of provider id-s contributed by all extensions. * Returns list of provider id-s contributed by all extensions.
*
* @return the provider id-s. * @return the provider id-s.
*/ */
public static Set<String> getExtensionProviderIds() { public static Set<String> getExtensionProviderIds() {
@ -176,14 +195,17 @@ public class LanguageSettingsManager {
/** /**
* Get language settings provider defined via extension point * Get language settings provider defined via extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider}. * {@code org.eclipse.cdt.core.LanguageSettingsProvider}. A new copy of the extension provider
* A new copy of the extension provider is returned. * is returned.
* *
* @param id - ID of the extension provider. * @param id
* @param deep - {@code true} to request deep copy including copying settings entries * - ID of the extension provider.
* or {@code false} to return shallow copy with no settings entries. * @param deep
* @return the copy of the extension provider if possible (i.e. for {@link ILanguageSettingsEditableProvider}) * - {@code true} to request deep copy including copying settings entries or
* or {@code null} if provider is not copyable. * {@code false} to return shallow copy with no settings entries.
* @return the copy of the extension provider if possible (i.e. for
* {@link ILanguageSettingsEditableProvider}) or {@code null} if provider is not
* copyable.
*/ */
public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) { public static ILanguageSettingsProvider getExtensionProviderCopy(String id, boolean deep) {
return LanguageSettingsExtensionManager.getExtensionProviderCopy(id, deep); return LanguageSettingsExtensionManager.getExtensionProviderCopy(id, deep);
@ -193,9 +215,11 @@ public class LanguageSettingsManager {
* Test if the provider is equal to the one defined via extension point * Test if the provider is equal to the one defined via extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider}. * {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* *
* @param provider - the provider to test. * @param provider
* @param deep - {@code true} to check for deep equality testing also settings entries * - the provider to test.
* or {@code false} to test shallow copy with no settings entries. * @param deep
* - {@code true} to check for deep equality testing also settings entries or
* {@code false} to test shallow copy with no settings entries.
* @return - {@code true} if the provider matches the extension or {@code false} otherwise. * @return - {@code true} if the provider matches the extension or {@code false} otherwise.
*/ */
public static boolean isEqualExtensionProvider(ILanguageSettingsProvider provider, boolean deep) { public static boolean isEqualExtensionProvider(ILanguageSettingsProvider provider, boolean deep) {
@ -203,13 +227,13 @@ public class LanguageSettingsManager {
} }
/** /**
* Find language IDs for the resource represented by resource description. * Find language IDs for the resource represented by resource description. Under the hood build
* Under the hood build component is inquired and the language IDs would * component is inquired and the language IDs would commonly come from the input type(s).
* commonly come from the input type(s).
* *
* @param rcDescription - resource description * @param rcDescription
* @return list of language IDs for the resource. The list can contain {@code null} ID. * - resource description
* Never returns {@code null} but empty list if no languages can be found. * @return list of language IDs for the resource. The list can contain {@code null} ID. Never
* returns {@code null} but empty list if no languages can be found.
* *
*/ */
public static List<String> getLanguages(ICResourceDescription rcDescription) { public static List<String> getLanguages(ICResourceDescription rcDescription) {
@ -239,14 +263,14 @@ public class LanguageSettingsManager {
} }
/** /**
* Find language IDs for the resource in given build configuration. * Find language IDs for the resource in given build configuration. Under the hood build
* Under the hood build component is inquired and the language IDs would * component is inquired and the language IDs would commonly come from the input type(s).
* commonly come from the input type(s).
* *
* @param resource - the resource to find languages for. * @param resource
* - the resource to find languages for.
* @param cfgDescription * @param cfgDescription
* @return list of language IDs for the resource. * @return list of language IDs for the resource. Never returns {@code null} but empty list if
* Never returns {@code null} but empty list if no languages can be found. * no languages can be found.
*/ */
public static List<String> getLanguages(IResource resource, ICConfigurationDescription cfgDescription) { public static List<String> getLanguages(IResource resource, ICConfigurationDescription cfgDescription) {
List<String> languageIds = new ArrayList<String>(); List<String> languageIds = new ArrayList<String>();
@ -263,7 +287,8 @@ public class LanguageSettingsManager {
if (langId == null) { if (langId == null) {
// Try getting language from content types // Try getting language from content types
try { try {
ILanguage lang = LanguageManager.getInstance().getLanguageForFile((IFile) resource, cfgDescription); ILanguage lang = LanguageManager.getInstance().getLanguageForFile((IFile) resource,
cfgDescription);
if (lang != null) { if (lang != null) {
langId = lang.getId(); langId = lang.getId();
} }
@ -288,7 +313,8 @@ public class LanguageSettingsManager {
/** /**
* Adds a listener that will be notified of changes in language settings. * Adds a listener that will be notified of changes in language settings.
* *
* @param listener the listener to add * @param listener
* the listener to add
*/ */
public static void registerLanguageSettingsChangeListener(ILanguageSettingsChangeListener listener) { public static void registerLanguageSettingsChangeListener(ILanguageSettingsChangeListener listener) {
LanguageSettingsProvidersSerializer.registerLanguageSettingsChangeListener(listener); LanguageSettingsProvidersSerializer.registerLanguageSettingsChangeListener(listener);
@ -297,33 +323,35 @@ public class LanguageSettingsManager {
/** /**
* Removes a language settings change listener. * Removes a language settings change listener.
* *
* @param listener the listener to remove. * @param listener
* the listener to remove.
*/ */
public static void unregisterLanguageSettingsChangeListener(ILanguageSettingsChangeListener listener) { public static void unregisterLanguageSettingsChangeListener(ILanguageSettingsChangeListener listener) {
LanguageSettingsProvidersSerializer.unregisterLanguageSettingsChangeListener(listener); LanguageSettingsProvidersSerializer.unregisterLanguageSettingsChangeListener(listener);
} }
/** /**
* Tells if the provider is meant to be shared between projects in workspace * Tells if the provider is meant to be shared between projects in workspace or belong to a
* or belong to a specific configuration. This attribute is defined in * specific configuration. This attribute is defined in
* {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. * {@code org.eclipse.cdt.core.LanguageSettingsProvider} extension point. <br>
* <br>Note that only {@link ILanguageSettingsEditableProvider} can be owned by * Note that only {@link ILanguageSettingsEditableProvider} can be owned by a configuration.
* a configuration.
* *
* @param id - ID of the provider to inquire. * @param id
* @return {@code true} if the provider is designed to be shared, * - ID of the provider to inquire.
* {@code false} if configuration-owned. * @return {@code true} if the provider is designed to be shared, {@code false} if
* configuration-owned.
*/ */
public static boolean isPreferShared(String id) { public static boolean isPreferShared(String id) {
return LanguageSettingsExtensionManager.isPreferShared(id); return LanguageSettingsExtensionManager.isPreferShared(id);
} }
/** /**
* Tells if language settings entries of the provider are persisted with the project * Tells if language settings entries of the provider are persisted with the project (under
* (under .settings/ folder) or in workspace area. Persistence in the project area lets * .settings/ folder) or in workspace area. Persistence in the project area lets the entries
* the entries migrate with the project. * migrate with the project.
* *
* @param provider - provider to check the persistence mode. * @param provider
* - provider to check the persistence mode.
* @return {@code true} if LSE persisted with the project or {@code false} if in the workspace. * @return {@code true} if LSE persisted with the project or {@code false} if in the workspace.
*/ */
public static boolean isStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider) { public static boolean isStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider) {
@ -333,19 +361,23 @@ public class LanguageSettingsManager {
/** /**
* Define where language settings are persisted for the provider. * Define where language settings are persisted for the provider.
* *
* @param provider - provider to set the persistence mode. * @param provider
* @param storeEntriesWithProject - {@code true} if with the project, * - provider to set the persistence mode.
* {@code false} if in workspace area. * @param storeEntriesWithProject
* - {@code true} if with the project, {@code false} if in workspace area.
*/ */
public static void setStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider, boolean storeEntriesWithProject) { public static void setStoringEntriesInProjectArea(LanguageSettingsSerializableProvider provider,
boolean storeEntriesWithProject) {
LanguageSettingsProvidersSerializer.setStoringEntriesInProjectArea(provider, storeEntriesWithProject); LanguageSettingsProvidersSerializer.setStoringEntriesInProjectArea(provider, storeEntriesWithProject);
} }
/** /**
* Save language settings providers of a project to persistent storage. * Save language settings providers of a project to persistent storage.
* *
* @param prjDescription - project description of the project. * @param prjDescription
* @throws CoreException if something goes wrong. * - project description of the project.
* @throws CoreException
* if something goes wrong.
*/ */
public static void serializeLanguageSettings(ICProjectDescription prjDescription) throws CoreException { public static void serializeLanguageSettings(ICProjectDescription prjDescription) throws CoreException {
LanguageSettingsProvidersSerializer.serializeLanguageSettings(prjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettings(prjDescription);
@ -354,7 +386,8 @@ public class LanguageSettingsManager {
/** /**
* Save language settings providers of the workspace (global providers) to persistent storage. * Save language settings providers of the workspace (global providers) to persistent storage.
* *
* @throws CoreException if something goes wrong. * @throws CoreException
* if something goes wrong.
*/ */
public static void serializeLanguageSettingsWorkspace() throws CoreException { public static void serializeLanguageSettingsWorkspace() throws CoreException {
LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace(); LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspace();
@ -363,15 +396,16 @@ public class LanguageSettingsManager {
/** /**
* Save language settings providers of a project to persistent storage in a background job. * Save language settings providers of a project to persistent storage in a background job.
* *
* @param prjDescription - project description of the project. * @param prjDescription
* - project description of the project.
*/ */
public static void serializeLanguageSettingsInBackground(ICProjectDescription prjDescription) { public static void serializeLanguageSettingsInBackground(ICProjectDescription prjDescription) {
LanguageSettingsProvidersSerializer.serializeLanguageSettingsInBackground(prjDescription); LanguageSettingsProvidersSerializer.serializeLanguageSettingsInBackground(prjDescription);
} }
/** /**
* Save language settings providers of the workspace (global providers) to persistent storage * Save language settings providers of the workspace (global providers) to persistent storage in
* in a background job. * a background job.
*/ */
public static void serializeLanguageSettingsWorkspaceInBackground() { public static void serializeLanguageSettingsWorkspaceInBackground() {
LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspaceInBackground(); LanguageSettingsProvidersSerializer.serializeLanguageSettingsWorkspaceInBackground();
@ -380,11 +414,13 @@ public class LanguageSettingsManager {
/** /**
* Create a list of providers with intention to assign to a configuration description. * Create a list of providers with intention to assign to a configuration description.
* *
* The list will contain global providers for ones where attribute "prefer-non-shared" is {@code true} * The list will contain global providers for ones where attribute "prefer-non-shared" is
* and a new copy for those where attribute "prefer-non-shared" is {@code false}. Attribute "prefer-non-shared" * {@code true} and a new copy for those where attribute "prefer-non-shared" is {@code false}.
* is defined in extension point {@code org.eclipse.cdt.core.LanguageSettingsProvider}. * Attribute "prefer-non-shared" is defined in extension point
* {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
* *
* @param ids - list of providers id which cannot be {@code null}. * @param ids
* - list of providers id which cannot be {@code null}.
* @return a list of language settings providers with given ids. * @return a list of language settings providers with given ids.
* *
* @since 5.5 * @since 5.5

View file

@ -24,6 +24,7 @@ import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSetting
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage;
import org.eclipse.cdt.internal.core.settings.model.CConfigurationSpecSettings; import org.eclipse.cdt.internal.core.settings.model.CConfigurationSpecSettings;
import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo; import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
@ -34,19 +35,21 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
/** /**
* This class is the base class for language settings providers able to serialize * This class is the base class for language settings providers able to
* into XML storage. * serialize into XML storage. Although this class has setter methods, by design
* Although this class has setter methods, by design its instances are not editable in UI * its instances are not editable in UI nor instances can be assigned to a
* nor instances can be assigned to a configuration (cannot be global or non-shared). * configuration (cannot be global or non-shared). Implement
* Implement {@link ILanguageSettingsEditableProvider} interface for that. There is a generic * {@link ILanguageSettingsEditableProvider} interface for that. There is a
* implementation of this interface available to be used, see {@link LanguageSettingsGenericProvider}. * generic implementation of this interface available to be used, see
* {@link LanguageSettingsGenericProvider}.
* *
* For more on the suggested way of extending this class see the description of * For more on the suggested way of extending this class see the description of
* {@link ILanguageSettingsProvider}. * {@link ILanguageSettingsProvider}.
* *
* @since 5.4 * @since 5.4
*/ */
public class LanguageSettingsSerializableProvider extends LanguageSettingsBaseProvider implements ILanguageSettingsBroadcastingProvider { public class LanguageSettingsSerializableProvider extends LanguageSettingsBaseProvider
implements ILanguageSettingsBroadcastingProvider {
protected static final String ATTR_ID = LanguageSettingsProvidersSerializer.ATTR_ID; protected static final String ATTR_ID = LanguageSettingsProvidersSerializer.ATTR_ID;
protected static final String ATTR_NAME = LanguageSettingsProvidersSerializer.ATTR_NAME; protected static final String ATTR_NAME = LanguageSettingsProvidersSerializer.ATTR_NAME;
protected static final String ATTR_CLASS = LanguageSettingsProvidersSerializer.ATTR_CLASS; protected static final String ATTR_CLASS = LanguageSettingsProvidersSerializer.ATTR_CLASS;
@ -56,8 +59,9 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
private LanguageSettingsSerializableStorage fStorage = new LanguageSettingsSerializableStorage(); private LanguageSettingsSerializableStorage fStorage = new LanguageSettingsSerializableStorage();
/** /**
* Default constructor. This constructor has to be always followed with setting id and name of the provider. * Default constructor. This constructor has to be always followed with
* This constructor is necessary to instantiate the class via the extension point in plugin.xml. * setting id and name of the provider. This constructor is necessary to
* instantiate the class via the extension point in plugin.xml.
*/ */
public LanguageSettingsSerializableProvider() { public LanguageSettingsSerializableProvider() {
super(); super();
@ -66,8 +70,10 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Constructor. * Constructor.
* *
* @param id - id of the provider. * @param id
* @param name - name of the provider. Note that this name shows up in UI. * - id of the provider.
* @param name
* - name of the provider. Note that this name shows up in UI.
*/ */
public LanguageSettingsSerializableProvider(String id, String name) { public LanguageSettingsSerializableProvider(String id, String name) {
super(id, name); super(id, name);
@ -84,21 +90,24 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
@Override @Override
public void configureProvider(String id, String name, List<String> languages, List<ICLanguageSettingEntry> entries, Map<String, String> properties) { public void configureProvider(String id, String name, List<String> languages,
List<ICLanguageSettingEntry> entries, Map<String, String> properties) {
// do not pass entries to super, keep them in local storage // do not pass entries to super, keep them in local storage
super.configureProvider(id, name, languages, null, properties); super.configureProvider(id, name, languages, null, properties);
fStorage.clear(); fStorage.clear();
if (entries != null) { if (entries != null) {
// note that these entries are intended to be retrieved by LanguageSettingsManager.getSettingEntriesUpResourceTree() // note that these entries are intended to be retrieved by
// LanguageSettingsManager.getSettingEntriesUpResourceTree()
// when the whole resource hierarchy has been traversed up // when the whole resource hierarchy has been traversed up
setSettingEntries(null, null, null, entries); setSettingEntries(null, null, null, entries);
} }
} }
/** /**
* @return {@code true} if the provider does not keep any settings yet or {@code false} if there are some. * @return {@code true} if the provider does not keep any settings yet or
* {@code false} if there are some.
*/ */
public boolean isEmpty() { public boolean isEmpty() {
return fStorage.isEmpty(); return fStorage.isEmpty();
@ -107,8 +116,9 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Sets the language scope of the provider. * Sets the language scope of the provider.
* *
* @param languages - the list of languages this provider provides for. * @param languages
* If {@code null}, the provider provides for any language. * - the list of languages this provider provides for. If
* {@code null}, the provider provides for any language.
* *
* @see #getLanguageScope() * @see #getLanguageScope()
*/ */
@ -121,45 +131,56 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
/** /**
* Clears all the entries for all configurations, all resources and all languages. * Clears all the entries for all configurations, all resources and all
* languages.
*/ */
public void clear() { public void clear() {
fStorage.clear(); fStorage.clear();
} }
/** /**
* Sets language settings entries for the provider. * Sets language settings entries for the provider. Note that the entries
* Note that the entries are not persisted at that point. Use this method to set * are not persisted at that point. Use this method to set the entries for
* the entries for all resources one by one and after all done persist in one shot * all resources one by one and after all done persist in one shot using
* using {@link #serializeLanguageSettings(ICConfigurationDescription)}. * {@link #serializeLanguageSettings(ICConfigurationDescription)}. See for
* See for example {@code AbstractBuildCommandParser} and {@code AbstractBuiltinSpecsDetector} * example {@code AbstractBuildCommandParser} and
* in build plugins. * {@code AbstractBuiltinSpecsDetector} in build plugins.
* *
* @param cfgDescription - configuration description. * @param config
* @param rc - resource such as file or folder. If {@code null} the entries are * - configuration.
* considered to be being defined as default entries for resources. * @param rc
* @param languageId - language id. If {@code null}, then entries are considered * - resource such as file or folder. If {@code null} the entries
* to be defined for the language scope. See {@link #getLanguageScope()} * are considered to be being defined as default entries for
* @param entries - language settings entries to set. * resources.
* @param languageId
* - language id. If {@code null}, then entries are considered to
* be defined for the language scope. See
* {@link #getLanguageScope()}
* @param entries
* - language settings entries to set.
* @since 6.0
*/ */
public void setSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId, public void setSettingEntries(IBuildConfiguration config, IResource rc, String languageId,
List<? extends ICLanguageSettingEntry> entries) { List<? extends ICLanguageSettingEntry> entries) {
String rcProjectPath = rc != null ? rc.getProjectRelativePath().toString() : null; String rcProjectPath = rc != null ? rc.getProjectRelativePath().toString() : null;
fStorage.setSettingEntries(rcProjectPath, languageId, entries); fStorage.setSettingEntries(rcProjectPath, languageId, entries);
} }
/** /**
* {@inheritDoc} * {@inheritDoc} <br>
* Note that this list is <b>unmodifiable</b>. To modify the list copy it,
* change and use
* {@link #setSettingEntries(IBuildConfiguration, IResource, String, List)}
* . <br>
* <br> * <br>
* Note that this list is <b>unmodifiable</b>. To modify the list copy it, change and use * Note also that <b>you can compare these lists with simple equality
* {@link #setSettingEntries(ICConfigurationDescription, IResource, String, List)}. * operator ==</b>, as the lists themselves are backed by
* <br><br> * WeakHashSet<List<ICLanguageSettingEntry>> where identical copies (deep
* Note also that <b>you can compare these lists with simple equality operator ==</b>, * comparison is used) are replaced with the same one instance.
* as the lists themselves are backed by WeakHashSet<List<ICLanguageSettingEntry>> where
* identical copies (deep comparison is used) are replaced with the same one instance.
*/ */
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
String rcProjectPath = rc != null ? rc.getProjectRelativePath().toString() : null; String rcProjectPath = rc != null ? rc.getProjectRelativePath().toString() : null;
List<ICLanguageSettingEntry> entries = fStorage.getSettingEntries(rcProjectPath, languageId); List<ICLanguageSettingEntry> entries = fStorage.getSettingEntries(rcProjectPath, languageId);
if (entries == null) { if (entries == null) {
@ -172,25 +193,22 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
/** /**
* Serialize the provider under parent XML element. * Serialize the provider under parent XML element. This is convenience
* This is convenience method not intended to be overridden on purpose. * method not intended to be overridden on purpose. Override
* Override {@link #serializeAttributes(Element)} or * {@link #serializeAttributes(Element)} or
* {@link #serializeEntries(Element)} instead. * {@link #serializeEntries(Element)} instead.
* *
* @param parentElement - element where to serialize. * @param parentElement
* - element where to serialize.
* @return - newly created "provider" element. That element will already be * @return - newly created "provider" element. That element will already be
* attached to the parent element. * attached to the parent element.
*/ */
final public Element serialize(Element parentElement) { final public Element serialize(Element parentElement) {
/* /*
<provider id="provider.id" ...> * <provider id="provider.id" ...> <language-scope id="lang.id"/>
<language-scope id="lang.id"/> * <language id="lang.id"> <resource project-relative-path="/"> <entry
<language id="lang.id"> * flags="" kind="includePath" name="path"/> </resource> </language>
<resource project-relative-path="/"> * </provider>
<entry flags="" kind="includePath" name="path"/>
</resource>
</language>
</provider>
*/ */
Element elementProvider = serializeAttributes(parentElement); Element elementProvider = serializeAttributes(parentElement);
serializeEntries(elementProvider); serializeEntries(elementProvider);
@ -199,14 +217,17 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Serialize the provider attributes under parent XML element. That is * Serialize the provider attributes under parent XML element. That is
* equivalent to serializing everything (including language scope) except entries. * equivalent to serializing everything (including language scope) except
* entries.
* *
* @param parentElement - element where to serialize. * @param parentElement
* - element where to serialize.
* @return - newly created "provider" element. That element will already be * @return - newly created "provider" element. That element will already be
* attached to the parent element. * attached to the parent element.
*/ */
public Element serializeAttributes(Element parentElement) { public Element serializeAttributes(Element parentElement) {
// Keeps pairs: key, value. See JavaDoc XmlUtil.appendElement(Node, String, String[]). // Keeps pairs: key, value. See JavaDoc XmlUtil.appendElement(Node,
// String, String[]).
List<String> attributes = new ArrayList<String>(); List<String> attributes = new ArrayList<String>();
attributes.add(ATTR_ID); attributes.add(ATTR_ID);
@ -220,7 +241,8 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
attributes.add(entry.getValue()); attributes.add(entry.getValue());
} }
Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER, attributes.toArray(new String[0])); Element elementProvider = XmlUtil.appendElement(parentElement, ELEM_PROVIDER,
attributes.toArray(new String[0]));
if (languageScope != null) { if (languageScope != null) {
for (String langId : languageScope) { for (String langId : languageScope) {
@ -232,21 +254,24 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Serialize the provider entries under parent XML element. * Serialize the provider entries under parent XML element.
* @param elementProvider - element where to serialize the entries. *
* @param elementProvider
* - element where to serialize the entries.
*/ */
public void serializeEntries(Element elementProvider) { public void serializeEntries(Element elementProvider) {
fStorage.serializeEntries(elementProvider); fStorage.serializeEntries(elementProvider);
} }
/** /**
* Convenience method to persist language settings entries for the project or * Convenience method to persist language settings entries for the project
* workspace as often-used operation. * or workspace as often-used operation. Note that configuration description
* Note that configuration description is passed as an argument but the * is passed as an argument but the current implementation saves all
* current implementation saves all configurations. * configurations.
* *
* @param cfgDescription - configuration description. * @param cfgDescription
* If not {@code null}, all providers of the project are serialized. * - configuration description. If not {@code null}, all
* If {@code null}, global workspace providers are serialized. * providers of the project are serialized. If {@code null},
* global workspace providers are serialized.
* *
* @return - status of operation. * @return - status of operation.
*/ */
@ -259,26 +284,29 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
LanguageSettingsManager.serializeLanguageSettingsWorkspace(); LanguageSettingsManager.serializeLanguageSettingsWorkspace();
} }
} catch (CoreException e) { } catch (CoreException e) {
status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error serializing language settings", e); //$NON-NLS-1$ status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, IStatus.ERROR,
"Error serializing language settings", e); //$NON-NLS-1$
CCorePlugin.log(status); CCorePlugin.log(status);
} }
return status; return status;
} }
/** /**
* Convenience method to persist language settings entries in background for the project or * Convenience method to persist language settings entries in background for
* workspace as often-used operation. * the project or workspace as often-used operation. Note that configuration
* Note that configuration description is passed as an argument but the * description is passed as an argument but the current implementation saves
* current implementation saves all configurations. * all configurations.
* *
* @param cfgDescription - configuration description. * @param cfgDescription
* If not {@code null}, all providers of the project are serialized. * - configuration description. If not {@code null}, all
* If {@code null}, global workspace providers are serialized. * providers of the project are serialized. If {@code null},
* global workspace providers are serialized.
*/ */
public void serializeLanguageSettingsInBackground(ICConfigurationDescription cfgDescription) { public void serializeLanguageSettingsInBackground(ICConfigurationDescription cfgDescription) {
if (cfgDescription != null) { if (cfgDescription != null) {
if (isLanguageSettingsProviderStoreChanged(cfgDescription)) { if (isLanguageSettingsProviderStoreChanged(cfgDescription)) {
LanguageSettingsManager.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription()); LanguageSettingsManager
.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription());
} }
} else { } else {
LanguageSettingsManager.serializeLanguageSettingsWorkspaceInBackground(); LanguageSettingsManager.serializeLanguageSettingsWorkspaceInBackground();
@ -286,7 +314,8 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
/** /**
* Compare provider store with cached persistent store used to calculate delta. * Compare provider store with cached persistent store used to calculate
* delta.
*/ */
private boolean isLanguageSettingsProviderStoreChanged(ICConfigurationDescription cfgDescription) { private boolean isLanguageSettingsProviderStoreChanged(ICConfigurationDescription cfgDescription) {
if (cfgDescription instanceof IInternalCCfgInfo) { if (cfgDescription instanceof IInternalCCfgInfo) {
@ -305,12 +334,13 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
/** /**
* Load provider from XML provider element. * Load provider from XML provider element. This is convenience method not
* This is convenience method not intended to be overridden on purpose. * intended to be overridden on purpose. Override
* Override {@link #loadAttributes(Element)} or * {@link #loadAttributes(Element)} or {@link #loadEntries(Element)}
* {@link #loadEntries(Element)} instead. * instead.
* *
* @param providerNode - XML element "provider" to load provider from. * @param providerNode
* - XML element "provider" to load provider from.
*/ */
final public void load(Element providerNode) { final public void load(Element providerNode) {
fStorage.clear(); fStorage.clear();
@ -337,7 +367,9 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Load attributes from XML provider element. * Load attributes from XML provider element.
* @param providerNode - XML element "provider" to load attributes from. *
* @param providerNode
* - XML element "provider" to load attributes from.
*/ */
public void loadAttributes(Element providerNode) { public void loadAttributes(Element providerNode) {
String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID);
@ -374,37 +406,44 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* Load provider entries from XML provider element. * Load provider entries from XML provider element.
* @param providerNode - parent XML element "provider" where entries are defined. *
* @param providerNode
* - parent XML element "provider" where entries are defined.
*/ */
public void loadEntries(Element providerNode) { public void loadEntries(Element providerNode) {
fStorage.loadEntries(providerNode); fStorage.loadEntries(providerNode);
} }
/** /**
* Set a custom property of the provider. * Set a custom property of the provider. <br>
* <br><br> * <br>
* A note of caution - do not use default values for a provider which are different * A note of caution - do not use default values for a provider which are
* from empty or {@code null} value. When providers are checked for equality * different from empty or {@code null} value. When providers are checked
* (during internal operations in core) the missing properties are evaluated as * for equality (during internal operations in core) the missing properties
* empty ones. * are evaluated as empty ones.
* *
* @see LanguageSettingsBaseProvider#getProperty(String) * @see LanguageSettingsBaseProvider#getProperty(String)
* *
* @param key - name of the property. * @param key
* @param value - value of the property. * - name of the property.
* If value is {@code null} the property is removed from the list. * @param value
* - value of the property. If value is {@code null} the property
* is removed from the list.
*/ */
public void setProperty(String key, String value) { public void setProperty(String key, String value) {
properties.put(key, value); properties.put(key, value);
} }
/** /**
* Set a custom boolean property of the provider. * Set a custom boolean property of the provider. <br>
* <br>Please, note that default value is always {@code false}. * Please, note that default value is always {@code false}.
*
* @see LanguageSettingsBaseProvider#getProperty(String) * @see LanguageSettingsBaseProvider#getProperty(String)
* *
* @param key - name of the property. * @param key
* @param value - {@code boolean} value of the property. * - name of the property.
* @param value
* - {@code boolean} value of the property.
*/ */
public void setPropertyBool(String key, boolean value) { public void setPropertyBool(String key, boolean value) {
properties.put(key, Boolean.toString(value)); properties.put(key, Boolean.toString(value));
@ -412,7 +451,8 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
/** /**
* See {@link #cloneShallow()}. This method is extracted to avoid expressing * See {@link #cloneShallow()}. This method is extracted to avoid expressing
* {@link #clone()} via {@link #cloneShallow()}. Do not inline to "optimize"! * {@link #clone()} via {@link #cloneShallow()}. Do not inline to
* "optimize"!
*/ */
private LanguageSettingsSerializableProvider cloneShallowInternal() throws CloneNotSupportedException { private LanguageSettingsSerializableProvider cloneShallowInternal() throws CloneNotSupportedException {
LanguageSettingsSerializableProvider clone = (LanguageSettingsSerializableProvider) super.clone(); LanguageSettingsSerializableProvider clone = (LanguageSettingsSerializableProvider) super.clone();
@ -425,11 +465,12 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
} }
/** /**
* Shallow clone of the provider. "Shallow" is defined here as the exact copy except that * Shallow clone of the provider. "Shallow" is defined here as the exact
* the copy will have zero language settings entries. * copy except that the copy will have zero language settings entries.
* *
* @return shallow copy of the provider. * @return shallow copy of the provider.
* @throws CloneNotSupportedException in case {@link #clone()} throws the exception. * @throws CloneNotSupportedException
* in case {@link #clone()} throws the exception.
*/ */
protected LanguageSettingsSerializableProvider cloneShallow() throws CloneNotSupportedException { protected LanguageSettingsSerializableProvider cloneShallow() throws CloneNotSupportedException {
return cloneShallowInternal(); return cloneShallowInternal();

View file

@ -71,12 +71,14 @@ import org.eclipse.cdt.internal.core.model.PathEntry;
import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache; import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache;
import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo; import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo;
import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
@ -126,16 +128,17 @@ public class PathEntryTranslator {
ICdtVariableManager fMngr = CCorePlugin.getDefault().getCdtVariableManager(); ICdtVariableManager fMngr = CCorePlugin.getDefault().getCdtVariableManager();
public VarSubstitutor(ICConfigurationDescription cfgDescription) { public VarSubstitutor(ICConfigurationDescription cfgDescription) {
super(new DefaultVariableContextInfo(ICoreVariableContextInfo.CONTEXT_CONFIGURATION, cfgDescription), "", " "); //$NON-NLS-1$ //$NON-NLS-2$ super(new DefaultVariableContextInfo(ICoreVariableContextInfo.CONTEXT_CONFIGURATION,
cfgDescription), "", " "); //$NON-NLS-1$ //$NON-NLS-2$
fCfg = cfgDescription; fCfg = cfgDescription;
} }
@Override @Override
protected ResolvedMacro resolveMacro(ICdtVariable macro) protected ResolvedMacro resolveMacro(ICdtVariable macro) throws CdtVariableException {
throws CdtVariableException {
if (!CdtVarPathEntryVariableManager.isPathEntryVariable(macro, fCfg, fMngr)) if (!CdtVarPathEntryVariableManager.isPathEntryVariable(macro, fCfg, fMngr))
return super.resolveMacro(macro); return super.resolveMacro(macro);
return new ResolvedMacro(macro.getName(), CdtVariableResolver.createVariableReference(macro.getName())); return new ResolvedMacro(macro.getName(),
CdtVariableResolver.createVariableReference(macro.getName()));
} }
} }
@ -293,7 +296,6 @@ public class PathEntryTranslator {
} }
return new ICLanguageSettingEntry[0]; return new ICLanguageSettingEntry[0];
} }
} }
@ -319,10 +321,9 @@ public class PathEntryTranslator {
case IPathEntry.CDT_LIBRARY: { case IPathEntry.CDT_LIBRARY: {
if (path != null) { if (path != null) {
ILibraryEntry libEntry = (ILibraryEntry) entry.fEntry; ILibraryEntry libEntry = (ILibraryEntry) entry.fEntry;
return (ICLanguageSettingEntry) CDataUtil.createEntry(ICSettingEntry.LIBRARY_FILE, name, null, null, flags, return (ICLanguageSettingEntry) CDataUtil.createEntry(ICSettingEntry.LIBRARY_FILE, name, null,
libEntry.getSourceAttachmentPath(), null, flags, libEntry.getSourceAttachmentPath(),
libEntry.getSourceAttachmentRootPath(), libEntry.getSourceAttachmentRootPath(), libEntry.getSourceAttachmentPrefixMapping());
libEntry.getSourceAttachmentPrefixMapping());
} }
break; break;
} }
@ -466,7 +467,8 @@ public class PathEntryTranslator {
basePath = mngr.resolvePath(basePath); basePath = mngr.resolvePath(basePath);
valuePath = mngr.resolvePath(valuePath); valuePath = mngr.resolvePath(valuePath);
fName = unresolvedBase.isEmpty() ? unresolvedValue.toString() : unresolvedBase.append(unresolvedValue).toString(); fName = unresolvedBase.isEmpty() ? unresolvedValue.toString()
: unresolvedBase.append(unresolvedValue).toString();
fValue = fName; fValue = fName;
if (!basePath.isEmpty()) { if (!basePath.isEmpty()) {
@ -488,7 +490,8 @@ public class PathEntryTranslator {
ResourceInfo rcInfo = fResolvedEntry.getResourceInfo(); ResourceInfo rcInfo = fResolvedEntry.getResourceInfo();
if (rcInfo.fExists) { if (rcInfo.fExists) {
if (rcInfo.fRc.getType() == IResource.FILE) { if (rcInfo.fRc.getType() == IResource.FILE) {
rcInfo = findResourceInfo(fRoot, rcInfo.fRc.getFullPath().removeLastSegments(1), true); rcInfo = findResourceInfo(fRoot,
rcInfo.fRc.getFullPath().removeLastSegments(1), true);
} }
IPath location = rcInfo.fRc.getLocation(); IPath location = rcInfo.fRc.getLocation();
if (location != null && rcInfo.fRc.getType() != IResource.FILE) { if (location != null && rcInfo.fRc.getType() != IResource.FILE) {
@ -562,7 +565,8 @@ public class PathEntryTranslator {
} else { } else {
fFilterInfos = new ResourceInfo[paths.length]; fFilterInfos = new ResourceInfo[paths.length];
for (int i = 0; i < paths.length; i++) { for (int i = 0; i < paths.length; i++) {
fFilterInfos[i] = processInexistingResourceFilter((IContainer)rcInfo.fRc, paths[i]); fFilterInfos[i] = processInexistingResourceFilter((IContainer) rcInfo.fRc,
paths[i]);
} }
} }
} }
@ -594,7 +598,6 @@ public class PathEntryTranslator {
return fResolvedValue; return fResolvedValue;
} }
} }
private static class PathEntryComposer { private static class PathEntryComposer {
@ -604,7 +607,10 @@ public class PathEntryTranslator {
private boolean fIsExported; private boolean fIsExported;
private IProject fProject; private IProject fProject;
PathEntryComposer(IPath path, IProject project/*, ICConfigurationDescription cfgDescription*/) { PathEntryComposer(IPath path,
IProject project/*
* , ICConfigurationDescription cfgDescription
*/) {
fPath = toProjectPath(path); fPath = toProjectPath(path);
fProject = project; fProject = project;
} }
@ -616,7 +622,10 @@ public class PathEntryTranslator {
return path.makeAbsolute(); return path.makeAbsolute();
} }
PathEntryComposer(ICExclusionPatternPathEntry entry, IProject project/*, ICConfigurationDescription cfgDescription*/) { PathEntryComposer(ICExclusionPatternPathEntry entry,
IProject project/*
* , ICConfigurationDescription cfgDescription
*/) {
fPath = new Path(entry.getValue()); fPath = new Path(entry.getValue());
fLangEntry = entry; fLangEntry = entry;
fProject = project; fProject = project;
@ -627,7 +636,10 @@ public class PathEntryTranslator {
} }
} }
PathEntryComposer(IPath path, ICLanguageSettingEntry entry, boolean exported, IProject project/*, ICConfigurationDescription cfgDescription*/) { PathEntryComposer(IPath path, ICLanguageSettingEntry entry, boolean exported,
IProject project/*
* , ICConfigurationDescription cfgDescription
*/) {
fPath = path; fPath = path;
fLangEntry = entry; fLangEntry = entry;
fIsExported = exported; fIsExported = exported;
@ -656,10 +668,12 @@ public class PathEntryTranslator {
} }
private IPath[][] getEntryPath(ICSettingEntry entry, ICConfigurationDescription cfgDescription) { private IPath[][] getEntryPath(ICSettingEntry entry, ICConfigurationDescription cfgDescription) {
return valueToEntryPath(entry.getName(), (entry.getFlags() & ICSettingEntry.VALUE_WORKSPACE_PATH) != 0, cfgDescription); return valueToEntryPath(entry.getName(),
(entry.getFlags() & ICSettingEntry.VALUE_WORKSPACE_PATH) != 0, cfgDescription);
} }
private IPath[][] valueToEntryPath(String value, boolean isWsp, ICConfigurationDescription cfgDescription) { private IPath[][] valueToEntryPath(String value, boolean isWsp,
ICConfigurationDescription cfgDescription) {
String[] pathVarValues = resolveKeepingPathEntryFars(value, cfgDescription); String[] pathVarValues = resolveKeepingPathEntryFars(value, cfgDescription);
IPath result[][] = new IPath[2][pathVarValues.length]; IPath result[][] = new IPath[2][pathVarValues.length];
for (int i = 0; i < pathVarValues.length; i++) { for (int i = 0; i < pathVarValues.length; i++) {
@ -677,8 +691,10 @@ public class PathEntryTranslator {
if (pathVarPath.segmentCount() != 0) { if (pathVarPath.segmentCount() != 0) {
String resolvedProjName = projName; String resolvedProjName = projName;
String varProjName = pathVarPath.segment(0); String varProjName = pathVarPath.segment(0);
IPath resolvedProjPath = CCorePlugin.getDefault().getPathEntryVariableManager().resolvePath(new Path(varProjName)); IPath resolvedProjPath = CCorePlugin.getDefault()
if (resolvedProjPath.segmentCount() == 1 && resolvedProjName.equals(resolvedProjPath.segment(0))) { .getPathEntryVariableManager().resolvePath(new Path(varProjName));
if (resolvedProjPath.segmentCount() == 1
&& resolvedProjName.equals(resolvedProjPath.segment(0))) {
projName = varProjName; projName = varProjName;
valuePath = pathVarPath.removeFirstSegments(1).makeRelative(); valuePath = pathVarPath.removeFirstSegments(1).makeRelative();
} }
@ -712,7 +728,8 @@ public class PathEntryTranslator {
IPath paths[][] = getEntryPath(fLangEntry, cfgDescription); IPath paths[][] = getEntryPath(fLangEntry, cfgDescription);
result = new IPathEntry[paths[0].length]; result = new IPathEntry[paths[0].length];
for (int i = 0; i < result.length; i++) for (int i = 0; i < result.length; i++)
result[i] = CoreModel.newIncludeFileEntry(path, null, paths[0][i], paths[1][i], getExclusionPatterns(), fIsExported); result[i] = CoreModel.newIncludeFileEntry(path, null, paths[0][i], paths[1][i],
getExclusionPatterns(), fIsExported);
return result; return result;
} }
case ICSettingEntry.INCLUDE_PATH: { case ICSettingEntry.INCLUDE_PATH: {
@ -721,18 +738,21 @@ public class PathEntryTranslator {
result = new IPathEntry[paths[0].length]; result = new IPathEntry[paths[0].length];
for (int i = 0; i < result.length; i++) for (int i = 0; i < result.length; i++)
result[i] = CoreModel.newIncludeEntry(path, paths[0][i], paths[1][i], !ipe.isLocal(), getExclusionPatterns(), fIsExported); result[i] = CoreModel.newIncludeEntry(path, paths[0][i], paths[1][i], !ipe.isLocal(),
getExclusionPatterns(), fIsExported);
return result; return result;
} }
case ICSettingEntry.MACRO: case ICSettingEntry.MACRO:
result = new IPathEntry[1]; result = new IPathEntry[1];
result[0] = CoreModel.newMacroEntry(path, fLangEntry.getName(), fLangEntry.getValue(), getExclusionPatterns(), fIsExported); result[0] = CoreModel.newMacroEntry(path, fLangEntry.getName(), fLangEntry.getValue(),
getExclusionPatterns(), fIsExported);
return result; return result;
case ICSettingEntry.MACRO_FILE: { case ICSettingEntry.MACRO_FILE: {
IPath paths[][] = getEntryPath(fLangEntry, cfgDescription); IPath paths[][] = getEntryPath(fLangEntry, cfgDescription);
result = new IPathEntry[paths[0].length]; result = new IPathEntry[paths[0].length];
for (int i = 0; i < result.length; i++) for (int i = 0; i < result.length; i++)
result[i] = CoreModel.newMacroFileEntry(path, paths[0][i], null, paths[1][i], getExclusionPatterns(), fIsExported); result[i] = CoreModel.newMacroFileEntry(path, paths[0][i], null, paths[1][i],
getExclusionPatterns(), fIsExported);
return result; return result;
} }
case ICSettingEntry.LIBRARY_PATH: case ICSettingEntry.LIBRARY_PATH:
@ -744,7 +764,8 @@ public class PathEntryTranslator {
// IPath paths[][] = getEntryPath(fLangEntry, cfgDescription); // IPath paths[][] = getEntryPath(fLangEntry, cfgDescription);
// result = new IPathEntry[paths[0].length]; // result = new IPathEntry[paths[0].length];
// for (int i = 0; i < result.length; i++) // for (int i = 0; i < result.length; i++)
// result[i] = CoreModel.newLibraryEntry(path, paths[0][i], paths[1][i], null, null, null, fIsExported); // result[i] = CoreModel.newLibraryEntry(path, paths[0][i],
// paths[1][i], null, null, null, fIsExported);
// return result; // return result;
//} //}
case ICSettingEntry.OUTPUT_PATH: case ICSettingEntry.OUTPUT_PATH:
@ -769,14 +790,16 @@ public class PathEntryTranslator {
private static String resolveAll(String value, ICConfigurationDescription cfgDescription) { private static String resolveAll(String value, ICConfigurationDescription cfgDescription) {
try { try {
return CCorePlugin.getDefault().getCdtVariableManager().resolveValue(value, "", " ", cfgDescription); //$NON-NLS-1$ //$NON-NLS-2$ return CCorePlugin.getDefault().getCdtVariableManager().resolveValue(value, "", " ", //$NON-NLS-1$ //$NON-NLS-2$
cfgDescription);
} catch (CdtVariableException e) { } catch (CdtVariableException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
} }
return value; return value;
} }
private static String[] resolveKeepingPathEntryFars(String value, ICConfigurationDescription cfgDescription) { private static String[] resolveKeepingPathEntryFars(String value,
ICConfigurationDescription cfgDescription) {
String[] result = new String[] { value }; // default value; String[] result = new String[] { value }; // default value;
try { try {
VarSubstitutor substitutor = new VarSubstitutor(cfgDescription); VarSubstitutor substitutor = new VarSubstitutor(cfgDescription);
@ -797,7 +820,10 @@ public class PathEntryTranslator {
private LinkedHashMap<IPath, PathEntryComposer> fRefProjMap; private LinkedHashMap<IPath, PathEntryComposer> fRefProjMap;
private IProject fProject; private IProject fProject;
private PathEntryCollector(IProject project/*, ICConfigurationDescription cfgDescription*/) { private PathEntryCollector(
IProject project/*
* , ICConfigurationDescription cfgDescription
*/) {
fStorage = PathSettingsContainer.createRootContainer(); fStorage = PathSettingsContainer.createRootContainer();
fStorage.setValue(this); fStorage.setValue(this);
fStore = new KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>>(false); fStore = new KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>>(false);
@ -805,7 +831,11 @@ public class PathEntryTranslator {
fProject = project; fProject = project;
} }
private PathEntryCollector(PathSettingsContainer container, KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>> store, IProject project/*, ICConfigurationDescription cfgDescription*/) { private PathEntryCollector(PathSettingsContainer container,
KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>> store,
IProject project/*
* , ICConfigurationDescription cfgDescription
*/) {
fStorage = container; fStorage = container;
fStore = store; fStore = store;
fNameKeyMapStore = new KindBasedStore<LinkedHashMap<EntryNameKey, PathEntryComposer>>(false); fNameKeyMapStore = new KindBasedStore<LinkedHashMap<EntryNameKey, PathEntryComposer>>(false);
@ -821,8 +851,7 @@ public class PathEntryTranslator {
PathEntryComposer old = nameKeyMap.get(nameKey); PathEntryComposer old = nameKeyMap.get(nameKey);
if (old != null) { if (old != null) {
entry = CDataUtil.addRemoveExclusionsToEntry(entry, entry = CDataUtil.addRemoveExclusionsToEntry(entry,
((ICExclusionPatternPathEntry)old.fLangEntry).getExclusionPatterns(), ((ICExclusionPatternPathEntry) old.fLangEntry).getExclusionPatterns(), true);
true);
} }
PathEntryComposer newComposer = new PathEntryComposer(entry, fProject/* , fCfg */); PathEntryComposer newComposer = new PathEntryComposer(entry, fProject/* , fCfg */);
map.put(entry, newComposer); map.put(entry, newComposer);
@ -836,7 +865,8 @@ public class PathEntryTranslator {
} else { } else {
fRefProjMap = new LinkedHashMap<IPath, PathEntryComposer>(); fRefProjMap = new LinkedHashMap<IPath, PathEntryComposer>();
for (IPath path : paths) { for (IPath path : paths) {
PathEntryComposer cs = new PathEntryComposer(path, fProject/*, fCfg*/); PathEntryComposer cs = new PathEntryComposer(path,
fProject/* , fCfg */);
IPath composerPath = cs.getPath(); IPath composerPath = cs.getPath();
fRefProjMap.put(composerPath, cs); fRefProjMap.put(composerPath, cs);
} }
@ -847,7 +877,8 @@ public class PathEntryTranslator {
if (path.segmentCount() == 0) if (path.segmentCount() == 0)
return this; return this;
PathEntryCollector cr = (PathEntryCollector)fStorage.getChildContainer(path, false, false).getValue(); PathEntryCollector cr = (PathEntryCollector) fStorage.getChildContainer(path, false, false)
.getValue();
if (cr != this) { if (cr != this) {
IPath basePath = cr.getPath(); IPath basePath = cr.getPath();
path = path.removeFirstSegments(basePath.segmentCount()); path = path.removeFirstSegments(basePath.segmentCount());
@ -856,18 +887,21 @@ public class PathEntryTranslator {
PathSettingsContainer newContainer = fStorage.getChildContainer(path, true, true); PathSettingsContainer newContainer = fStorage.getChildContainer(path, true, true);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>> cloneStore = KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>> cloneStore = (KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>>) fStore
(KindBasedStore<LinkedHashMap<ICSettingEntry, PathEntryComposer>>)fStore.clone(); .clone();
IKindBasedInfo<LinkedHashMap<ICSettingEntry, PathEntryComposer>> info[] = cloneStore.getContents(); IKindBasedInfo<LinkedHashMap<ICSettingEntry, PathEntryComposer>> info[] = cloneStore
.getContents();
for (IKindBasedInfo<LinkedHashMap<ICSettingEntry, PathEntryComposer>> kindInfo : info) { for (IKindBasedInfo<LinkedHashMap<ICSettingEntry, PathEntryComposer>> kindInfo : info) {
LinkedHashMap<ICSettingEntry, PathEntryComposer> map = kindInfo.getInfo(); LinkedHashMap<ICSettingEntry, PathEntryComposer> map = kindInfo.getInfo();
if (map != null) { if (map != null) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
LinkedHashMap<ICSettingEntry, PathEntryComposer> clone = (LinkedHashMap<ICSettingEntry, PathEntryComposer>)map.clone(); LinkedHashMap<ICSettingEntry, PathEntryComposer> clone = (LinkedHashMap<ICSettingEntry, PathEntryComposer>) map
.clone();
kindInfo.setInfo(clone); kindInfo.setInfo(clone);
} }
} }
PathEntryCollector newCr = new PathEntryCollector(newContainer, cloneStore, fProject/*, fCfg*/); PathEntryCollector newCr = new PathEntryCollector(newContainer, cloneStore,
fProject/* , fCfg */);
newContainer.setValue(newCr); newContainer.setValue(newCr);
return newCr; return newCr;
} }
@ -876,16 +910,17 @@ public class PathEntryTranslator {
return fStorage.getPath(); return fStorage.getPath();
} }
public void setEntries(int kind, ICLanguageSettingEntry entries[], Set<ICSettingEntry> exportedEntries) { public void setEntries(int kind, ICLanguageSettingEntry entries[],
Set<ICSettingEntry> exportedEntries) {
IPath path = getPath(); IPath path = getPath();
HashSet<ICSettingEntry> parentSet = getEntriesSetCopy(kind); HashSet<ICSettingEntry> parentSet = getEntriesSetCopy(kind);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
HashSet<ICSettingEntry> removedParentSet = (HashSet<ICSettingEntry>) parentSet.clone(); HashSet<ICSettingEntry> removedParentSet = (HashSet<ICSettingEntry>) parentSet.clone();
HashSet<ICLanguageSettingEntry> addedThisSet = new HashSet<ICLanguageSettingEntry>(Arrays.asList(entries)); HashSet<ICLanguageSettingEntry> addedThisSet = new HashSet<ICLanguageSettingEntry>(
Arrays.asList(entries));
removedParentSet.removeAll(addedThisSet); removedParentSet.removeAll(addedThisSet);
addedThisSet.removeAll(parentSet); addedThisSet.removeAll(parentSet);
if (removedParentSet.size() != 0) { if (removedParentSet.size() != 0) {
PathEntryCollector parent = getParent(); PathEntryCollector parent = getParent();
IPath parentPath = parent.getPath(); IPath parentPath = parent.getPath();
@ -914,7 +949,8 @@ public class PathEntryTranslator {
continue; continue;
ICLanguageSettingEntry entry = entries[i]; ICLanguageSettingEntry entry = entries[i];
map.put(entry, new PathEntryComposer(fullPath, entry, exportedEntries.contains(entry), fProject/*, fCfg*/)); map.put(entry, new PathEntryComposer(fullPath, entry, exportedEntries.contains(entry),
fProject/* , fCfg */));
} }
} }
} }
@ -928,7 +964,8 @@ public class PathEntryTranslator {
return map; return map;
} }
private LinkedHashMap<EntryNameKey, PathEntryComposer> getEntriesNameKeyMap(int kind, boolean create) { private LinkedHashMap<EntryNameKey, PathEntryComposer> getEntriesNameKeyMap(int kind,
boolean create) {
LinkedHashMap<EntryNameKey, PathEntryComposer> map = fNameKeyMapStore.get(kind); LinkedHashMap<EntryNameKey, PathEntryComposer> map = fNameKeyMapStore.get(kind);
if (map == null && create) { if (map == null && create) {
map = new LinkedHashMap<EntryNameKey, PathEntryComposer>(); map = new LinkedHashMap<EntryNameKey, PathEntryComposer>();
@ -980,7 +1017,8 @@ public class PathEntryTranslator {
return list; return list;
} }
private void getLocalCollectedEntries(int kind, List<PathEntryComposer> list, Set<PathEntryComposer> addedEntries) { private void getLocalCollectedEntries(int kind, List<PathEntryComposer> list,
Set<PathEntryComposer> addedEntries) {
Map<ICSettingEntry, PathEntryComposer> map = getEntriesMap(kind, false); Map<ICSettingEntry, PathEntryComposer> map = getEntriesMap(kind, false);
if (map == null) if (map == null)
return; return;
@ -992,7 +1030,8 @@ public class PathEntryTranslator {
} }
} }
public List<IPathEntry> getEntries(int peKind, List<IPathEntry> list, int flags, ICConfigurationDescription cfgDescription) { public List<IPathEntry> getEntries(int peKind, List<IPathEntry> list, int flags,
ICConfigurationDescription cfgDescription) {
Set<IPathEntry> set = new LinkedHashSet<IPathEntry>(); Set<IPathEntry> set = new LinkedHashSet<IPathEntry>();
int sKind = peKindToSettingKind(peKind); int sKind = peKindToSettingKind(peKind);
@ -1059,7 +1098,8 @@ public class PathEntryTranslator {
return entry != null && (entry.isBuiltIn() || entry.isReadOnly()); return entry != null && (entry.isBuiltIn() || entry.isReadOnly());
} }
public List<IPathEntry> getEntries(List<IPathEntry> list, int flags, ICConfigurationDescription cfgDescription) { public List<IPathEntry> getEntries(List<IPathEntry> list, int flags,
ICConfigurationDescription cfgDescription) {
if (list == null) if (list == null)
list = new ArrayList<IPathEntry>(); list = new ArrayList<IPathEntry>();
int peKinds[] = PathEntryKyndStore.getSupportedKinds(); int peKinds[] = PathEntryKyndStore.getSupportedKinds();
@ -1085,7 +1125,6 @@ public class PathEntryTranslator {
return null; return null;
} }
private static boolean areEntriesReadOnly(PathEntryResolveInfoElement el) { private static boolean areEntriesReadOnly(PathEntryResolveInfoElement el) {
switch (el.getRawEntry().getEntryKind()) { switch (el.getRawEntry().getEntryKind()) {
case IPathEntry.CDT_LIBRARY: case IPathEntry.CDT_LIBRARY:
@ -1102,7 +1141,6 @@ public class PathEntryTranslator {
return true; return true;
} }
private IPath getEntryFullPath(IPathEntry entry) { private IPath getEntryFullPath(IPathEntry entry) {
IPath path = entry.getPath(); IPath path = entry.getPath();
if (path == null) if (path == null)
@ -1219,7 +1257,8 @@ public class PathEntryTranslator {
ICExternalSetting extSettings[]; ICExternalSetting extSettings[];
if (exportSettingsList.size() != 0) { if (exportSettingsList.size() != 0) {
extSettings = new ICExternalSetting[1]; extSettings = new ICExternalSetting[1];
List<ICLanguageSettingEntry> list = new ArrayList<ICLanguageSettingEntry>(exportSettingsList.size()); List<ICLanguageSettingEntry> list = new ArrayList<ICLanguageSettingEntry>(
exportSettingsList.size());
for (int i = 0; i < exportSettingsList.size(); i++) { for (int i = 0; i < exportSettingsList.size(); i++) {
ResolvedEntry re = exportSettingsList.get(i); ResolvedEntry re = exportSettingsList.get(i);
ICLanguageSettingEntry le = createLangEntry(re); ICLanguageSettingEntry le = createLangEntry(re);
@ -1251,13 +1290,11 @@ public class PathEntryTranslator {
return entries; return entries;
} }
private static ICSourceEntry toCSourceEntry(ISourceEntry entry, boolean makeProjRelative) { private static ICSourceEntry toCSourceEntry(ISourceEntry entry, boolean makeProjRelative) {
IPath path = entry.getPath(); IPath path = entry.getPath();
if (makeProjRelative && path.isAbsolute()) if (makeProjRelative && path.isAbsolute())
path = path.removeFirstSegments(1); path = path.removeFirstSegments(1);
return new CSourceEntry(path, return new CSourceEntry(path, entry.getExclusionPatterns(),
entry.getExclusionPatterns(),
ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED); ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED);
} }
@ -1265,12 +1302,12 @@ public class PathEntryTranslator {
IPath path = entry.getPath(); IPath path = entry.getPath();
if (makeProjRelative && path.isAbsolute()) if (makeProjRelative && path.isAbsolute())
path = path.removeFirstSegments(1); path = path.removeFirstSegments(1);
return new COutputEntry(path, return new COutputEntry(path, entry.getExclusionPatterns(),
entry.getExclusionPatterns(),
ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED); ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED);
} }
private static ICSettingEntry[] replaceUserEntries(ICSettingEntry[] oldEntries, ICSettingEntry[] newUsrEntries) { private static ICSettingEntry[] replaceUserEntries(ICSettingEntry[] oldEntries,
ICSettingEntry[] newUsrEntries) {
Set<ICSettingEntry> set = new LinkedHashSet<ICSettingEntry>(); Set<ICSettingEntry> set = new LinkedHashSet<ICSettingEntry>();
Class<?> componentType = null; Class<?> componentType = null;
@ -1407,7 +1444,8 @@ public class PathEntryTranslator {
return list.toArray(new CResourceData[list.size()]); return list.toArray(new CResourceData[list.size()]);
} }
private CResourceData getResourceData(IPath path, boolean create, boolean exactPath) throws CoreException{ private CResourceData getResourceData(IPath path, boolean create, boolean exactPath)
throws CoreException {
PathSettingsContainer rcDataH = fRcDataHolder.getChildContainer(path, false, exactPath); PathSettingsContainer rcDataH = fRcDataHolder.getChildContainer(path, false, exactPath);
if (rcDataH != null) { if (rcDataH != null) {
return (CResourceData) rcDataH.getValue(); return (CResourceData) rcDataH.getValue();
@ -1422,7 +1460,8 @@ public class PathEntryTranslator {
} else { } else {
CFolderData folderData = (CFolderData) base; CFolderData folderData = (CFolderData) base;
CLanguageData lDatas[] = folderData.getLanguageDatas(); CLanguageData lDatas[] = folderData.getLanguageDatas();
CLanguageData baseLData = CDataUtil.findLanguagDataForFile(rcInfo.fRc.getFullPath().lastSegment(), fProject, lDatas); CLanguageData baseLData = CDataUtil
.findLanguagDataForFile(rcInfo.fRc.getFullPath().lastSegment(), fProject, lDatas);
newRcData = fCfgData.createFileData(path, folderData, baseLData); newRcData = fCfgData.createFileData(path, folderData, baseLData);
} }
} else { } else {
@ -1440,9 +1479,9 @@ public class PathEntryTranslator {
} }
private void applyEntries(CResourceData rcData, RcDesInfo info, int op) { private void applyEntries(CResourceData rcData, RcDesInfo info, int op) {
CLanguageData lDatas[] = rcData.getType() == ICSettingBase.SETTING_FILE ? CLanguageData lDatas[] = rcData.getType() == ICSettingBase.SETTING_FILE
new CLanguageData[] { ((CFileData)rcData).getLanguageData() } : ? new CLanguageData[] { ((CFileData) rcData).getLanguageData() }
((CFolderData) rcData).getLanguageDatas(); : ((CFolderData) rcData).getLanguageDatas();
for (CLanguageData lData : lDatas) { for (CLanguageData lData : lDatas) {
if (lData == null) if (lData == null)
@ -1452,7 +1491,6 @@ public class PathEntryTranslator {
} }
} }
private void applyEntries(CLanguageData lData, RcDesInfo info, int op) { private void applyEntries(CLanguageData lData, RcDesInfo info, int op) {
int kinds[] = KindBasedStore.getLanguageEntryKinds(); int kinds[] = KindBasedStore.getLanguageEntryKinds();
int supported = lData.getSupportedEntryKinds(); int supported = lData.getSupportedEntryKinds();
@ -1472,13 +1510,14 @@ public class PathEntryTranslator {
} }
private ICLanguageSettingEntry[] composeNewEntries(ICLanguageSettingEntry oldEntries[], private ICLanguageSettingEntry[] composeNewEntries(ICLanguageSettingEntry oldEntries[],
ICLanguageSettingEntry newEntries[], ICLanguageSettingEntry newEntries[], int op) {
int op) {
ICLanguageSettingEntry result[]; ICLanguageSettingEntry result[];
switch (op) { switch (op) {
case OP_ADD: { case OP_ADD: {
Set<ICLanguageSettingEntry> oldSet = new HashSet<ICLanguageSettingEntry>(Arrays.asList(oldEntries)); Set<ICLanguageSettingEntry> oldSet = new HashSet<ICLanguageSettingEntry>(
Set<ICLanguageSettingEntry> newSet = new HashSet<ICLanguageSettingEntry>(Arrays.asList(newEntries)); Arrays.asList(oldEntries));
Set<ICLanguageSettingEntry> newSet = new HashSet<ICLanguageSettingEntry>(
Arrays.asList(newEntries));
newSet.removeAll(oldSet); newSet.removeAll(oldSet);
if (newSet.size() == 0) { if (newSet.size() == 0) {
result = oldEntries; result = oldEntries;
@ -1490,8 +1529,10 @@ public class PathEntryTranslator {
break; break;
} }
case OP_REMOVE: { case OP_REMOVE: {
Set<ICLanguageSettingEntry> oldSet = new HashSet<ICLanguageSettingEntry>(Arrays.asList(oldEntries)); Set<ICLanguageSettingEntry> oldSet = new HashSet<ICLanguageSettingEntry>(
Set<ICLanguageSettingEntry> newSet = new HashSet<ICLanguageSettingEntry>(Arrays.asList(newEntries)); Arrays.asList(oldEntries));
Set<ICLanguageSettingEntry> newSet = new HashSet<ICLanguageSettingEntry>(
Arrays.asList(newEntries));
oldSet.removeAll(newSet); oldSet.removeAll(newSet);
if (oldSet.size() == 0) { if (oldSet.size() == 0) {
result = new ICLanguageSettingEntry[0]; result = new ICLanguageSettingEntry[0];
@ -1520,7 +1561,8 @@ public class PathEntryTranslator {
RcDesInfo rcDes = (RcDesInfo) cr.getValue(); RcDesInfo rcDes = (RcDesInfo) cr.getValue();
if (rcDes != null) { if (rcDes != null) {
List<ResolvedEntry> rEntries = rcDes.fResolvedEntries; List<ResolvedEntry> rEntries = rcDes.fResolvedEntries;
List<LangEntryInfo> curLanfInfos = new ArrayList<LangEntryInfo>(rEntries.size() + langEntryInfoList.size()); List<LangEntryInfo> curLanfInfos = new ArrayList<LangEntryInfo>(
rEntries.size() + langEntryInfoList.size());
for (ResolvedEntry re : rEntries) { for (ResolvedEntry re : rEntries) {
LangEntryInfo li = createLangEntryInfo(re); LangEntryInfo li = createLangEntryInfo(re);
if (li != null) { if (li != null) {
@ -1650,7 +1692,6 @@ public class PathEntryTranslator {
return new ResolvedEntry(entry, el); return new ResolvedEntry(entry, el);
} }
private ResolvedEntry[] getResolvedEntries(IPathEntry[] usrEntries, IPathEntry[] sysEntries) { private ResolvedEntry[] getResolvedEntries(IPathEntry[] usrEntries, IPathEntry[] sysEntries) {
int length = usrEntries != null ? usrEntries.length : 0; int length = usrEntries != null ? usrEntries.length : 0;
if (sysEntries != null) if (sysEntries != null)
@ -1678,7 +1719,8 @@ public class PathEntryTranslator {
ResourceInfo[] baseInfos = (ResourceInfo[]) cr.getValue(); ResourceInfo[] baseInfos = (ResourceInfo[]) cr.getValue();
ResourceInfo[] result; ResourceInfo[] result;
if (!baseInfos[0].fExists) { if (!baseInfos[0].fExists) {
// resource does not exist, always create new rc info and not add it to map // resource does not exist, always create new rc info and not add it
// to map
ResourceInfo inexistent = new ResourceInfo(container.getFolder(path), false); ResourceInfo inexistent = new ResourceInfo(container.getFolder(path), false);
result = new ResourceInfo[] { inexistent }; result = new ResourceInfo[] { inexistent };
} else { } else {
@ -1902,18 +1944,18 @@ public class PathEntryTranslator {
case IPathEntry.CDT_LIBRARY: { case IPathEntry.CDT_LIBRARY: {
IPath libraryPath = new Path(getAttribute(element, ATTRIBUTE_LIBRARY)); IPath libraryPath = new Path(getAttribute(element, ATTRIBUTE_LIBRARY));
// source attachment info (optional) // source attachment info (optional)
IPath sourceAttachmentPath = element.getAttribute(ATTRIBUTE_SOURCEPATH) != null ? new Path( IPath sourceAttachmentPath = element.getAttribute(ATTRIBUTE_SOURCEPATH) != null
element.getAttribute(ATTRIBUTE_SOURCEPATH)) : null; ? new Path(element.getAttribute(ATTRIBUTE_SOURCEPATH)) : null;
IPath sourceAttachmentRootPath = element.getAttribute(ATTRIBUTE_ROOTPATH) != null ? new Path( IPath sourceAttachmentRootPath = element.getAttribute(ATTRIBUTE_ROOTPATH) != null
element.getAttribute(ATTRIBUTE_ROOTPATH)) : null; ? new Path(element.getAttribute(ATTRIBUTE_ROOTPATH)) : null;
IPath sourceAttachmentPrefixMapping = element.getAttribute(ATTRIBUTE_PREFIXMAPPING) != null ? new Path( IPath sourceAttachmentPrefixMapping = element.getAttribute(ATTRIBUTE_PREFIXMAPPING) != null
element.getAttribute(ATTRIBUTE_PREFIXMAPPING)) : null; ? new Path(element.getAttribute(ATTRIBUTE_PREFIXMAPPING)) : null;
if (!baseRef.isEmpty()) { if (!baseRef.isEmpty()) {
return CoreModel.newLibraryRefEntry(path, baseRef, libraryPath); return CoreModel.newLibraryRefEntry(path, baseRef, libraryPath);
} }
return CoreModel.newLibraryEntry(path, basePath, libraryPath, sourceAttachmentPath, sourceAttachmentRootPath, return CoreModel.newLibraryEntry(path, basePath, libraryPath, sourceAttachmentPath,
sourceAttachmentPrefixMapping, isExported); sourceAttachmentRootPath, sourceAttachmentPrefixMapping, isExported);
} }
case IPathEntry.CDT_SOURCE: { case IPathEntry.CDT_SOURCE: {
// must be an entry in this project or specify another // must be an entry in this project or specify another
@ -1939,12 +1981,14 @@ public class PathEntryTranslator {
if (!baseRef.isEmpty()) { if (!baseRef.isEmpty()) {
return CoreModel.newIncludeRefEntry(path, baseRef, includePath); return CoreModel.newIncludeRefEntry(path, baseRef, includePath);
} }
return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns, isExported); return CoreModel.newIncludeEntry(path, basePath, includePath, isSystemInclude, exclusionPatterns,
isExported);
} }
case IPathEntry.CDT_INCLUDE_FILE: { case IPathEntry.CDT_INCLUDE_FILE: {
// include path info // include path info
IPath includeFilePath = new Path(getAttribute(element, ATTRIBUTE_INCLUDE_FILE)); IPath includeFilePath = new Path(getAttribute(element, ATTRIBUTE_INCLUDE_FILE));
return CoreModel.newIncludeFileEntry(path, basePath, baseRef, includeFilePath, exclusionPatterns, isExported); return CoreModel.newIncludeFileEntry(path, basePath, baseRef, includeFilePath, exclusionPatterns,
isExported);
} }
case IPathEntry.CDT_MACRO: { case IPathEntry.CDT_MACRO: {
String macroName = getAttribute(element, ATTRIBUTE_NAME); String macroName = getAttribute(element, ATTRIBUTE_NAME);
@ -1956,22 +2000,24 @@ public class PathEntryTranslator {
} }
case IPathEntry.CDT_MACRO_FILE: { case IPathEntry.CDT_MACRO_FILE: {
IPath macroFilePath = new Path(getAttribute(element, ATTRIBUTE_MACRO_FILE)); IPath macroFilePath = new Path(getAttribute(element, ATTRIBUTE_MACRO_FILE));
return CoreModel.newMacroFileEntry(path, basePath, baseRef, macroFilePath, exclusionPatterns, isExported); return CoreModel.newMacroFileEntry(path, basePath, baseRef, macroFilePath, exclusionPatterns,
isExported);
} }
case IPathEntry.CDT_CONTAINER: { case IPathEntry.CDT_CONTAINER: {
IPath id = new Path(getAttribute(element, ATTRIBUTE_PATH)); IPath id = new Path(getAttribute(element, ATTRIBUTE_PATH));
return CoreModel.newContainerEntry(id, isExported); return CoreModel.newContainerEntry(id, isExported);
} }
default: { default: {
ICModelStatus status = new CModelStatus(IStatus.ERROR, "PathEntry: unknown kind (" + kindAttr + ")"); //$NON-NLS-1$ //$NON-NLS-2$ ICModelStatus status = new CModelStatus(IStatus.ERROR,
"PathEntry: unknown kind (" + kindAttr + ")"); //$NON-NLS-1$ //$NON-NLS-2$
throw new CModelException(status); throw new CModelException(status);
} }
} }
} }
private static CConfigurationData getCfgData(ICConfigurationDescription cfgDescription) { private static CConfigurationData getCfgData(ICConfigurationDescription cfgDescription) {
return cfgDescription instanceof CConfigurationDescriptionCache ? return cfgDescription instanceof CConfigurationDescriptionCache ? (CConfigurationData) cfgDescription
(CConfigurationData)cfgDescription : ((IInternalCCfgInfo)cfgDescription).getConfigurationData(false); : ((IInternalCCfgInfo) cfgDescription).getConfigurationData(false);
} }
private static void addOutputEntries(PathEntryCollector cr, CConfigurationData cfgData) { private static void addOutputEntries(PathEntryCollector cr, CConfigurationData cfgData) {
@ -1984,20 +2030,22 @@ public class PathEntryTranslator {
} }
} }
public static PathEntryCollector collectEntries(IProject project, final ICConfigurationDescription cfgDescription) { public static PathEntryCollector collectEntries(IProject project,
final ICConfigurationDescription cfgDescription) {
CConfigurationData cfgData = getCfgData(cfgDescription); CConfigurationData cfgData = getCfgData(cfgDescription);
ReferenceSettingsInfo refInfo = new ReferenceSettingsInfo(cfgDescription); ReferenceSettingsInfo refInfo = new ReferenceSettingsInfo(cfgDescription);
ICConfigurationDescription[] allCfgDescriptions = cfgDescription.isPreferenceConfiguration() ? ICConfigurationDescription[] allCfgDescriptions = cfgDescription.isPreferenceConfiguration()
new ICConfigurationDescription[] { cfgDescription } : ? new ICConfigurationDescription[] { cfgDescription }
cfgDescription.getProjectDescription().getConfigurations(); : cfgDescription.getProjectDescription().getConfigurations();
CConfigurationData[] allDatas = new CConfigurationData[allCfgDescriptions.length]; CConfigurationData[] allDatas = new CConfigurationData[allCfgDescriptions.length];
for (int i = 0; i < allCfgDescriptions.length; i++) { for (int i = 0; i < allCfgDescriptions.length; i++) {
allDatas[i] = getCfgData(allCfgDescriptions[i]); allDatas[i] = getCfgData(allCfgDescriptions[i]);
} }
final PathEntryCollector collector = new PathEntryCollector(project/*, cfgDescription*/); final PathEntryCollector collector = new PathEntryCollector(
project/* , cfgDescription */);
PathSettingsContainer rcDatas = createRcDataHolder(cfgData); PathSettingsContainer rcDatas = createRcDataHolder(cfgData);
ICSourceEntry sEntries[] = cfgData.getSourceEntries(); ICSourceEntry sEntries[] = cfgData.getSourceEntries();
if (sEntries != null && sEntries.length != 0) { if (sEntries != null && sEntries.length != 0) {
@ -2023,7 +2071,8 @@ public class PathEntryTranslator {
for (int kind : kinds) { for (int kind : kinds) {
Set<ICLanguageSettingEntry> set = new LinkedHashSet<ICLanguageSettingEntry>(); Set<ICLanguageSettingEntry> set = new LinkedHashSet<ICLanguageSettingEntry>();
if (collectResourceDataEntries(cfgDescription, kind, rcData, set)) { if (collectResourceDataEntries(cfgDescription, kind, rcData, set)) {
ICLanguageSettingEntry[] entries = set.toArray(new ICLanguageSettingEntry[set.size()]); ICLanguageSettingEntry[] entries = set
.toArray(new ICLanguageSettingEntry[set.size()]);
child.setEntries(kind, entries, exportedSettings); child.setEntries(kind, entries, exportedSettings);
} }
} }
@ -2034,7 +2083,8 @@ public class PathEntryTranslator {
return collector; return collector;
} }
private static boolean collectResourceDataEntries(ICConfigurationDescription cfgDescription, int kind, CResourceData rcData, Set<ICLanguageSettingEntry> list) { private static boolean collectResourceDataEntries(ICConfigurationDescription cfgDescription, int kind,
CResourceData rcData, Set<ICLanguageSettingEntry> list) {
CLanguageData[] lDatas = null; CLanguageData[] lDatas = null;
if (rcData instanceof CFolderData) { if (rcData instanceof CFolderData) {
lDatas = ((CFolderData) rcData).getLanguageDatas(); lDatas = ((CFolderData) rcData).getLanguageDatas();
@ -2043,7 +2093,8 @@ public class PathEntryTranslator {
if (lData != null) if (lData != null)
lDatas = new CLanguageData[] { lData }; lDatas = new CLanguageData[] { lData };
} else { } else {
Exception e = new Exception(UtilMessages.getString("PathEntryTranslator.1") + rcData.getClass().getName()); //$NON-NLS-1$ Exception e = new Exception(
UtilMessages.getString("PathEntryTranslator.1") + rcData.getClass().getName()); //$NON-NLS-1$
IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, e.getMessage(), e); IStatus status = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, e.getMessage(), e);
CCorePlugin.log(status); CCorePlugin.log(status);
} }
@ -2055,13 +2106,19 @@ public class PathEntryTranslator {
if (ScannerDiscoveryLegacySupport.isLanguageSettingsProvidersFunctionalityEnabled(project)) { if (ScannerDiscoveryLegacySupport.isLanguageSettingsProvidersFunctionalityEnabled(project)) {
IResource rc = findResourceInWorkspace(project, rcData.getPath()); IResource rc = findResourceInWorkspace(project, rcData.getPath());
if (rc == null) { if (rc == null) {
// If resource does not exist make a handle to be able to supply the path. // If resource does not exist make a handle to be able to supply
// the path.
// This does not create actual resource. // This does not create actual resource.
// Gotta be a folder so language settings provider won't filter out languages. // Gotta be a folder so language settings provider won't filter
// out languages.
rc = project.getFolder(rcData.getPath()); rc = project.getFolder(rcData.getPath());
} }
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
if (config != null) {
for (CLanguageData lData : lDatas) { for (CLanguageData lData : lDatas) {
list.addAll(LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, rc, lData.getLanguageId(), kind)); list.addAll(LanguageSettingsProvidersSerializer.getSettingEntriesByKind(config, rc,
lData.getLanguageId(), kind));
}
} }
return list.size() > 0; return list.size() > 0;
@ -2075,7 +2132,8 @@ public class PathEntryTranslator {
return supported; return supported;
} }
private static boolean collectLanguageDataEntries(int kind, CLanguageData lData, Set<ICLanguageSettingEntry> list) { private static boolean collectLanguageDataEntries(int kind, CLanguageData lData,
Set<ICLanguageSettingEntry> list) {
if ((kind & lData.getSupportedEntryKinds()) != 0) { if ((kind & lData.getSupportedEntryKinds()) != 0) {
ICLanguageSettingEntry[] entries = lData.getEntries(kind); ICLanguageSettingEntry[] entries = lData.getEntries(kind);
if (entries != null && entries.length != 0) { if (entries != null && entries.length != 0) {
@ -2087,7 +2145,8 @@ public class PathEntryTranslator {
return false; return false;
} }
public static IPathEntry[] getPathEntries(IProject project, ICConfigurationDescription cfgDescription, int flags) { public static IPathEntry[] getPathEntries(IProject project, ICConfigurationDescription cfgDescription,
int flags) {
PathEntryCollector cr = collectEntries(project, cfgDescription); PathEntryCollector cr = collectEntries(project, cfgDescription);
return cr.getEntries(flags, cfgDescription); return cr.getEntries(flags, cfgDescription);
} }

View file

@ -42,9 +42,11 @@ import org.eclipse.cdt.internal.core.parser.ParserSettings2;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.cdt.internal.core.settings.model.SettingsModelMessages; import org.eclipse.cdt.internal.core.settings.model.SettingsModelMessages;
import org.eclipse.cdt.utils.EFSExtensionManager; import org.eclipse.cdt.utils.EFSExtensionManager;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
@ -52,14 +54,15 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS; import org.eclipse.osgi.util.NLS;
/** /**
* Implementation of {@link IScannerInfoProvider} backed by the list of * Implementation of {@link IScannerInfoProvider} backed by the list of language settings providers
* language settings providers of "default settings configuration" * of "default settings configuration" (see
* (see {@link ICProjectDescription#getDefaultSettingConfiguration()}). * {@link ICProjectDescription#getDefaultSettingConfiguration()}).
* *
* @see IScannerInfo#getIncludePaths() * @see IScannerInfo#getIncludePaths()
* *
*/ */
public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider, ILanguageSettingsChangeListener { public class LanguageSettingsScannerInfoProvider
implements IScannerInfoProvider, ILanguageSettingsChangeListener {
private static final String FRAMEWORK_PRIVATE_HEADERS_INCLUDE = "/__framework__.framework/PrivateHeaders/__header__"; //$NON-NLS-1$ private static final String FRAMEWORK_PRIVATE_HEADERS_INCLUDE = "/__framework__.framework/PrivateHeaders/__header__"; //$NON-NLS-1$
private static final String FRAMEWORK_HEADERS_INCLUDE = "/__framework__.framework/Headers/__header__"; //$NON-NLS-1$ private static final String FRAMEWORK_HEADERS_INCLUDE = "/__framework__.framework/Headers/__header__"; //$NON-NLS-1$
private static final ExtendedScannerInfo DUMMY_SCANNER_INFO = new ExtendedScannerInfo(); private static final ExtendedScannerInfo DUMMY_SCANNER_INFO = new ExtendedScannerInfo();
@ -72,7 +75,8 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
if (project == null) if (project == null)
return DUMMY_SCANNER_INFO; return DUMMY_SCANNER_INFO;
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, false); ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance()
.getProjectDescription(project, false);
if (prjDescription == null) if (prjDescription == null)
return DUMMY_SCANNER_INFO; return DUMMY_SCANNER_INFO;
@ -80,9 +84,14 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
if (cfgDescription == null) if (cfgDescription == null)
return DUMMY_SCANNER_INFO; return DUMMY_SCANNER_INFO;
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
if (config == null)
return DUMMY_SCANNER_INFO;
List<String> languageIds = LanguageSettingsManager.getLanguages(rc, cfgDescription); List<String> languageIds = LanguageSettingsManager.getLanguages(rc, cfgDescription);
if (languageIds.isEmpty()) { if (languageIds.isEmpty()) {
String msg = NLS.bind(SettingsModelMessages.getString("LanguageSettingsScannerInfoProvider.UnableToDetermineLanguage"), rc.toString()); //$NON-NLS-1$ String msg = NLS.bind(SettingsModelMessages.getString(
"LanguageSettingsScannerInfoProvider.UnableToDetermineLanguage"), rc.toString()); //$NON-NLS-1$
IStatus status = new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, msg, new Exception()); IStatus status = new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, msg, new Exception());
CCorePlugin.log(status); CCorePlugin.log(status);
return DUMMY_SCANNER_INFO; return DUMMY_SCANNER_INFO;
@ -95,24 +104,24 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
LinkedHashSet<ICLanguageSettingEntry> macroEntries = new LinkedHashSet<ICLanguageSettingEntry>(); LinkedHashSet<ICLanguageSettingEntry> macroEntries = new LinkedHashSet<ICLanguageSettingEntry>();
for (String langId : languageIds) { for (String langId : languageIds) {
List<ICLanguageSettingEntry> incSys = LanguageSettingsProvidersSerializer.getSystemSettingEntriesByKind(cfgDescription, rc, langId, List<ICLanguageSettingEntry> incSys = LanguageSettingsProvidersSerializer
ICSettingEntry.INCLUDE_PATH); .getSystemSettingEntriesByKind(config, rc, langId, ICSettingEntry.INCLUDE_PATH);
includePathEntries.addAll(incSys); includePathEntries.addAll(incSys);
List<ICLanguageSettingEntry> incLocal = LanguageSettingsProvidersSerializer.getLocalSettingEntriesByKind(cfgDescription, rc, langId, List<ICLanguageSettingEntry> incLocal = LanguageSettingsProvidersSerializer
ICSettingEntry.INCLUDE_PATH); .getLocalSettingEntriesByKind(config, rc, langId, ICSettingEntry.INCLUDE_PATH);
includePathLocalEntries.addAll(incLocal); includePathLocalEntries.addAll(incLocal);
List<ICLanguageSettingEntry> incFiles = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, rc, langId, List<ICLanguageSettingEntry> incFiles = LanguageSettingsProvidersSerializer
ICSettingEntry.INCLUDE_FILE); .getSettingEntriesByKind(config, rc, langId, ICSettingEntry.INCLUDE_FILE);
includeFileEntries.addAll(incFiles); includeFileEntries.addAll(incFiles);
List<ICLanguageSettingEntry> macroFiles = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, rc, langId, List<ICLanguageSettingEntry> macroFiles = LanguageSettingsProvidersSerializer
ICSettingEntry.MACRO_FILE); .getSettingEntriesByKind(config, rc, langId, ICSettingEntry.MACRO_FILE);
macroFileEntries.addAll(macroFiles); macroFileEntries.addAll(macroFiles);
List<ICLanguageSettingEntry> macros = LanguageSettingsProvidersSerializer.getSettingEntriesByKind(cfgDescription, rc, langId, List<ICLanguageSettingEntry> macros = LanguageSettingsProvidersSerializer
ICSettingEntry.MACRO); .getSettingEntriesByKind(config, rc, langId, ICSettingEntry.MACRO);
macroEntries.addAll(macros); macroEntries.addAll(macros);
} }
@ -129,7 +138,8 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
definedMacros.put(name, value); definedMacros.put(name, value);
} }
ExtendedScannerInfo extendedScannerInfo = new ExtendedScannerInfo(definedMacros, includePaths, macroFiles, includeFiles, includePathsLocal); ExtendedScannerInfo extendedScannerInfo = new ExtendedScannerInfo(definedMacros, includePaths,
macroFiles, includeFiles, includePathsLocal);
extendedScannerInfo.setParserSettings(new ParserSettings2(project)); extendedScannerInfo.setParserSettings(new ParserSettings2(project));
return extendedScannerInfo; return extendedScannerInfo;
} }
@ -146,8 +156,8 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
} }
/** /**
* Get build working directory for the provided configuration. Returns * Get build working directory for the provided configuration. Returns project location if none
* project location if none defined. * defined.
*/ */
private static IPath getBuildCWD(ICConfigurationDescription cfgDescription) { private static IPath getBuildCWD(ICConfigurationDescription cfgDescription) {
IPath buildCWD = cfgDescription.getBuildSetting().getBuilderCWD(); IPath buildCWD = cfgDescription.getBuildSetting().getBuilderCWD();
@ -180,11 +190,14 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
} }
/** /**
* Resolve location to file system location in a configuration context. * Resolve location to file system location in a configuration context. Resolving includes
* Resolving includes replacing build/environment variables with values, making relative path absolute etc. * replacing build/environment variables with values, making relative path absolute etc.
* *
* @param location - location to resolve. If relative, it is taken to be rooted in build working directory. * @param location
* @param cfgDescription - the configuration context. * - location to resolve. If relative, it is taken to be rooted in build working
* directory.
* @param cfgDescription
* - the configuration context.
* @return resolved file system location. * @return resolved file system location.
*/ */
private static String resolveEntry(String location, ICConfigurationDescription cfgDescription) { private static String resolveEntry(String location, ICConfigurationDescription cfgDescription) {
@ -225,7 +238,8 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
/** /**
* Convert path delimiters to OS representation avoiding using org.eclipse.core.runtime.Path * Convert path delimiters to OS representation avoiding using org.eclipse.core.runtime.Path
* being careful to preserve "../" segments and not let collapsing them which is not correct for symbolic links. * being careful to preserve "../" segments and not let collapsing them which is not correct for
* symbolic links.
*/ */
private String toOSString(String loc) { private String toOSString(String loc) {
// use OS file separators (i.e. '\' on Windows) // use OS file separators (i.e. '\' on Windows)
@ -239,11 +253,14 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
* Convert the path entries to absolute file system locations represented as String array. * Convert the path entries to absolute file system locations represented as String array.
* Resolve the entries which are not resolved. * Resolve the entries which are not resolved.
* *
* @param entriesPath - language settings path entries. * @param entriesPath
* @param cfgDescription - configuration description for resolving entries. * - language settings path entries.
* @param cfgDescription
* - configuration description for resolving entries.
* @return array of the locations. * @return array of the locations.
*/ */
private String[] convertToLocations(LinkedHashSet<ICLanguageSettingEntry> entriesPath, ICConfigurationDescription cfgDescription) { private String[] convertToLocations(LinkedHashSet<ICLanguageSettingEntry> entriesPath,
ICConfigurationDescription cfgDescription) {
List<String> locations = new ArrayList<String>(entriesPath.size()); List<String> locations = new ArrayList<String>(entriesPath.size());
for (ICLanguageSettingEntry entry : entriesPath) { for (ICLanguageSettingEntry entry : entriesPath) {
ICPathEntry entryPath = (ICPathEntry) entry; ICPathEntry entryPath = (ICPathEntry) entry;
@ -307,7 +324,8 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
} }
if (listenersMap == null) { if (listenersMap == null) {
listenersMap = Collections.synchronizedMap(new HashMap<IResource, List<IScannerInfoChangeListener>>()); listenersMap = Collections
.synchronizedMap(new HashMap<IResource, List<IScannerInfoChangeListener>>());
} }
IProject project = resource.getProject(); IProject project = resource.getProject();
@ -346,12 +364,14 @@ public class LanguageSettingsScannerInfoProvider implements IScannerInfoProvider
if (project != null) { if (project != null) {
ICProjectDescription prjDescription = CCorePlugin.getDefault().getProjectDescription(project); ICProjectDescription prjDescription = CCorePlugin.getDefault().getProjectDescription(project);
if (prjDescription != null) { if (prjDescription != null) {
ICConfigurationDescription indexedCfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription indexedCfgDescription = prjDescription
.getDefaultSettingConfiguration();
String indexedCfgId = indexedCfgDescription.getId(); String indexedCfgId = indexedCfgDescription.getId();
for (String cfgId : event.getConfigurationDescriptionIds()) { for (String cfgId : event.getConfigurationDescriptionIds()) {
if (cfgId.equals(indexedCfgId)) { if (cfgId.equals(indexedCfgId)) {
for (Entry<IResource, List<IScannerInfoChangeListener>> entry : listenersMap.entrySet()) { for (Entry<IResource, List<IScannerInfoChangeListener>> entry : listenersMap
.entrySet()) {
IResource rc = entry.getKey(); IResource rc = entry.getKey();
List<IScannerInfoChangeListener> listeners = listenersMap.get(rc); List<IScannerInfoChangeListener> listeners = listenersMap.get(rc);
if (listeners != null && !listeners.isEmpty()) { if (listeners != null && !listeners.isEmpty()) {

View file

@ -41,20 +41,29 @@ import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.core.model.DefaultPathEntryStore; import org.eclipse.cdt.internal.core.model.DefaultPathEntryStore;
import org.eclipse.cdt.internal.core.model.PathEntryManager; import org.eclipse.cdt.internal.core.model.PathEntryManager;
import org.eclipse.cdt.internal.core.model.PathEntryUtil; import org.eclipse.cdt.internal.core.model.PathEntryUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
/** /**
* Wrapper class intended to provide backward compatibility with ScannerInfo supplied by {@link PathEntryManager}. * Wrapper class intended to provide backward compatibility with ScannerInfo
* supplied by {@link PathEntryManager}.
*/ */
public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettingsBaseProvider { public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettingsBaseProvider {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (config == null) {
return null;
}
ICConfigurationDescription cfgDescription = config.getAdapter(ICConfigurationDescription.class);
if (cfgDescription == null) { if (cfgDescription == null) {
return null; return null;
} }
ICProjectDescription prjDescription = cfgDescription.getProjectDescription(); ICProjectDescription prjDescription = cfgDescription.getProjectDescription();
if (prjDescription == null) { if (prjDescription == null) {
return null; return null;
@ -72,7 +81,8 @@ public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettin
@Override @Override
public int compare(IPathEntry macro1, IPathEntry macro2) { public int compare(IPathEntry macro1, IPathEntry macro2) {
if (macro1 instanceof IMacroEntry && macro2 instanceof IMacroEntry) { if (macro1 instanceof IMacroEntry && macro2 instanceof IMacroEntry) {
return ((IMacroEntry)macro1).getMacroName().compareTo(((IMacroEntry)macro2).getMacroName()); return ((IMacroEntry) macro1).getMacroName()
.compareTo(((IMacroEntry) macro2).getMacroName());
} }
return 0; return 0;
} }
@ -82,17 +92,20 @@ public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettin
pathEntriesMap.put(IPathEntry.CDT_LIBRARY, new LinkedHashSet<IPathEntry>()); pathEntriesMap.put(IPathEntry.CDT_LIBRARY, new LinkedHashSet<IPathEntry>());
IPathEntryStore pathEntryStore = new DefaultPathEntryStore(project); IPathEntryStore pathEntryStore = new DefaultPathEntryStore(project);
int typesMask = IPathEntry.CDT_INCLUDE | IPathEntry.CDT_MACRO | IPathEntry.CDT_INCLUDE_FILE | IPathEntry.CDT_MACRO_FILE | IPathEntry.CDT_LIBRARY; int typesMask = IPathEntry.CDT_INCLUDE | IPathEntry.CDT_MACRO | IPathEntry.CDT_INCLUDE_FILE
| IPathEntry.CDT_MACRO_FILE | IPathEntry.CDT_LIBRARY;
try { try {
IPathEntry[] storePathEntries = pathEntryStore.getRawPathEntries(); IPathEntry[] storePathEntries = pathEntryStore.getRawPathEntries();
for (IPathEntry storePathEntry : storePathEntries) { for (IPathEntry storePathEntry : storePathEntries) {
if (storePathEntry instanceof IContainerEntry) { if (storePathEntry instanceof IContainerEntry) {
try { try {
IPathEntryContainer container = PathEntryManager.getDefault().getPathEntryContainer((IContainerEntry) storePathEntry, cproject); IPathEntryContainer container = PathEntryManager.getDefault()
.getPathEntryContainer((IContainerEntry) storePathEntry, cproject);
if (container != null) { if (container != null) {
IPathEntry[] pathEntries = null; IPathEntry[] pathEntries = null;
if (container instanceof IPathEntryContainerExtension) { if (container instanceof IPathEntryContainerExtension) {
pathEntries = ((IPathEntryContainerExtension)container).getPathEntries(rc.getFullPath(), typesMask); pathEntries = ((IPathEntryContainerExtension) container)
.getPathEntries(rc.getFullPath(), typesMask);
} else { } else {
pathEntries = container.getPathEntries(); pathEntries = container.getPathEntries();
} }
@ -124,10 +137,12 @@ public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettin
} }
} }
return LanguageSettingsSerializableStorage.getPooledList(new ArrayList<ICLanguageSettingEntry>(lsEntries)); return LanguageSettingsSerializableStorage
.getPooledList(new ArrayList<ICLanguageSettingEntry>(lsEntries));
} }
private void collectPathEntry(LinkedHashMap<Integer, Set<IPathEntry>> pathEntriesMap, IPath projectPath, IPathEntry pathEntry) { private void collectPathEntry(LinkedHashMap<Integer, Set<IPathEntry>> pathEntriesMap, IPath projectPath,
IPathEntry pathEntry) {
switch (pathEntry.getEntryKind()) { switch (pathEntry.getEntryKind()) {
case IPathEntry.CDT_INCLUDE: case IPathEntry.CDT_INCLUDE:
case IPathEntry.CDT_MACRO: case IPathEntry.CDT_MACRO:
@ -146,13 +161,15 @@ public class PathEntryScannerInfoLanguageSettingsProvider extends LanguageSettin
switch (pathEntry.getEntryKind()) { switch (pathEntry.getEntryKind()) {
case IPathEntry.CDT_INCLUDE: case IPathEntry.CDT_INCLUDE:
IIncludeEntry includeEntry = (IIncludeEntry) pathEntry; IIncludeEntry includeEntry = (IIncludeEntry) pathEntry;
return CDataUtil.createCIncludePathEntry(includeEntry.getFullIncludePath().toOSString(), includeEntry.isSystemInclude() ? 0 : ICSettingEntry.LOCAL); return CDataUtil.createCIncludePathEntry(includeEntry.getFullIncludePath().toOSString(),
includeEntry.isSystemInclude() ? 0 : ICSettingEntry.LOCAL);
case IPathEntry.CDT_MACRO: case IPathEntry.CDT_MACRO:
IMacroEntry macroEntry = (IMacroEntry) pathEntry; IMacroEntry macroEntry = (IMacroEntry) pathEntry;
return CDataUtil.createCMacroEntry(macroEntry.getMacroName(), macroEntry.getMacroValue(), 0); return CDataUtil.createCMacroEntry(macroEntry.getMacroName(), macroEntry.getMacroValue(), 0);
case IPathEntry.CDT_INCLUDE_FILE: case IPathEntry.CDT_INCLUDE_FILE:
IIncludeFileEntry includeFileEntry = (IIncludeFileEntry) pathEntry; IIncludeFileEntry includeFileEntry = (IIncludeFileEntry) pathEntry;
return CDataUtil.createCIncludeFileEntry(includeFileEntry.getFullIncludeFilePath().toOSString(), 0); return CDataUtil.createCIncludeFileEntry(includeFileEntry.getFullIncludeFilePath().toOSString(),
0);
case IPathEntry.CDT_MACRO_FILE: case IPathEntry.CDT_MACRO_FILE:
IMacroFileEntry macroFileEntry = (IMacroFileEntry) pathEntry; IMacroFileEntry macroFileEntry = (IMacroFileEntry) pathEntry;
return CDataUtil.createCMacroFileEntry(macroFileEntry.getFullMacroFilePath().toOSString(), 0); return CDataUtil.createCMacroFileEntry(macroFileEntry.getFullMacroFilePath().toOSString(), 0);

View file

@ -22,7 +22,9 @@ import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Adapters;
/** /**
* Language settings provider to provide entries exported from referenced projects. * Language settings provider to provide entries exported from referenced projects.
@ -39,7 +41,8 @@ public class ReferencedProjectsLanguageSettingsProvider extends LanguageSettings
}; };
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (recursiveCallIndicator.get()) { if (recursiveCallIndicator.get()) {
// Recursive call indicates that the provider of a referenced project is called. // Recursive call indicates that the provider of a referenced project is called.
// Only exported entries of the original configuration should be considered, // Only exported entries of the original configuration should be considered,
@ -47,6 +50,11 @@ public class ReferencedProjectsLanguageSettingsProvider extends LanguageSettings
return null; return null;
} }
if (config == null) {
return null;
}
ICConfigurationDescription cfgDescription = config.getAdapter(ICConfigurationDescription.class);
if (cfgDescription == null) { if (cfgDescription == null) {
return null; return null;
} }
@ -58,14 +66,18 @@ public class ReferencedProjectsLanguageSettingsProvider extends LanguageSettings
try { try {
recursiveCallIndicator.set(true); recursiveCallIndicator.set(true);
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
ICConfigurationDescription[] refCfgDescriptions = CoreModelUtil.getReferencedConfigurationDescriptions(cfgDescription, false); ICConfigurationDescription[] refCfgDescriptions = CoreModelUtil
.getReferencedConfigurationDescriptions(cfgDescription, false);
for (ICConfigurationDescription refCfgDescription : refCfgDescriptions) { for (ICConfigurationDescription refCfgDescription : refCfgDescriptions) {
List<ICLanguageSettingEntry> refEntries = LanguageSettingsManager.getSettingEntriesByKind(refCfgDescription, rc, languageId, ICSettingEntry.ALL); IBuildConfiguration refConfig = Adapters.adapt(refCfgDescription, IBuildConfiguration.class);
List<ICLanguageSettingEntry> refEntries = LanguageSettingsManager
.getSettingEntriesByKind(refConfig, rc, languageId, ICSettingEntry.ALL);
for (ICLanguageSettingEntry refEntry : refEntries) { for (ICLanguageSettingEntry refEntry : refEntries) {
int flags = refEntry.getFlags(); int flags = refEntry.getFlags();
if ((flags & ICSettingEntry.EXPORTED) == ICSettingEntry.EXPORTED) { if ((flags & ICSettingEntry.EXPORTED) == ICSettingEntry.EXPORTED) {
// create a new entry with EXPORTED flag cleared // create a new entry with EXPORTED flag cleared
ICLanguageSettingEntry entry = CDataUtil.createEntry(refEntry, flags & ~ICSettingEntry.EXPORTED); ICLanguageSettingEntry entry = CDataUtil.createEntry(refEntry,
flags & ~ICSettingEntry.EXPORTED);
entries.add(entry); entries.add(entry);
} }
} }

View file

@ -28,16 +28,29 @@ import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.core.settings.model.util.CExtensionUtil; import org.eclipse.cdt.core.settings.model.util.CExtensionUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
/** /**
* Wrapper class intended to provide backward compatibility with ScannerInfoProvider defined by org.eclipse.cdt.core.ScannerInfoProvider extension point * Wrapper class intended to provide backward compatibility with
* ScannerInfoProvider defined by org.eclipse.cdt.core.ScannerInfoProvider
* extension point
*/ */
public class ScannerInfoExtensionLanguageSettingsProvider extends LanguageSettingsBaseProvider { public class ScannerInfoExtensionLanguageSettingsProvider extends LanguageSettingsBaseProvider {
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
if (config == null) {
return null;
}
ICConfigurationDescription cfgDescription = config.getAdapter(ICConfigurationDescription.class);
if (cfgDescription == null) {
return null;
}
List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
IScannerInfoProvider scannerInfoProvider = getScannerInfoProvider(cfgDescription); IScannerInfoProvider scannerInfoProvider = getScannerInfoProvider(cfgDescription);
if (scannerInfoProvider != null) { if (scannerInfoProvider != null) {
@ -64,9 +77,11 @@ public class ScannerInfoExtensionLanguageSettingsProvider extends LanguageSettin
} }
/** /**
* Return ScannerInfoProvider defined in configuration metadata in .cproject. * Return ScannerInfoProvider defined in configuration metadata in
* .cproject.
* *
* @param cfgDescription - configuration description. * @param cfgDescription
* - configuration description.
* @return an instance of ScannerInfoProvider or {@code null}. * @return an instance of ScannerInfoProvider or {@code null}.
*/ */
public IScannerInfoProvider getScannerInfoProvider(ICConfigurationDescription cfgDescription) { public IScannerInfoProvider getScannerInfoProvider(ICConfigurationDescription cfgDescription) {
@ -80,7 +95,8 @@ public class ScannerInfoExtensionLanguageSettingsProvider extends LanguageSettin
ICConfigExtensionReference ref = refs[0]; ICConfigExtensionReference ref = refs[0];
try { try {
AbstractCExtension cExtension = null; AbstractCExtension cExtension = null;
IConfigurationElement el = CExtensionUtil.getFirstConfigurationElement(ref, "cextension", false); //$NON-NLS-1$ IConfigurationElement el = CExtensionUtil.getFirstConfigurationElement(ref, "cextension", //$NON-NLS-1$
false);
cExtension = (AbstractCExtension) el.createExecutableExtension("run"); //$NON-NLS-1$ cExtension = (AbstractCExtension) el.createExecutableExtension("run"); //$NON-NLS-1$
cExtension.setExtensionReference(ref); cExtension.setExtensionReference(ref);
cExtension.setProject(ref.getConfiguration().getProjectDescription().getProject()); cExtension.setProject(ref.getConfiguration().getProjectDescription().getProject());

View file

@ -0,0 +1,38 @@
/*******************************************************************************
* Copyright (c) 2016 QNX Software Systems and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.cdt.internal.core.settings.model;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.runtime.IAdapterFactory;
public class BuildConfigAdapterFactory implements IAdapterFactory {
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
if (adaptableObject instanceof IBuildConfiguration
&& adapterType.equals(ICConfigurationDescription.class)) {
IBuildConfiguration buildConfig = (IBuildConfiguration) adaptableObject;
ICProjectDescription prjDesc = CCorePlugin.getDefault()
.getProjectDescription(buildConfig.getProject());
if (prjDesc != null) {
return (T) prjDesc.getConfigurationById(buildConfig.getName());
}
}
return null;
}
@Override
public Class<?>[] getAdapterList() {
return new Class<?>[] { ICConfigurationDescription.class };
}
}

View file

@ -0,0 +1,73 @@
/*******************************************************************************
* Copyright (c) 2016 QNX Software Systems and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.cdt.internal.core.settings.model;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.NullProgressMonitor;
public class CConfigurationAdapterFactory implements IAdapterFactory {
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
if (adaptableObject instanceof ICConfigurationDescription
&& adapterType.equals(IBuildConfiguration.class)) {
ICConfigurationDescription cfgDesc = (ICConfigurationDescription) adaptableObject;
IProject project = cfgDesc.getProjectDescription().getProject();
if (project != null) {
String configId = cfgDesc.getId();
try {
IBuildConfiguration config = project.getBuildConfig(configId);
if (config == null) {
CCorePlugin.log(String.format("null config %s: %s", project.getName(), configId)); //$NON-NLS-1$
}
return (T) config;
} catch (CoreException e) {
if (!ResourcesPlugin.getWorkspace().isTreeLocked() &&
e.getStatus().getCode() == IResourceStatus.BUILD_CONFIGURATION_NOT_FOUND) {
try {
Set<String> configNames = new HashSet<>();
for (IBuildConfiguration config : project.getBuildConfigs()) {
configNames.add(config.getName());
}
configNames.add(configId);
IProjectDescription projectDesc = project.getDescription();
projectDesc.setBuildConfigs(
configNames.toArray(new String[configNames.size()]));
project.setDescription(projectDesc, new NullProgressMonitor());
return (T) project.getBuildConfig(configId);
} catch (CoreException e2) {
CCorePlugin.log(e2.getStatus());
}
} else {
CCorePlugin.log(e.getStatus());
}
}
}
}
return null;
}
@Override
public Class<?>[] getAdapterList() {
return new Class<?>[] { IBuildConfiguration.class };
}
}

View file

@ -35,9 +35,11 @@ import org.eclipse.core.runtime.QualifiedName;
public class CProjectDescription implements ICProjectDescription, ICDataProxyContainer { public class CProjectDescription implements ICProjectDescription, ICDataProxyContainer {
private static final String ACTIVE_CFG = "activeConfiguration"; //$NON-NLS-1$ private static final String ACTIVE_CFG = "activeConfiguration"; //$NON-NLS-1$
private static final QualifiedName ACTIVE_CFG_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, ACTIVE_CFG); private static final QualifiedName ACTIVE_CFG_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID,
ACTIVE_CFG);
private static final String SETTING_CFG = "settingConfiguration"; //$NON-NLS-1$ private static final String SETTING_CFG = "settingConfiguration"; //$NON-NLS-1$
private static final QualifiedName SETTING_CFG_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, SETTING_CFG); private static final QualifiedName SETTING_CFG_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID,
SETTING_CFG);
private CfgIdPair fActiveCfgInfo; private CfgIdPair fActiveCfgInfo;
private CfgIdPair fSettingCfgInfo; private CfgIdPair fSettingCfgInfo;
@ -153,7 +155,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
public CProjectDescription(IProject project, ICSettingsStorage storage, ICStorageElement element, boolean loading, boolean isCreating) throws CoreException { public CProjectDescription(IProject project, ICSettingsStorage storage, ICStorageElement element,
boolean loading, boolean isCreating) throws CoreException {
fProject = project; fProject = project;
fStorage = storage; fStorage = storage;
fRootStorageElement = element; fRootStorageElement = element;
@ -230,10 +233,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
/** /**
* Called when the read-only project description has / is being set * Called when the read-only project description has / is being set fIsApplying => false
* fIsApplying => false * setModified (false) set the ICSettingsStorage to readonly
* setModified (false)
* set the ICSettingsStorage to readonly
*/ */
public void doneApplying() { public void doneApplying() {
doneInitializing(); doneInitializing();
@ -259,7 +260,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
private void doneInitializing() { private void doneInitializing() {
for (ICConfigurationDescription cfg : fCfgMap.values()) { for (ICConfigurationDescription cfg : fCfgMap.values()) {
// FIXME How and why are we down casting to a CConfigurationDescriptionCache. Comments, please! // FIXME How and why are we down casting to a
// CConfigurationDescriptionCache. Comments, please!
CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache) cfg; CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache) cfg;
cache.doneInitialization(); cache.doneInitialization();
} }
@ -285,7 +287,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
* @param el * @param el
* @param isCreating * @param isCreating
*/ */
public CProjectDescription(CProjectDescription base, boolean saving, ICSettingsStorage storage, ICStorageElement el, boolean isCreating) { public CProjectDescription(CProjectDescription base, boolean saving, ICSettingsStorage storage,
ICStorageElement el, boolean isCreating) {
fActiveCfgInfo = new CfgIdPair(base.fActiveCfgInfo); fActiveCfgInfo = new CfgIdPair(base.fActiveCfgInfo);
fSettingCfgInfo = new CfgIdPair(base.fSettingCfgInfo); fSettingCfgInfo = new CfgIdPair(base.fSettingCfgInfo);
fProject = base.fProject; fProject = base.fProject;
@ -296,7 +299,10 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
fIsApplying = saving || base.fIsApplying; fIsApplying = saving || base.fIsApplying;
fIsCreating = isCreating; fIsCreating = isCreating;
fPrefs = new CProjectDescriptionPreferences(base.fPrefs, (CProjectDescriptionPreferences)CProjectDescriptionManager.getInstance().getProjectDescriptionWorkspacePreferences(false), false); fPrefs = new CProjectDescriptionPreferences(base.fPrefs,
(CProjectDescriptionPreferences) CProjectDescriptionManager.getInstance()
.getProjectDescriptionWorkspacePreferences(false),
false);
for (Iterator<ICConfigurationDescription> iter = base.fCfgMap.values().iterator(); iter.hasNext();) { for (Iterator<ICConfigurationDescription> iter = base.fCfgMap.values().iterator(); iter.hasNext();) {
try { try {
@ -308,7 +314,9 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
baseCache = (CConfigurationDescriptionCache) baseData; baseCache = (CConfigurationDescriptionCache) baseData;
baseData = baseCache.getConfigurationData(); baseData = baseCache.getConfigurationData();
} }
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription) cfgDes, baseData, baseCache, cfgDes.getSpecSettings(), this, null); CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(
(ICConfigurationDescription) cfgDes, baseData, baseCache,
cfgDes.getSpecSettings(), this, null);
configurationCreated(cache); configurationCreated(cache);
} else { } else {
CConfigurationData baseData = cfgDes.getConfigurationData(false); CConfigurationData baseData = cfgDes.getConfigurationData(false);
@ -321,7 +329,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
// Shallow cloning the base map // Shallow cloning the base map
Map<QualifiedName, Object> cloneMap = Collections.synchronizedMap(new HashMap<QualifiedName, Object>()); Map<QualifiedName, Object> cloneMap = Collections
.synchronizedMap(new HashMap<QualifiedName, Object>());
synchronized (base.fPropertiesMap) { synchronized (base.fPropertiesMap) {
cloneMap.putAll(base.fPropertiesMap); cloneMap.putAll(base.fPropertiesMap);
} }
@ -329,8 +338,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
/** /**
* Convert the current CConfigurationDescriptions to cached versions * Convert the current CConfigurationDescriptions to cached versions This occurs during the
* This occurs during the SetCProjectDescription Operation * SetCProjectDescription Operation
*/ */
void switchToCachedConfigurationDescriptions() throws CoreException { void switchToCachedConfigurationDescriptions() throws CoreException {
for (Map.Entry<String, ICConfigurationDescription> e : fCfgMap.entrySet()) { for (Map.Entry<String, ICConfigurationDescription> e : fCfgMap.entrySet()) {
@ -342,8 +351,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
baseCache = (CConfigurationDescriptionCache) baseData; baseCache = (CConfigurationDescriptionCache) baseData;
baseData = baseCache.getConfigurationData(); baseData = baseCache.getConfigurationData();
} }
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(cfgDes, baseData, baseCache, CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(cfgDes, baseData,
cfgDes.getSpecSettings(), this, null); baseCache, cfgDes.getSpecSettings(), this, null);
e.setValue(cache); e.setValue(cache);
} }
} }
@ -400,7 +409,6 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
if (fIsReadOnly) if (fIsReadOnly)
throw ExceptionFactory.createIsReadOnlyException(); throw ExceptionFactory.createIsReadOnlyException();
CConfigurationDescription cfgDes = (CConfigurationDescription) getConfigurationByName(name); CConfigurationDescription cfgDes = (CConfigurationDescription) getConfigurationByName(name);
if (cfgDes != null) { if (cfgDes != null) {
cfgDes.removeConfiguration(); cfgDes.removeConfiguration();
@ -424,8 +432,7 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
@Override @Override
public void setActiveConfiguration( public void setActiveConfiguration(ICConfigurationDescription cfg) throws WriteAccessException {
ICConfigurationDescription cfg) throws WriteAccessException {
if (fIsReadOnly) if (fIsReadOnly)
throw ExceptionFactory.createIsReadOnlyException(); throw ExceptionFactory.createIsReadOnlyException();
if (cfg == null) if (cfg == null)
@ -448,7 +455,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
@Override @Override
public ICStorageElement importStorage(String id, ICStorageElement el) throws UnsupportedOperationException, CoreException { public ICStorageElement importStorage(String id, ICStorageElement el)
throws UnsupportedOperationException, CoreException {
return getStorageBase().importStorage(id, el); return getStorageBase().importStorage(id, el);
} }
@ -518,7 +526,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
throw ExceptionFactory.createCoreException("CProjectDescription ICStorageElement == null"); //$NON-NLS-1$ throw ExceptionFactory.createCoreException("CProjectDescription ICStorageElement == null"); //$NON-NLS-1$
// if (fRootStorageElement == null) { // if (fRootStorageElement == null) {
// fRootStorageElement = CProjectDescriptionManager.getInstance().createStorage(fProject, true, true, isReadOnly()); // fRootStorageElement = CProjectDescriptionManager.getInstance().createStorage(fProject,
// true, true, isReadOnly());
//} //}
return fRootStorageElement; return fRootStorageElement;
} }
@ -535,7 +544,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
} }
@Override @Override
public ICConfigurationDescription createConfiguration(String buildSystemId, CConfigurationData data) throws CoreException { public ICConfigurationDescription createConfiguration(String buildSystemId, CConfigurationData data)
throws CoreException {
if (fIsReadOnly) if (fIsReadOnly)
throw ExceptionFactory.createIsReadOnlyException(); throw ExceptionFactory.createIsReadOnlyException();
CConfigurationDescription cfg = new CConfigurationDescription(data, buildSystemId, this); CConfigurationDescription cfg = new CConfigurationDescription(data, buildSystemId, this);
@ -543,7 +553,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
return cfg; return cfg;
} }
public CConfigurationDescription createConvertedConfiguration(String id, String name, ICStorageElement el) throws CoreException{ public CConfigurationDescription createConvertedConfiguration(String id, String name, ICStorageElement el)
throws CoreException {
if (fIsReadOnly) if (fIsReadOnly)
throw ExceptionFactory.createIsReadOnlyException(); throw ExceptionFactory.createIsReadOnlyException();
CConfigurationDescription cfg = new CConfigurationDescription(id, name, el, this); CConfigurationDescription cfg = new CConfigurationDescription(id, name, el, this);

View file

@ -98,10 +98,12 @@ import org.eclipse.cdt.internal.core.settings.model.xml.InternalXmlStorageElemen
import org.eclipse.cdt.internal.core.settings.model.xml.XmlStorage; import org.eclipse.cdt.internal.core.settings.model.xml.XmlStorage;
import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.ISavedState; import org.eclipse.core.resources.ISavedState;
import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRoot;
@ -134,27 +136,30 @@ import org.xml.sax.SAXException;
import com.ibm.icu.text.MessageFormat; import com.ibm.icu.text.MessageFormat;
/** /**
* The CProjectDescriptionManager is to marshall the loading and storing * The CProjectDescriptionManager is to marshall the loading and storing of CDT Project
* of CDT Project Descriptions. * Descriptions.
* *
* This class delegates loading and store of the project model to the appropriate * This class delegates loading and store of the project model to the appropriate
* AbstractCProjectDescriptionStorage for the Project Description. [ Discovered at Project load * AbstractCProjectDescriptionStorage for the Project Description. [ Discovered at Project load
* time.] * time.]
* *
* Users should not synchronize on the singleton instance of this class. It is the job of * Users should not synchronize on the singleton instance of this class. It is the job of the
* the AbstractCProjectDescriptionStorage to ensure thread safe access to the backing store * AbstractCProjectDescriptionStorage to ensure thread safe access to the backing store as described
* as described in that interface. * in that interface.
* *
* Previously this class created and persisted * Previously this class created and persisted
*
* @see ICProjectDescriptionManager * @see ICProjectDescriptionManager
*/ */
public class CProjectDescriptionManager implements ICProjectDescriptionManager { public class CProjectDescriptionManager implements ICProjectDescriptionManager {
public static final int INTERNAL_GET_IGNORE_CLOSE = 1 << 31; public static final int INTERNAL_GET_IGNORE_CLOSE = 1 << 31;
private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$ private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$
/** Preference Version 4.0 & 5.0 are equivalent for us. Version was inadvertently bumped /**
* when during project description storage work. * Preference Version 4.0 & 5.0 are equivalent for us. Version was inadvertently bumped when
* This is the minimum preference version we support loading.*/ * during project description storage work. This is the minimum preference version we support
* loading.
*/
public static final Version MIN_DESCRIPTION_VERSION = new Version("4.0"); //$NON-NLS-1$ public static final Version MIN_DESCRIPTION_VERSION = new Version("4.0"); //$NON-NLS-1$
/** Current preference file storage version */ /** Current preference file storage version */
public static final Version DESCRIPTION_VERSION = new Version("5.0"); //$NON-NLS-1$ public static final Version DESCRIPTION_VERSION = new Version("5.0"); //$NON-NLS-1$
@ -173,7 +178,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
private static final String DEFAULT_CFG_ID_PREFIX = CCorePlugin.PLUGIN_ID + ".default.config"; //$NON-NLS-1$ private static final String DEFAULT_CFG_ID_PREFIX = CCorePlugin.PLUGIN_ID + ".default.config"; //$NON-NLS-1$
private static final String DEFAULT_CFG_NAME = "Configuration"; //$NON-NLS-1$ private static final String DEFAULT_CFG_NAME = "Configuration"; //$NON-NLS-1$
private static final QualifiedName SCANNER_INFO_PROVIDER_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, "scannerInfoProvider"); //$NON-NLS-1$ private static final QualifiedName SCANNER_INFO_PROVIDER_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID,
"scannerInfoProvider"); //$NON-NLS-1$
static class CompositeWorkspaceRunnable implements IWorkspaceRunnable { static class CompositeWorkspaceRunnable implements IWorkspaceRunnable {
private List<IWorkspaceRunnable> fRunnables = new ArrayList<IWorkspaceRunnable>(); private List<IWorkspaceRunnable> fRunnables = new ArrayList<IWorkspaceRunnable>();
@ -268,7 +274,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** The CProjectDescriptionManager instance */ /** The CProjectDescriptionManager instance */
private static volatile CProjectDescriptionManager fInstance; private static volatile CProjectDescriptionManager fInstance;
private CProjectDescriptionManager(){} private CProjectDescriptionManager() {
}
public static CProjectDescriptionManager getInstance() { public static CProjectDescriptionManager getInstance() {
if (fInstance == null) if (fInstance == null)
@ -301,10 +308,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* *
* @param from Project to move the description from * @param from
* @param to Project where the description is moved to * Project to move the description from
* @return <b>ICProjectDescription</b> - non serialized, modified, writable * @param to
* project description. To serialize, call <code>setProjectDescription()</code> * Project where the description is moved to
* @return <b>ICProjectDescription</b> - non serialized, modified, writable project description.
* To serialize, call <code>setProjectDescription()</code>
* *
*/ */
public ICProjectDescription projectMove(IProject from, IProject to) { public ICProjectDescription projectMove(IProject from, IProject to) {
@ -322,7 +331,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return des; return des;
} }
public Job startup() { public Job startup() {
if (fRcChangeHandler == null) { if (fRcChangeHandler == null) {
fRcChangeHandler = new ResourceChangeHandler(); fRcChangeHandler = new ResourceChangeHandler();
@ -351,6 +359,43 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
protected IStatus run(IProgressMonitor monitor) { protected IStatus run(IProgressMonitor monitor) {
try { try {
startSaveParticipant(); startSaveParticipant();
// startup mapping of ICConfigurationDescriptors to IBuildConfigurations
CProjectDescriptionManager manager = CProjectDescriptionManager.getInstance();
manager.addCProjectDescriptionListener(new ICProjectDescriptionListener() {
@Override
public void handleEvent(CProjectDescriptionEvent event) {
ICProjectDescription projDesc = event.getNewCProjectDescription();
IProject project = projDesc.getProject();
for (ICConfigurationDescription desc : projDesc.getConfigurations()) {
String id = desc.getId();
try {
project.getBuildConfig(id);
} catch (CoreException e) {
if (e.getStatus().getCode() == IResourceStatus.BUILD_CONFIGURATION_NOT_FOUND) {
try {
Set<String> configNames = new HashSet<>();
for (IBuildConfiguration config : project.getBuildConfigs()) {
configNames.add(config.getName());
}
configNames.add(id);
// CCorePlugin.log(String.format("adding %s: %s", project.getName(), id)); //$NON-NLS-1$
IProjectDescription projectDesc = project.getDescription();
projectDesc.setBuildConfigs(
configNames.toArray(new String[configNames.size()]));
project.setDescription(projectDesc, new NullProgressMonitor());
// CCorePlugin.log(
// String.format("Config added %s: %s", project.getName(), id)); //$NON-NLS-1$
} catch (CoreException e2) {
CCorePlugin.log(e2.getStatus());
}
} else {
CCorePlugin.log(e.getStatus());
}
}
}
}
}, CProjectDescriptionEvent.LOADED | CProjectDescriptionEvent.ABOUT_TO_APPLY);
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
return e.getStatus(); return e.getStatus();
@ -368,17 +413,18 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
rcJob.setPriority(Job.INTERACTIVE); rcJob.setPriority(Job.INTERACTIVE);
rcJob.setSystem(true); rcJob.setSystem(true);
return rcJob; return rcJob;
} }
/* /*
* This method adds a save participant and resource change listener * This method adds a save participant and resource change listener Throws CoreException if the
* Throws CoreException if the methods fails to add a save participant. * methods fails to add a save participant. The resource change listener in not added in this
* The resource change listener in not added in this case either. * case either.
*/ */
private void startSaveParticipant() throws CoreException { private void startSaveParticipant() throws CoreException {
// Set up a listener for resource change events // Set up a listener for resource change events
ISavedState lastState = ISavedState lastState = ResourcesPlugin.getWorkspace().addSaveParticipant(CCorePlugin.PLUGIN_ID,
ResourcesPlugin.getWorkspace().addSaveParticipant(CCorePlugin.PLUGIN_ID, fRcChangeHandler); fRcChangeHandler);
if (lastState != null) { if (lastState != null) {
lastState.processResourceChangeEvents(fRcChangeHandler); lastState.processResourceChangeEvents(fRcChangeHandler);
@ -427,10 +473,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* Base method for getting a Project's Description * Base method for getting a Project's Description
*
* @param project * @param project
* @param flags * @param flags
* @return ICProjectDescription * @return ICProjectDescription
* @throws CoreException if project description isn't available * @throws CoreException
* if project description isn't available
*/ */
private ICProjectDescription getProjectDescriptionInternal(IProject project, int flags) throws CoreException { private ICProjectDescription getProjectDescriptionInternal(IProject project, int flags) throws CoreException {
AbstractCProjectDescriptionStorage storage = getProjectDescriptionStorage(project); AbstractCProjectDescriptionStorage storage = getProjectDescriptionStorage(project);
@ -439,14 +487,17 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* Run the workspace modification in the current thread using the workspace scheduling rule * Run the workspace modification in the current thread using the workspace scheduling rule
* Equivalent to: <code>runWspModification(IWorkspaceRunnable, ResourcecPlugin.getWorkspace().getRoot(), IProgressMonitor)</code> * Equivalent to:
*<br/><br/> * <code>runWspModification(IWorkspaceRunnable, ResourcecPlugin.getWorkspace().getRoot(), IProgressMonitor)</code>
* Note that if the workspace is locked, or the current job / thread doesn't contain the workspace * <br/>
* scheduling rule, then we schedule a job to run the {@link IWorkspaceRunnable} * <br/>
*<br/><br/> * Note that if the workspace is locked, or the current job / thread doesn't contain the
* workspace scheduling rule, then we schedule a job to run the {@link IWorkspaceRunnable} <br/>
* <br/>
* The scheduled job is returned, or null if the operation was run immediately. * The scheduled job is returned, or null if the operation was run immediately.
* *
* @param runnable the IWorkspaceRunnable to run * @param runnable
* the IWorkspaceRunnable to run
* @param monitor * @param monitor
* @return scheduled job or null if the operation was run immediately * @return scheduled job or null if the operation was run immediately
*/ */
@ -455,13 +506,15 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** /**
* Either runs the modification in the current thread (if the workspace is not locked) * Either runs the modification in the current thread (if the workspace is not locked) or
* or schedules a runnable to perform the operation * schedules a runnable to perform the operation
*
* @param runnable * @param runnable
* @param monitor * @param monitor
* @return scheduled job or null if the operation was run immediately * @return scheduled job or null if the operation was run immediately
*/ */
public static Job runWspModification(final IWorkspaceRunnable runnable, final ISchedulingRule rule, IProgressMonitor monitor){ public static Job runWspModification(final IWorkspaceRunnable runnable, final ISchedulingRule rule,
IProgressMonitor monitor) {
if (monitor == null) if (monitor == null)
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
@ -514,7 +567,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return null; return null;
} }
private static void runAtomic(final IWorkspaceRunnable r, ISchedulingRule rule, IProgressMonitor monitor) throws CoreException{ private static void runAtomic(final IWorkspaceRunnable r, ISchedulingRule rule, IProgressMonitor monitor)
throws CoreException {
IWorkspace wsp = ResourcesPlugin.getWorkspace(); IWorkspace wsp = ResourcesPlugin.getWorkspace();
wsp.run(new IWorkspaceRunnable() { wsp.run(new IWorkspaceRunnable() {
@Override @Override
@ -615,7 +669,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
if (fConverters != null) if (fConverters != null)
return; return;
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CProjectConverterDesciptor.PROJECT_CONVERTER_EXTPOINT_ID); IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(CProjectConverterDesciptor.PROJECT_CONVERTER_EXTPOINT_ID);
IExtension exts[] = extensionPoint.getExtensions(); IExtension exts[] = extensionPoint.getExtensions();
CProjectConverterDesciptor[] dess = new CProjectConverterDesciptor[exts.length]; CProjectConverterDesciptor[] dess = new CProjectConverterDesciptor[exts.length];
@ -632,7 +687,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
@Override @Override
public ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists, boolean creating) throws CoreException{ public ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists, boolean creating)
throws CoreException {
int flags = ICProjectDescriptionManager.GET_WRITABLE | ICProjectDescriptionManager.GET_CREATE_DESCRIPTION; int flags = ICProjectDescriptionManager.GET_WRITABLE | ICProjectDescriptionManager.GET_CREATE_DESCRIPTION;
flags |= loadIfExists ? 0 : ICProjectDescriptionManager.GET_EMPTY_PROJECT_DESCRIPTION; flags |= loadIfExists ? 0 : ICProjectDescriptionManager.GET_EMPTY_PROJECT_DESCRIPTION;
flags |= creating ? ICProjectDescriptionManager.PROJECT_CREATING : 0; flags |= creating ? ICProjectDescriptionManager.PROJECT_CREATING : 0;
@ -646,7 +702,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return new ScannerInfoProviderProxy(project); return new ScannerInfoProviderProxy(project);
} }
ScannerInfoProviderProxy provider = (ScannerInfoProviderProxy)des.getSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY); ScannerInfoProviderProxy provider = (ScannerInfoProviderProxy) des
.getSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY);
if (provider == null) { if (provider == null) {
provider = new ScannerInfoProviderProxy(project); provider = new ScannerInfoProviderProxy(project);
des.setSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY, provider); des.setSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY, provider);
@ -665,7 +722,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/* /*
* returns true if the project description was modified false - otherwise * returns true if the project description was modified false - otherwise
*/ */
public boolean checkHandleActiveCfgChange(CProjectDescription newDes, ICProjectDescription oldDes, IProjectDescription eDes, IProgressMonitor monitor){ public boolean checkHandleActiveCfgChange(CProjectDescription newDes, ICProjectDescription oldDes,
IProjectDescription eDes, IProgressMonitor monitor) {
if (newDes == null) if (newDes == null)
return false; return false;
ICConfigurationDescription newCfg = newDes.getActiveConfiguration(); ICConfigurationDescription newCfg = newDes.getActiveConfiguration();
@ -722,7 +780,9 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
* Fix up platform references having changed CDT configuration references * Fix up platform references having changed CDT configuration references
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private boolean checkProjectRefChange(IProjectDescription des, ICProjectDescription newCDesc, ICConfigurationDescription newCfg, ICConfigurationDescription oldCfg, IProgressMonitor monitor) throws CoreException{ private boolean checkProjectRefChange(IProjectDescription des, ICProjectDescription newCDesc,
ICConfigurationDescription newCfg, ICConfigurationDescription oldCfg, IProgressMonitor monitor)
throws CoreException {
if (newCfg == null) if (newCfg == null)
return false; return false;
@ -764,7 +824,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return true; return true;
} }
// private void checkBuildSystemChange(IProject project, String newBsId, String oldBsId, IProgressMonitor monitor) throws CoreException{ // private void checkBuildSystemChange(IProject project, String newBsId, String oldBsId, IProgressMonitor monitor) throws CoreException{
// checkBuildSystemChange(project, null, newBsId, oldBsId, monitor); // checkBuildSystemChange(project, null, newBsId, oldBsId, monitor);
// } // }
@ -778,7 +837,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
// String newId = newCfg.getId(); // String newId = newCfg.getId();
String oldId = oldCfg != null ? oldCfg.getId() : null; String oldId = oldCfg != null ? oldCfg.getId() : null;
return des.checkPersistActiveCfg(oldId, false); return des.checkPersistActiveCfg(oldId, false);
} }
@ -791,7 +849,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
// String newId = newCfg.getId(); // String newId = newCfg.getId();
String oldId = oldCfg != null ? oldCfg.getId() : null; String oldId = oldCfg != null ? oldCfg.getId() : null;
return des.checkPersistSettingCfg(oldId, false); return des.checkPersistSettingCfg(oldId, false);
} }
@ -841,7 +898,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
@Override @Override
public void setProjectDescription(IProject project, ICProjectDescription des, boolean force, IProgressMonitor monitor) throws CoreException { public void setProjectDescription(IProject project, ICProjectDescription des, boolean force,
IProgressMonitor monitor) throws CoreException {
int flags = force ? SET_FORCE : 0; int flags = force ? SET_FORCE : 0;
setProjectDescription(project, des, flags, monitor); setProjectDescription(project, des, flags, monitor);
} }
@ -851,9 +909,16 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** ThreadLocal flag to let CDescriptor know whether already in a setProjectDescription */ /** ThreadLocal flag to let CDescriptor know whether already in a setProjectDescription */
ThreadLocal<Boolean> settingProjectDescription = new ThreadLocal<Boolean>(){@Override protected Boolean initialValue() {return false;}}; ThreadLocal<Boolean> settingProjectDescription = new ThreadLocal<Boolean>() {
@Override @Override
public void setProjectDescription(IProject project, ICProjectDescription des, int flags, IProgressMonitor monitor) throws CoreException { protected Boolean initialValue() {
return false;
}
};
@Override
public void setProjectDescription(IProject project, ICProjectDescription des, int flags, IProgressMonitor monitor)
throws CoreException {
boolean originalState = isCurrentThreadSetProjectDescription(); boolean originalState = isCurrentThreadSetProjectDescription();
try { try {
if (originalState) { if (originalState) {
@ -861,15 +926,19 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
// But it is quite likely to be an error on part of the caller unaware that their listener can be called from inside setProjectDescription(). // But it is quite likely to be an error on part of the caller unaware that their listener can be called from inside setProjectDescription().
// To avoid the log entry the callers should check CProjectDescriptionManager.isCurrentThreadSetProjectDescription() // To avoid the log entry the callers should check CProjectDescriptionManager.isCurrentThreadSetProjectDescription()
// and schedule the update in background thread themselves. // and schedule the update in background thread themselves.
CCorePlugin.logStackTrace(IStatus.INFO, "Recursive setProjectDescription from event listener, project=" + project); //$NON-NLS-1$ CCorePlugin.logStackTrace(IStatus.INFO,
"Recursive setProjectDescription from event listener, project=" + project); //$NON-NLS-1$
} }
settingProjectDescription.set(true); settingProjectDescription.set(true);
if (des != null) { if (des != null) {
if (!project.isAccessible()) if (!project.isAccessible())
throw ExceptionFactory.createCoreException(MessageFormat.format(CCorePlugin.getResourceString("ProjectDescription.ProjectNotAccessible"), new Object[] {project.getName()})); //$NON-NLS-1$ throw ExceptionFactory.createCoreException(MessageFormat.format(
CCorePlugin.getResourceString("ProjectDescription.ProjectNotAccessible"), //$NON-NLS-1$
new Object[] { project.getName() }));
if (!des.isValid() && (!fAllowEmptyCreatingDescription || !des.isCdtProjectCreating())) if (!des.isValid() && (!fAllowEmptyCreatingDescription || !des.isCdtProjectCreating()))
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.17") + project.getName()); //$NON-NLS-1$ throw ExceptionFactory.createCoreException(
SettingsModelMessages.getString("CProjectDescriptionManager.17") + project.getName()); //$NON-NLS-1$
if (!checkFlags(flags, SET_FORCE) && !des.isModified()) if (!checkFlags(flags, SET_FORCE) && !des.isModified())
return; return;
@ -889,7 +958,9 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** /**
* Indicates that a setProjectDescription is currently in progress to prevent recursive setProjectDescription * Indicates that a setProjectDescription is currently in progress to prevent recursive
* setProjectDescription
*
* @return boolean * @return boolean
*/ */
public boolean isCurrentThreadSetProjectDescription() { public boolean isCurrentThreadSetProjectDescription() {
@ -898,22 +969,29 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* Base for getting a project desc's storage. project must be accessible. * Base for getting a project desc's storage. project must be accessible.
*
* @param project * @param project
* @return ProjectDescription storage * @return ProjectDescription storage
* @throws CoreException if Project isn't accessible * @throws CoreException
* if Project isn't accessible
*/ */
private AbstractCProjectDescriptionStorage getProjectDescriptionStorage(IProject project) throws CoreException { private AbstractCProjectDescriptionStorage getProjectDescriptionStorage(IProject project) throws CoreException {
if (project == null || !project.isAccessible()) if (project == null || !project.isAccessible())
throw ExceptionFactory.createCoreException(MessageFormat.format(CCorePlugin.getResourceString("ProjectDescription.ProjectNotAccessible"), new Object[] {project != null ? project.getName() : "<null>"})); //$NON-NLS-1$ //$NON-NLS-2$ throw ExceptionFactory.createCoreException(
AbstractCProjectDescriptionStorage storage = CProjectDescriptionStorageManager.getInstance().getProjectDescriptionStorage(project); MessageFormat.format(CCorePlugin.getResourceString("ProjectDescription.ProjectNotAccessible"), //$NON-NLS-1$
new Object[] { project != null ? project.getName() : "<null>" })); //$NON-NLS-1$
AbstractCProjectDescriptionStorage storage = CProjectDescriptionStorageManager.getInstance()
.getProjectDescriptionStorage(project);
if (storage == null) if (storage == null)
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.FailedToGetStorage") + project.getName()); //$NON-NLS-1$ throw ExceptionFactory.createCoreException(
SettingsModelMessages.getString("CProjectDescriptionManager.FailedToGetStorage") //$NON-NLS-1$
+ project.getName());
return storage; return storage;
} }
/** /**
* Return an ICSettingsStorage based on the provided ICStorageElement * Return an ICSettingsStorage based on the provided ICStorageElement in the given IProject
* in the given IProject *
* @param project * @param project
* @return ICSettingsStorages * @return ICSettingsStorages
*/ */
@ -1007,7 +1085,11 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return setting; return setting;
} }
public ICLanguageSetting findLanguageSettingForContentTypeId(String id, ICLanguageSetting settings[]/*, boolean src*/){ public ICLanguageSetting findLanguageSettingForContentTypeId(String id, ICLanguageSetting settings[]/*
* ,
* boolean
* src
*/) {
for (ICLanguageSetting setting : settings) { for (ICLanguageSetting setting : settings) {
String ids[] = setting.getSourceContentTypeIds(); String ids[] = setting.getSourceContentTypeIds();
if (ListComparator.indexOf(id, ids) != -1) if (ListComparator.indexOf(id, ids) != -1)
@ -1016,7 +1098,11 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return null; return null;
} }
public ICLanguageSetting[] findCompatibleSettingsForContentTypeId(String id, ICLanguageSetting[] settings/*, boolean src*/){ public ICLanguageSetting[] findCompatibleSettingsForContentTypeId(String id, ICLanguageSetting[] settings/*
* ,
* boolean
* src
*/) {
IContentTypeManager manager = Platform.getContentTypeManager(); IContentTypeManager manager = Platform.getContentTypeManager();
IContentType cType = manager.getContentType(id); IContentType cType = manager.getContentType(id);
if (cType != null) { if (cType != null) {
@ -1035,18 +1121,17 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return EMPTY_LANGUAGE_SETTINGS_ARRAY; return EMPTY_LANGUAGE_SETTINGS_ARRAY;
} }
public ICLanguageSetting findLanguageSettingForExtension(String ext, ICLanguageSetting settings[]/*, boolean src*/){ public ICLanguageSetting findLanguageSettingForExtension(String ext, ICLanguageSetting settings[]/*
* ,
* boolean
* src
*/) {
for (ICLanguageSetting setting : settings) { for (ICLanguageSetting setting : settings) {
String exts[] = setting.getSourceExtensions(); String exts[] = setting.getSourceExtensions();
/* if(src){ /*
if(setting.getSourceContentType() == null){ * if(src){ if(setting.getSourceContentType() == null){ exts =
exts = setting.getSourceExtensions(); * setting.getSourceExtensions(); } } else { if(setting.getHeaderContentType() == null){
} * exts = setting.getHeaderExtensions(); } }
} else {
if(setting.getHeaderContentType() == null){
exts = setting.getHeaderExtensions();
}
}
*/ */
if (exts != null && exts.length != 0) { if (exts != null && exts.length != 0) {
for (String ex : exts) { for (String ex : exts) {
@ -1059,8 +1144,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** /**
* Returns a map of configurations elements as discovered from the supplied project * Returns a map of configurations elements as discovered from the supplied project description
* description *
* @param des * @param des
* @return Map String -> ICStorageElement: configuration name -> configuration ICStorageElement * @return Map String -> ICStorageElement: configuration name -> configuration ICStorageElement
* @throws CoreException * @throws CoreException
@ -1084,10 +1169,15 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* Create the configuration storage cfgId in the project description * Create the configuration storage cfgId in the project description
* @param storage the root settingsStorage of the project *
* @param cfgId the configuration Id desire * @param storage
* @return the cfgId as discovered in the project description or a new ICStorageElement with that Id * the root settingsStorage of the project
* @throws CoreException on failure to create storage * @param cfgId
* the configuration Id desire
* @return the cfgId as discovered in the project description or a new ICStorageElement with
* that Id
* @throws CoreException
* on failure to create storage
*/ */
ICStorageElement createStorage(ICSettingsStorage storage, String cfgId) throws CoreException { ICStorageElement createStorage(ICSettingsStorage storage, String cfgId) throws CoreException {
ICStorageElement rootElement = storage.getStorage(MODULE_ID, true); // throws CoreException ICStorageElement rootElement = storage.getStorage(MODULE_ID, true); // throws CoreException
@ -1111,16 +1201,21 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** /**
* Creates a new configuration storage based on an existing 'base' storage. * Creates a new configuration storage based on an existing 'base' storage. If a configuration
* If a configuration with the new ID already exists in the passed in project storage * with the new ID already exists in the passed in project storage a CoreException is thrown.
* a CoreException is thrown. *
* @param storage the setting storage of the current project description * @param storage
* @param cfgId configID of the new configuration - must be unique in * the setting storage of the current project description
* @param base the base (spec settings) storage element from which settings should be copied. * @param cfgId
* configID of the new configuration - must be unique in
* @param base
* the base (spec settings) storage element from which settings should be copied.
* @return ICStorageElement representing the new configuration * @return ICStorageElement representing the new configuration
* @throws CoreException on failure * @throws CoreException
* on failure
*/ */
ICStorageElement createStorage(ICSettingsStorage storage, String cfgId, ICStorageElement base) throws CoreException{ ICStorageElement createStorage(ICSettingsStorage storage, String cfgId, ICStorageElement base)
throws CoreException {
ICStorageElement rootElement = storage.getStorage(MODULE_ID, true); ICStorageElement rootElement = storage.getStorage(MODULE_ID, true);
ICStorageElement children[] = rootElement.getChildren(); ICStorageElement children[] = rootElement.getChildren();
for (ICStorageElement child : children) { for (ICStorageElement child : children) {
@ -1137,8 +1232,11 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
/** /**
* Remove the storage with the supplied configuration Id from the project * Remove the storage with the supplied configuration Id from the project
* @param storage The root settingsStorage of the project *
* @param cfgId the configuration ID which would be * @param storage
* The root settingsStorage of the project
* @param cfgId
* the configuration ID which would be
* @throws CoreException * @throws CoreException
*/ */
void removeStorage(ICSettingsStorage storage, String cfgId) throws CoreException { void removeStorage(ICSettingsStorage storage, String cfgId) throws CoreException {
@ -1168,7 +1266,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
} }
void removeData(ICConfigurationDescription des, CConfigurationData data, IProgressMonitor monitor) throws CoreException{ void removeData(ICConfigurationDescription des, CConfigurationData data, IProgressMonitor monitor)
throws CoreException {
if (monitor == null) if (monitor == null)
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
@ -1176,7 +1275,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
provider.removeConfiguration(des, data, monitor); provider.removeConfiguration(des, data, monitor);
} }
CConfigurationData createData(ICConfigurationDescription des, ICConfigurationDescription baseDescription, CConfigurationData base, boolean clone, IProgressMonitor monitor) throws CoreException{ CConfigurationData createData(ICConfigurationDescription des, ICConfigurationDescription baseDescription,
CConfigurationData base, boolean clone, IProgressMonitor monitor) throws CoreException {
if (monitor == null) if (monitor == null)
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
@ -1209,7 +1309,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
if (fProviderMap != null) if (fProviderMap != null)
return; return;
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CConfigurationDataProviderDescriptor.DATA_PROVIDER_EXTPOINT_ID); IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(CConfigurationDataProviderDescriptor.DATA_PROVIDER_EXTPOINT_ID);
IExtension exts[] = extensionPoint.getExtensions(); IExtension exts[] = extensionPoint.getExtensions();
fProviderMap = new HashMap<String, CConfigurationDataProviderDescriptor>(exts.length); fProviderMap = new HashMap<String, CConfigurationDataProviderDescriptor>(exts.length);
@ -1220,24 +1321,21 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
} }
/* CConfigurationSpecSettings createConfigurationSpecSettings(ICConfigurationDescription cfg) throws CoreException{ /*
CConfigurationSpecSettings settings = null; * CConfigurationSpecSettings createConfigurationSpecSettings(ICConfigurationDescription cfg)
if(cfg instanceof CConfigurationDescriptionCache){ * throws CoreException{ CConfigurationSpecSettings settings = null; if(cfg instanceof
settings = new CConfigurationSpecSettings(cfg, createStorage(cfg.getProjectDescription(), cfg.getId())); * CConfigurationDescriptionCache){ settings = new CConfigurationSpecSettings(cfg,
} else { * createStorage(cfg.getProjectDescription(), cfg.getId())); } else { ICProjectDescription des =
ICProjectDescription des = getProjecDescription(cfg.getProjectDescription().getProject(), false); * getProjecDescription(cfg.getProjectDescription().getProject(), false);
CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)des.getConfigurationById(cfg.getId()); * CConfigurationDescriptionCache cache =
if(cache != null){ * (CConfigurationDescriptionCache)des.getConfigurationById(cfg.getId()); if(cache != null){
settings = new CConfigurationSpecSettings(cfg, cache.getSpecSettings()); * settings = new CConfigurationSpecSettings(cfg, cache.getSpecSettings()); } else { settings =
} else { * new CConfigurationSpecSettings(cfg, createStorage(cfg.getProjectDescription(), cfg.getId()));
settings = new CConfigurationSpecSettings(cfg, createStorage(cfg.getProjectDescription(), cfg.getId())); * } } return settings; }
}
}
return settings;
}
*/ */
public ICStorageElement createPreferenceStorage(String key, boolean createEmptyIfNotFound, boolean readOnly) throws CoreException{ public ICStorageElement createPreferenceStorage(String key, boolean createEmptyIfNotFound, boolean readOnly)
throws CoreException {
try { try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = null; Document doc = null;
@ -1253,27 +1351,33 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
Node rootElement = doc.getFirstChild(); Node rootElement = doc.getFirstChild();
if (rootElement.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) { if (rootElement.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) {
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.2")); //$NON-NLS-1$ throw ExceptionFactory
.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.2")); //$NON-NLS-1$
} else { } else {
String fileVersion = rootElement.getNodeValue(); String fileVersion = rootElement.getNodeValue();
Version version = new Version(fileVersion); Version version = new Version(fileVersion);
// Make sure that the version is compatible with the manager // Make sure that the version is compatible with the manager
// Version must between min version and current version inclusive // Version must between min version and current version inclusive
if (MIN_DESCRIPTION_VERSION.compareTo(version) > 0 || DESCRIPTION_VERSION.compareTo(version) < 0) { if (MIN_DESCRIPTION_VERSION.compareTo(version) > 0
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.3")); //$NON-NLS-1$ || DESCRIPTION_VERSION.compareTo(version) < 0) {
throw ExceptionFactory.createCoreException(
SettingsModelMessages.getString("CProjectDescriptionManager.3")); //$NON-NLS-1$
} }
} }
// Now get the project root element (there should be only one) // Now get the project root element (there should be only one)
NodeList nodes = doc.getElementsByTagName(ROOT_PREFERENCE_ELEMENT); NodeList nodes = doc.getElementsByTagName(ROOT_PREFERENCE_ELEMENT);
if (nodes.getLength() == 0) if (nodes.getLength() == 0)
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.4")); //$NON-NLS-1$ throw ExceptionFactory
.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.4")); //$NON-NLS-1$
Node node = nodes.item(0); Node node = nodes.item(0);
if (node.getNodeType() != Node.ELEMENT_NODE) if (node.getNodeType() != Node.ELEMENT_NODE)
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.5")); //$NON-NLS-1$ throw ExceptionFactory
.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.5")); //$NON-NLS-1$
element = (Element) node; element = (Element) node;
} else if (!createEmptyIfNotFound) { } else if (!createEmptyIfNotFound) {
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.6")); //$NON-NLS-1$ throw ExceptionFactory
.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.6")); //$NON-NLS-1$
} }
} catch (FactoryConfigurationError e) { } catch (FactoryConfigurationError e) {
if (!createEmptyIfNotFound) if (!createEmptyIfNotFound)
@ -1295,7 +1399,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
if (element == null) { if (element == null) {
doc = builder.newDocument(); doc = builder.newDocument();
ProcessingInstruction instruction = doc.createProcessingInstruction(VERSION_ELEMENT_NAME, DESCRIPTION_VERSION.toString()); ProcessingInstruction instruction = doc.createProcessingInstruction(VERSION_ELEMENT_NAME,
DESCRIPTION_VERSION.toString());
doc.appendChild(instruction); doc.appendChild(instruction);
element = doc.createElement(ROOT_PREFERENCE_ELEMENT); element = doc.createElement(ROOT_PREFERENCE_ELEMENT);
doc.appendChild(element); doc.appendChild(element);
@ -1385,22 +1490,19 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return !newCfg.getId().equals(oldCfg.getId()); return !newCfg.getId().equals(oldCfg.getId());
} }
/* void postProcessNewDescriptionCache(CProjectDescription des, ICProjectDescriptionDelta delta){ /*
if(delta == null && delta.getDeltaKind() != ICProjectDescriptionDelta.CHANGED) * void postProcessNewDescriptionCache(CProjectDescription des, ICProjectDescriptionDelta
return; * delta){ if(delta == null && delta.getDeltaKind() != ICProjectDescriptionDelta.CHANGED)
* return;
ICConfigurationDescription indexCfg = des.getIndexConfiguration(); *
ICConfigurationDescription activeCfg = des.getActiveConfiguration(); * ICConfigurationDescription indexCfg = des.getIndexConfiguration(); ICConfigurationDescription
ICProjectDescriptionDelta activeCfgDelta = findDelta(activeCfg.getId(), delta); * activeCfg = des.getActiveConfiguration(); ICProjectDescriptionDelta activeCfgDelta =
if(indexCfg != activeCfg){ * findDelta(activeCfg.getId(), delta); if(indexCfg != activeCfg){
switch(activeCfgDelta.getDeltaKind()){ * switch(activeCfgDelta.getDeltaKind()){ case ICProjectDescriptionDelta.CHANGED:
case ICProjectDescriptionDelta.CHANGED: * des.setIndexConfiguration(activeCfg); } }
des.setIndexConfiguration(activeCfg); *
} *
} * }
}
*/ */
private ICDescriptionDelta findDelta(String id, ICDescriptionDelta delta) { private ICDescriptionDelta findDelta(String id, ICDescriptionDelta delta) {
ICDescriptionDelta children[] = delta.getChildren(); ICDescriptionDelta children[] = delta.getChildren();
@ -1512,7 +1614,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
if (bsDelta != null) if (bsDelta != null)
delta.addChild(bsDelta); delta.addChild(bsDelta);
CProjectDescriptionDelta tpsDelta = createDelta(newCfg.getTargetPlatformSetting(), oldCfg.getTargetPlatformSetting()); CProjectDescriptionDelta tpsDelta = createDelta(newCfg.getTargetPlatformSetting(),
oldCfg.getTargetPlatformSetting());
if (tpsDelta != null) if (tpsDelta != null)
delta.addChild(tpsDelta); delta.addChild(tpsDelta);
@ -1657,7 +1760,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return flags; return flags;
} }
private ExtSettingsDelta[] getSettingChange(ICConfigurationDescription newDes, ICConfigurationDescription oldDes) { private ExtSettingsDelta[] getSettingChange(ICConfigurationDescription newDes, ICConfigurationDescription oldDes) {
CExternalSetting[] newSettings = newDes != null ? (CExternalSetting[]) newDes.getExternalSettings() : null; CExternalSetting[] newSettings = newDes != null ? (CExternalSetting[]) newDes.getExternalSettings() : null;
CExternalSetting[] oldSettings = oldDes != null ? (CExternalSetting[]) oldDes.getExternalSettings() : null; CExternalSetting[] oldSettings = oldDes != null ? (CExternalSetting[]) oldDes.getExternalSettings() : null;
@ -1853,13 +1955,11 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
if (!Arrays.equals(newCtIds, oldCtIds)) if (!Arrays.equals(newCtIds, oldCtIds))
delta.addChangeFlags(ICDescriptionDelta.SOURCE_CONTENT_TYPE); delta.addChangeFlags(ICDescriptionDelta.SOURCE_CONTENT_TYPE);
String[] newExts = newLs.getSourceExtensions(); String[] newExts = newLs.getSourceExtensions();
String[] oldExts = oldLs.getSourceExtensions(); String[] oldExts = oldLs.getSourceExtensions();
if (!Arrays.equals(newExts, oldExts)) if (!Arrays.equals(newExts, oldExts))
delta.addChangeFlags(ICDescriptionDelta.SOURCE_EXTENSIONS); delta.addChangeFlags(ICDescriptionDelta.SOURCE_EXTENSIONS);
// newCt = newLs.getHeaderContentType(); // newCt = newLs.getHeaderContentType();
// oldCt = oldLs.getHeaderContentType(); // oldCt = oldLs.getHeaderContentType();
@ -1875,7 +1975,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return delta.isEmpty() ? null : delta; return delta.isEmpty() ? null : delta;
} }
private boolean[] calculateSettingsChanges(ICLanguageSettingEntry newEntries[], ICLanguageSettingEntry oldEntries[]) { private boolean[] calculateSettingsChanges(ICLanguageSettingEntry newEntries[],
ICLanguageSettingEntry oldEntries[]) {
boolean result[] = new boolean[3]; boolean result[] = new boolean[3];
// if nothing was known before do not generate any deltas. // if nothing was known before do not generate any deltas.
@ -1933,17 +2034,14 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return result; return result;
} }
/* public boolean entriesEqual(ICLanguageSettingEntry entries1[], ICLanguageSettingEntry entries2[]){ /*
if(entries1.length != entries2.length) * public boolean entriesEqual(ICLanguageSettingEntry entries1[], ICLanguageSettingEntry
return false; * entries2[]){ if(entries1.length != entries2.length) return false;
*
for(int i = 0; i < entries1.length; i++){ * for(int i = 0; i < entries1.length; i++){ if(!entries1[i].equals(entries2[i])) return false;
if(!entries1[i].equals(entries2[i])) * }
return false; *
} * return true; }
return true;
}
*/ */
private CProjectDescriptionDelta createDelta(ICBuildSetting newBuildSetting, ICBuildSetting oldBuildSetting) { private CProjectDescriptionDelta createDelta(ICBuildSetting newBuildSetting, ICBuildSetting oldBuildSetting) {
CProjectDescriptionDelta delta = new CProjectDescriptionDelta(newBuildSetting, oldBuildSetting); CProjectDescriptionDelta delta = new CProjectDescriptionDelta(newBuildSetting, oldBuildSetting);
@ -2000,7 +2098,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return EMPTY_CELEMENT_DELTA; return EMPTY_CELEMENT_DELTA;
} }
private List<CElementDelta> generateCElementDeltasFromCfgDelta(ICProject cProject, ICDescriptionDelta cfgDelta, List<CElementDelta> list){ private List<CElementDelta> generateCElementDeltasFromCfgDelta(ICProject cProject, ICDescriptionDelta cfgDelta,
List<CElementDelta> list) {
int kind = cfgDelta.getDeltaKind(); int kind = cfgDelta.getDeltaKind();
switch (kind) { switch (kind) {
case ICDescriptionDelta.CHANGED: case ICDescriptionDelta.CHANGED:
@ -2034,11 +2133,13 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
/** /**
* The method maps {@link ICDescriptionDelta} to {@link CElementDelta} which are added to the {@code list}. * The method maps {@link ICDescriptionDelta} to {@link CElementDelta} which are added to the
* The delta will indicate modification of CElement for a given resource plus language settings * {@code list}. The delta will indicate modification of CElement for a given resource plus
* if they changed (relative to parent resource description if the resource has no its own). * language settings if they changed (relative to parent resource description if the resource
* has no its own).
*/ */
private void generateCElementDeltasFromResourceDelta(ICProject cProject, ICDescriptionDelta delta, List<CElementDelta> list){ private void generateCElementDeltasFromResourceDelta(ICProject cProject, ICDescriptionDelta delta,
List<CElementDelta> list) {
int kind = delta.getDeltaKind(); int kind = delta.getDeltaKind();
ICDescriptionDelta parentDelta = delta.getParent(); ICDescriptionDelta parentDelta = delta.getParent();
@ -2063,7 +2164,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
break; break;
default: default:
// Not possible // Not possible
CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, SettingsModelMessages.getString("CProjectDescriptionManager.illegalDeltaKind")+kind)); //$NON-NLS-1$ CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID,
SettingsModelMessages.getString("CProjectDescriptionManager.illegalDeltaKind") + kind)); //$NON-NLS-1$
return; return;
} }
path = path.makeRelative(); path = path.makeRelative();
@ -2089,13 +2191,17 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
generateCElementDeltasFromLanguageDelta(el, ld, list); generateCElementDeltasFromLanguageDelta(el, ld, list);
} else { } else {
if (newRcDes.getType() != ICSettingBase.SETTING_FOLDER) { if (newRcDes.getType() != ICSettingBase.SETTING_FOLDER) {
CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, SettingsModelMessages.getString("CProjectDescriptionManager.wrongTypeOfResourceDescription")+newRcDes)); //$NON-NLS-1$ CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID,
SettingsModelMessages.getString("CProjectDescriptionManager.wrongTypeOfResourceDescription") //$NON-NLS-1$
+ newRcDes));
return; return;
} }
ICFolderDescription newFoDes = (ICFolderDescription) newRcDes; ICFolderDescription newFoDes = (ICFolderDescription) newRcDes;
if (oldRcDes.getType() != ICSettingBase.SETTING_FOLDER) { if (oldRcDes.getType() != ICSettingBase.SETTING_FOLDER) {
CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, SettingsModelMessages.getString("CProjectDescriptionManager.wrongTypeOfResourceDescription")+oldRcDes)); //$NON-NLS-1$ CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID,
SettingsModelMessages.getString("CProjectDescriptionManager.wrongTypeOfResourceDescription") //$NON-NLS-1$
+ oldRcDes));
return; return;
} }
ICFolderDescription oldFoDes = (ICFolderDescription) oldRcDes; ICFolderDescription oldFoDes = (ICFolderDescription) oldRcDes;
@ -2120,7 +2226,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return ((ICFolderDescription) rcDes).getLanguageSettingForFile(fileName); return ((ICFolderDescription) rcDes).getLanguageSettingForFile(fileName);
} }
private List<CElementDelta> generateCElementDeltasFromLanguageDelta(ICElement el, ICDescriptionDelta delta, List<CElementDelta> list){ private List<CElementDelta> generateCElementDeltasFromLanguageDelta(ICElement el, ICDescriptionDelta delta,
List<CElementDelta> list) {
if (delta == null) if (delta == null)
return list; return list;
@ -2245,7 +2352,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
} }
@Override @Override
public ICConfigurationDescription getPreferenceConfiguration(String buildSystemId, boolean write) throws CoreException { public ICConfigurationDescription getPreferenceConfiguration(String buildSystemId, boolean write)
throws CoreException {
ICConfigurationDescription des = getLoaddedPreference(buildSystemId); ICConfigurationDescription des = getLoaddedPreference(buildSystemId);
if (des == null) { if (des == null) {
try { try {
@ -2286,12 +2394,14 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
setLoaddedPreference(buildSystemId, cache); setLoaddedPreference(buildSystemId, cache);
} }
private void savePreferenceConfiguration(String buildStystemId, CConfigurationDescriptionCache cache) throws CoreException{ private void savePreferenceConfiguration(String buildStystemId, CConfigurationDescriptionCache cache)
throws CoreException {
ICStorageElement el = cache.getSpecSettings().getRootStorageElement(); ICStorageElement el = cache.getSpecSettings().getRootStorageElement();
saveBuildSystemConfigPreferenceStorage(buildStystemId, el); saveBuildSystemConfigPreferenceStorage(buildStystemId, el);
} }
private void saveBuildSystemConfigPreferenceStorage(String buildSystemId, ICStorageElement el) throws CoreException{ private void saveBuildSystemConfigPreferenceStorage(String buildSystemId, ICStorageElement el)
throws CoreException {
ICStorageElement cur = getBuildSystemConfigPreferenceStorage(buildSystemId); ICStorageElement cur = getBuildSystemConfigPreferenceStorage(buildSystemId);
ICStorageElement parent = cur.getParent(); ICStorageElement parent = cur.getParent();
parent.removeChild(cur); parent.removeChild(cur);
@ -2308,7 +2418,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return false; return false;
} }
private ICConfigurationDescription createWritablePreference(CConfigurationDescriptionCache cache) throws CoreException{ private ICConfigurationDescription createWritablePreference(CConfigurationDescriptionCache cache)
throws CoreException {
return new CConfigurationDescription(cache, fPrefUpdater); return new CConfigurationDescription(cache, fPrefUpdater);
} }
@ -2326,7 +2437,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
rootParent.removeChild(rootEl); rootParent.removeChild(rootEl);
ICStorageElement baseRootEl = settings.getRootStorageElement(); ICStorageElement baseRootEl = settings.getRootStorageElement();
rootEl = rootParent.importChild(baseRootEl); rootEl = rootParent.importChild(baseRootEl);
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, baseCache, cfgDes.getSpecSettings(), null, rootEl); CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, baseCache,
cfgDes.getSpecSettings(), null, rootEl);
SettingsContext context = new SettingsContext(null); SettingsContext context = new SettingsContext(null);
cache.applyData(context); cache.applyData(context);
cache.doneInitialization(); cache.doneInitialization();
@ -2338,7 +2450,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
ICStorageElement cfgEl = getBuildSystemConfigPreferenceStorage(buildSystemId, true, false); ICStorageElement cfgEl = getBuildSystemConfigPreferenceStorage(buildSystemId, true, false);
String id = PREFERENCE_CFG_ID_PREFIX + buildSystemId; String id = PREFERENCE_CFG_ID_PREFIX + buildSystemId;
CConfigurationDescription des = new CConfigurationDescription(id, PREFERENCE_CFG_NAME, buildSystemId, cfgEl, fPrefUpdater); CConfigurationDescription des = new CConfigurationDescription(id, PREFERENCE_CFG_NAME, buildSystemId, cfgEl,
fPrefUpdater);
return createPreferenceCache(des); return createPreferenceCache(des);
} }
@ -2363,7 +2476,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return getBuildSystemConfigPreferenceStorage(buildSystemId, true, false); return getBuildSystemConfigPreferenceStorage(buildSystemId, true, false);
} }
private ICStorageElement getBuildSystemConfigPreferenceStorage(String buildSystemId, boolean createIfNotDound, boolean readOnly) throws CoreException{ private ICStorageElement getBuildSystemConfigPreferenceStorage(String buildSystemId, boolean createIfNotDound,
boolean readOnly) throws CoreException {
ICStorageElement el = getPreferenceStorage(PREFERENCES_STORAGE, MODULE_ID, createIfNotDound, readOnly); ICStorageElement el = getPreferenceStorage(PREFERENCES_STORAGE, MODULE_ID, createIfNotDound, readOnly);
ICStorageElement cfgEl = null; ICStorageElement cfgEl = null;
@ -2409,13 +2523,15 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return cache; return cache;
} }
public ICStorageElement getPreferenceStorage(String prefKey, String storageId, boolean createIfNotDound, boolean readOnly) throws CoreException{ public ICStorageElement getPreferenceStorage(String prefKey, String storageId, boolean createIfNotDound,
boolean readOnly) throws CoreException {
XmlStorage store = getPreferenceStore(prefKey, createIfNotDound, readOnly); XmlStorage store = getPreferenceStore(prefKey, createIfNotDound, readOnly);
return store.getStorage(storageId, createIfNotDound); return store.getStorage(storageId, createIfNotDound);
} }
private XmlStorage getPreferenceStore(String prefKey, boolean createIfNotDound, boolean readOnly) throws CoreException{ private XmlStorage getPreferenceStore(String prefKey, boolean createIfNotDound, boolean readOnly)
throws CoreException {
ICStorageElement el = createPreferenceStorage(prefKey, createIfNotDound, readOnly); ICStorageElement el = createPreferenceStorage(prefKey, createIfNotDound, readOnly);
XmlStorage store = new XmlStorage((InternalXmlStorageElement) el); XmlStorage store = new XmlStorage((InternalXmlStorageElement) el);
@ -2447,7 +2563,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return createDefaultConfigData(project, CDataUtil.genId(DEFAULT_CFG_ID_PREFIX), DEFAULT_CFG_NAME, factory); return createDefaultConfigData(project, CDataUtil.genId(DEFAULT_CFG_ID_PREFIX), DEFAULT_CFG_NAME, factory);
} }
public CConfigurationData createDefaultConfigData(IProject project, String id, String name, CDataFactory factory) throws CoreException{ public CConfigurationData createDefaultConfigData(IProject project, String id, String name, CDataFactory factory)
throws CoreException {
if (factory == null) if (factory == null)
factory = new CDataFactory(); factory = new CDataFactory();
@ -2533,7 +2650,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
// return CDataUtil.getExtensionsFromContentTypes(project, typeIds); // return CDataUtil.getExtensionsFromContentTypes(project, typeIds);
// } // }
static ICLanguageSetting getLanguageSettingForFile(ICConfigurationDescription cfgDes, IPath path, boolean ignoreExcludeStatus){ static ICLanguageSetting getLanguageSettingForFile(ICConfigurationDescription cfgDes, IPath path,
boolean ignoreExcludeStatus) {
int segCount = path.segmentCount(); int segCount = path.segmentCount();
if (segCount == 0) if (segCount == 0)
return null; return null;
@ -2548,7 +2666,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return ((ICFileDescription) rcDes).getLanguageSetting(); return ((ICFileDescription) rcDes).getLanguageSetting();
} }
static private HashMap<HashSet<String>, CLanguageData> createExtSetToLDataMap(IProject project, CLanguageData[] lDatas){ static private HashMap<HashSet<String>, CLanguageData> createExtSetToLDataMap(IProject project,
CLanguageData[] lDatas) {
HashMap<HashSet<String>, CLanguageData> map = new HashMap<HashSet<String>, CLanguageData>(); HashMap<HashSet<String>, CLanguageData> map = new HashMap<HashSet<String>, CLanguageData>();
for (CLanguageData lData : lDatas) { for (CLanguageData lData : lDatas) {
@ -2570,12 +2689,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
childRcData = (CResourceData) child.getValue(); childRcData = (CResourceData) child.getValue();
if (childRcData.getType() == ICSettingBase.SETTING_FOLDER) { if (childRcData.getType() == ICSettingBase.SETTING_FOLDER) {
CResourceData parentRcData = null; CResourceData parentRcData = null;
for(parent = child.getParentContainer(); for (parent = child.getParentContainer(); (parentRcData = (CResourceData) parent.getValue())
(parentRcData = (CResourceData)parent.getValue()).getType() != ICSettingBase.SETTING_FOLDER; .getType() != ICSettingBase.SETTING_FOLDER; parent = parent.getParentContainer()) {
parent = parent.getParentContainer()) {
// no body, this loop is to find the parent // no body, this loop is to find the parent
} }
if(!settingsCustomized(project, (CFolderData)parentRcData, (CFolderData)childRcData, parent.isRoot())){ if (!settingsCustomized(project, (CFolderData) parentRcData, (CFolderData) childRcData,
parent.isRoot())) {
try { try {
data.removeResourceData(childRcData); data.removeResourceData(childRcData);
child.remove(); child.remove();
@ -2601,7 +2720,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return modified; return modified;
} }
static private boolean settingsCustomized(IProject project, CFolderData parent, CFolderData child, boolean isParentRoot){ static private boolean settingsCustomized(IProject project, CFolderData parent, CFolderData child,
boolean isParentRoot) {
if (baseSettingsCustomized(parent, child)) if (baseSettingsCustomized(parent, child))
return true; return true;
@ -2679,7 +2799,6 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return false; return false;
} }
@Override @Override
public ICProjectDescriptionWorkspacePreferences getProjectDescriptionWorkspacePreferences( public ICProjectDescriptionWorkspacePreferences getProjectDescriptionWorkspacePreferences(
boolean write) { boolean write) {
@ -2760,7 +2879,8 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return new CProjectDescriptionWorkspacePreferences(el, null, true); return new CProjectDescriptionWorkspacePreferences(el, null, true);
} }
private ICStorageElement getCProjectDescriptionPreferencesElement(boolean createIfNotFound, boolean readOnly) throws CoreException{ private ICStorageElement getCProjectDescriptionPreferencesElement(boolean createIfNotFound, boolean readOnly)
throws CoreException {
ICStorageElement el = getPreferenceStorage(PREFERENCES_STORAGE, MODULE_ID, createIfNotFound, readOnly); ICStorageElement el = getPreferenceStorage(PREFERENCES_STORAGE, MODULE_ID, createIfNotFound, readOnly);
ICStorageElement[] children = el.getChildren(); ICStorageElement[] children = el.getChildren();
for (ICStorageElement child : children) { for (ICStorageElement child : children) {

View file

@ -856,5 +856,22 @@
ordering="first"> ordering="first">
</filterMatcher> </filterMatcher>
</extension> </extension>
<extension
point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="org.eclipse.cdt.core.settings.model.ICConfigurationDescription"
class="org.eclipse.cdt.internal.core.settings.model.CConfigurationAdapterFactory">
<adapter
type="org.eclipse.core.resources.IBuildConfiguration">
</adapter>
</factory>
<factory
adaptableType="org.eclipse.core.resources.IBuildConfiguration"
class="org.eclipse.cdt.internal.core.settings.model.BuildConfigAdapterFactory">
<adapter
type="org.eclipse.cdt.core.settings.model.ICConfigurationDescription">
</adapter>
</factory>
</extension>
</plugin> </plugin>

View file

@ -92,8 +92,8 @@ import org.osgi.framework.BundleContext;
import com.ibm.icu.text.MessageFormat; import com.ibm.icu.text.MessageFormat;
/** /**
* CCorePlugin is the life-cycle owner of the core plug-in, and starting point * CCorePlugin is the life-cycle owner of the core plug-in, and starting point for access to many
* for access to many core APIs. * core APIs.
* *
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients. * @noinstantiate This class is not intended to be instantiated by clients.
@ -103,8 +103,7 @@ public class CCorePlugin extends Plugin {
public static final int STATUS_CDTPROJECT_MISMATCH = 2; public static final int STATUS_CDTPROJECT_MISMATCH = 2;
public static final int CDT_PROJECT_NATURE_ID_MISMATCH = 3; public static final int CDT_PROJECT_NATURE_ID_MISMATCH = 3;
/** /**
* Status code for core exception that is thrown if a pdom grew larger than * Status code for core exception that is thrown if a pdom grew larger than the supported limit.
* the supported limit.
* *
* @since 5.2 * @since 5.2
*/ */
@ -276,8 +275,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the shared working copies currently registered for the default * Returns the shared working copies currently registered for the default buffer factory.
* buffer factory.
* *
* @since 5.1 * @since 5.1
*/ */
@ -382,25 +380,21 @@ public class CCorePlugin extends Plugin {
pdomManager = new PDOMManager(); pdomManager = new PDOMManager();
final Job post2 = pdomManager.startup(); final Job post2 = pdomManager.startup();
// bug 186755, when started after the platform has been started the job // bug 186755, when started after the platform has been started the job manager
// manager // is no longer suspended. So we have to start a job at the very end to make
// is no longer suspended. So we have to start a job at the very end to // sure we don't trigger a concurrent plug-in activation from within the job.
// make
// sure we don't trigger a concurrent plug-in activation from within the
// job.
post1.schedule(); post1.schedule();
post2.schedule(); post2.schedule();
} }
/** /**
* TODO: Add all options here Returns a table of all known configurable * TODO: Add all options here Returns a table of all known configurable options with their
* options with their default values. These options allow to configure the * default values. These options allow to configure the behavior of the underlying components.
* behavior of the underlying components. The client may safely use the * The client may safely use the result as a template that they can modify and then pass to
* result as a template that they can modify and then pass to
* <code>setOptions</code>. * <code>setOptions</code>.
* *
* Helper constants have been defined on CCorePlugin for each of the option * Helper constants have been defined on CCorePlugin for each of the option ID and their
* ID and their possible constant values. * possible constant values.
* *
* Note: more options might be added in further releases. * Note: more options might be added in further releases.
* *
@ -415,9 +409,8 @@ public class CCorePlugin extends Plugin {
* - default: <platform default> * - default: <platform default>
* </pre> * </pre>
* *
* @return a mutable map containing the default settings of all known * @return a mutable map containing the default settings of all known options (key type:
* options (key type: <code>String</code>; value type: * <code>String</code>; value type: <code>String</code>)
* <code>String</code>)
* @see #setOptions * @see #setOptions
*/ */
public static HashMap<String, String> getDefaultOptions() { public static HashMap<String, String> getDefaultOptions() {
@ -446,11 +439,10 @@ public class CCorePlugin extends Plugin {
/** /**
* Helper method for returning one option value only. Equivalent to * Helper method for returning one option value only. Equivalent to
* <code>(String)CCorePlugin.getOptions().get(optionName)</code> Note that * <code>(String)CCorePlugin.getOptions().get(optionName)</code> Note that it may answer
* it may answer <code>null</code> if this option does not exist. * <code>null</code> if this option does not exist.
* <p> * <p>
* For a complete description of the configurable options, see * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
* <code>getDefaultOptions</code>.
* </p> * </p>
* *
* @param optionName * @param optionName
@ -471,16 +463,14 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the table of the current options. Initially, all options have * Returns the table of the current options. Initially, all options have their default values,
* their default values, and this method returns a table that includes all * and this method returns a table that includes all known options.
* known options.
* <p> * <p>
* For a complete description of the configurable options, see * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
* <code>getDefaultOptions</code>.
* </p> * </p>
* *
* @return table of current settings of all options (key type: * @return table of current settings of all options (key type: <code>String</code>; value type:
* <code>String</code>; value type: <code>String</code>) * <code>String</code>)
* @see CCorePlugin#getDefaultOptions * @see CCorePlugin#getDefaultOptions
*/ */
public static HashMap<String, String> getOptions() { public static HashMap<String, String> getOptions() {
@ -512,18 +502,16 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Sets the current table of options. All and only the options explicitly * Sets the current table of options. All and only the options explicitly included in the given
* included in the given table are remembered; all previous option settings * table are remembered; all previous option settings are forgotten, including ones not
* are forgotten, including ones not explicitly mentioned. * explicitly mentioned.
* <p> * <p>
* For a complete description of the configurable options, see * For a complete description of the configurable options, see <code>getDefaultOptions</code>.
* <code>getDefaultOptions</code>.
* </p> * </p>
* *
* @param newOptions * @param newOptions
* the new options (key type: <code>String</code>; value type: * the new options (key type: <code>String</code>; value type: <code>String</code>),
* <code>String</code>), or <code>null</code> to reset all * or <code>null</code> to reset all options to their default values
* options to their default values
* @see CCorePlugin#getDefaultOptions * @see CCorePlugin#getDefaultOptions
*/ */
public static void setOptions(HashMap<String, String> newOptions) { public static void setOptions(HashMap<String, String> newOptions) {
@ -550,24 +538,22 @@ public class CCorePlugin extends Plugin {
/** /**
* Create CDT console adapter for build console defined as an extension. See * Create CDT console adapter for build console defined as an extension. See
* {@code org.eclipse.cdt.core.CBuildConsole} extension point. If the * {@code org.eclipse.cdt.core.CBuildConsole} extension point. If the console class is instance
* console class is instance of {@link ICConsole} it is initialized with * of {@link ICConsole} it is initialized with context id, name and icon to be shown in the list
* context id, name and icon to be shown in the list of consoles in the * of consoles in the Console view.
* Console view.
* *
* @param extConsoleId * @param extConsoleId
* - console id defined in the extension point. * - console id defined in the extension point.
* @param contextId * @param contextId
* - context menu id in the Console view. A caller needs to * - context menu id in the Console view. A caller needs to define a distinct one for
* define a distinct one for own use. * own use.
* @param name * @param name
* - name of console to appear in the list of consoles in context * - name of console to appear in the list of consoles in context menu in the Console
* menu in the Console view. * view.
* @param iconUrl * @param iconUrl
* - a {@link URL} of the icon for the context menu of the * - a {@link URL} of the icon for the context menu of the Console view. The url is
* Console view. The url is expected to point to an image in * expected to point to an image in eclipse OSGi bundle. Here is an example how to
* eclipse OSGi bundle. Here is an example how to retrieve URL: * retrieve URL: <br/>
* <br/>
* <code> * <code>
* URL iconUrl = CUIPlugin.getDefault().getBundle().getEntry("icons/obj16/flask.png"); * URL iconUrl = CUIPlugin.getDefault().getBundle().getEntry("icons/obj16/flask.png");
* </code> * </code>
@ -604,13 +590,11 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Create CDT console adapter. The adapter serves as a bridge between core * Create CDT console adapter. The adapter serves as a bridge between core plugin and UI console
* plugin and UI console API in a way that a user can create a UI console * API in a way that a user can create a UI console from plugins having no dependencies to UI.
* from plugins having no dependencies to UI.
* *
* @param id * @param id
* - id of the console specified in extension point to * - id of the console specified in extension point to instantiate console adapter.
* instantiate console adapter.
* @return CDT console adapter. * @return CDT console adapter.
*/ */
public IConsole getConsole(String id) { public IConsole getConsole(String id) {
@ -619,25 +603,23 @@ public class CCorePlugin extends Plugin {
/** /**
* Create CDT console adapter for build console. A new instance of class * Create CDT console adapter for build console. A new instance of class
* {@code org.eclipse.cdt.internal.ui.buildconsole.CBuildConsole} is created * {@code org.eclipse.cdt.internal.ui.buildconsole.CBuildConsole} is created and initialized
* and initialized with the parameters. * with the parameters.
* *
* @param contextId * @param contextId
* - context menu id in the Console view. A caller needs to * - context menu id in the Console view. A caller needs to define a distinct one for
* define a distinct one for own use. * own use.
* @param name * @param name
* - name of console to appear in the list of consoles in context * - name of console to appear in the list of consoles in context menu in the Console
* menu in the Console view. * view.
* @param iconUrl * @param iconUrl
* - a {@link URL} of the icon for the context menu of the * - a {@link URL} of the icon for the context menu of the Console view. The url is
* Console view. The url is expected to point to an image in * expected to point to an image in eclipse OSGi bundle. Here is an example how to
* eclipse OSGi bundle. Here is an example how to retrieve URL: * retrieve URL: <br/>
* <br/>
* <code> * <code>
* URL iconUrl = CUIPlugin.getDefault().getBundle().getResource("icons/obj16/flask.png"); * URL iconUrl = CUIPlugin.getDefault().getBundle().getResource("icons/obj16/flask.png");
* </code> <br/> * </code> <br/>
* {@code iconUrl} can be <b>null</b>, in that case the default * {@code iconUrl} can be <b>null</b>, in that case the default image is used. See
* image is used. See
* {@code org.eclipse.cdt.internal.ui.buildconsole.BuildConsole(IBuildConsoleManager, String, String, URL)} * {@code org.eclipse.cdt.internal.ui.buildconsole.BuildConsole(IBuildConsoleManager, String, String, URL)}
* *
* @return CDT console adapter. * @return CDT console adapter.
@ -657,8 +639,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* @deprecated Use {@link #getDefaultBinaryParserExtensions(IProject)} * @deprecated Use {@link #getDefaultBinaryParserExtensions(IProject)} instead.
* instead.
*/ */
@Deprecated @Deprecated
public ICExtensionReference[] getBinaryParserExtensions(IProject project) throws CoreException { public ICExtensionReference[] getBinaryParserExtensions(IProject project) throws CoreException {
@ -679,8 +660,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the binary parser extensions for the default settings * Returns the binary parser extensions for the default settings configuration.
* configuration.
* *
* @since 5.2 * @since 5.2
*/ */
@ -794,14 +774,14 @@ public class CCorePlugin extends Plugin {
* Please use {@link #getProjectDescription(IProject, boolean)} to fetch the * Please use {@link #getProjectDescription(IProject, boolean)} to fetch the
* ICProjectDescription for the project. And use * ICProjectDescription for the project. And use
* {@link ICProjectDescription#getConfigurations()} to get an array of * {@link ICProjectDescription#getConfigurations()} to get an array of
* ICConfigurationDescriptions, which have similar API to ICDescriptor, * ICConfigurationDescriptions, which have similar API to ICDescriptor, allowing you to store
* allowing you to store settings and configure extensions at the * settings and configure extensions at the Configuration level rather than at the project
* Configuration level rather than at the project level. * level.
* *
* @param project * @param project
* @param create * @param create
* @return ICDescriptor or <b>null</b> if <b>create</b> is <b>false</b> and * @return ICDescriptor or <b>null</b> if <b>create</b> is <b>false</b> and no .cdtproject file
* no .cdtproject file exists on disk. * exists on disk.
* @throws CoreException * @throws CoreException
* @deprecated * @deprecated
*/ */
@ -823,15 +803,13 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* @deprecated Settings should be set per ICConfigurationDescription rather * @deprecated Settings should be set per ICConfigurationDescription rather than global to the
* than global to the project. Please use * project. Please use {@link #getProjectDescription(IProject, boolean)} to fetch
* {@link #getProjectDescription(IProject, boolean)} to fetch
* the ICProjectDescription for the project. And use * the ICProjectDescription for the project. And use
* {@link ICProjectDescription#getConfigurations()} to get an * {@link ICProjectDescription#getConfigurations()} to get an array of
* array of ICConfigurationDescriptions, which have similar API * ICConfigurationDescriptions, which have similar API to ICDescriptor, allowing you
* to ICDescriptor, allowing you to store settings and configure * to store settings and configure extensions at the Configuration level rather than
* extensions at the Configuration level rather than at the * at the project level.
* project level.
*/ */
@Deprecated @Deprecated
public ICDescriptorManager getCDescriptorManager() { public ICDescriptorManager getCDescriptorManager() {
@ -954,9 +932,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Method convertProjectFromCtoCC converts a C Project to a C++ Project The * Method convertProjectFromCtoCC converts a C Project to a C++ Project The newProject MUST, not
* newProject MUST, not be null, already have a C Nature && must NOT already * be null, already have a C Nature && must NOT already have a C++ Nature
* have a C++ Nature
* *
* @param projectHandle * @param projectHandle
* @param monitor * @param monitor
@ -972,9 +949,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Method to convert a project to a C nature All checks should have been * Method to convert a project to a C nature All checks should have been done externally (as in
* done externally (as in the Conversion Wizards). This method blindly does * the Conversion Wizards). This method blindly does the conversion.
* the conversion.
*/ */
public void convertProjectToC(IProject projectHandle, IProgressMonitor monitor, String projectID) public void convertProjectToC(IProject projectHandle, IProgressMonitor monitor, String projectID)
throws CoreException { throws CoreException {
@ -1057,8 +1033,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* @deprecated since CDT 6.1. Use * @deprecated since CDT 6.1. Use {@link ErrorParserManager#getErrorParserAvailableIds()}
* {@link ErrorParserManager#getErrorParserAvailableIds()}
* instead * instead
* @return array of error parsers ids * @return array of error parsers ids
*/ */
@ -1070,8 +1045,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* @deprecated since CDT 6.1. Use * @deprecated since CDT 6.1. Use {@link ErrorParserManager#getErrorParserCopy(String)} instead
* {@link ErrorParserManager#getErrorParserCopy(String)} instead
* @param id * @param id
* - id of error parser * - id of error parser
* @return array of error parsers * @return array of error parsers
@ -1123,9 +1097,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Clears cached scanner info provider for the given project so that the * Clears cached scanner info provider for the given project so that the next call to
* next call to {@link #getScannerInfoProvider(IProject)} would return an up * {@link #getScannerInfoProvider(IProject)} would return an up to date scanner info provider.
* to date scanner info provider.
* *
* @noreference This method is not intended to be referenced by clients. * @noreference This method is not intended to be referenced by clients.
*/ */
@ -1141,8 +1114,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Find {@link IScannerInfoProvider} registered as extension via extension * Find {@link IScannerInfoProvider} registered as extension via extension point
* point org.eclipse.cdt.core.ScannerInfoProvider2. * org.eclipse.cdt.core.ScannerInfoProvider2.
*/ */
private IScannerInfoProvider getExtensionScannerInfoProvider2(IProject project) throws CoreException { private IScannerInfoProvider getExtensionScannerInfoProvider2(IProject project) throws CoreException {
IScannerInfoProvider provider = null; IScannerInfoProvider provider = null;
@ -1182,13 +1155,11 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the content type for a filename. The method respects project * Returns the content type for a filename. The method respects project specific content type
* specific content type definitions. The lookup prefers case- sensitive * definitions. The lookup prefers case- sensitive matches over the others.
* matches over the others.
* *
* @param project * @param project
* a project with possible project specific settings. Can be * a project with possible project specific settings. Can be <code>null</code>
* <code>null</code>
* @param filename * @param filename
* a filename to compute the content type for * a filename to compute the content type for
* @return the content type found or <code>null</code> * @return the content type found or <code>null</code>
@ -1218,8 +1189,7 @@ public class CCorePlugin extends Plugin {
private static final String DELTA = CCorePlugin.PLUGIN_ID + "/debug/deltaprocessor"; //$NON-NLS-1$ private static final String DELTA = CCorePlugin.PLUGIN_ID + "/debug/deltaprocessor"; //$NON-NLS-1$
/** /**
* Configure the plug-in with respect to option settings defined in * Configure the plug-in with respect to option settings defined in ".options" file
* ".options" file
*/ */
public void configurePluginDebugOptions() { public void configurePluginDebugOptions() {
if (CCorePlugin.getDefault().isDebugging()) { if (CCorePlugin.getDefault().isDebugging()) {
@ -1257,8 +1227,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* @deprecated use {@link ITranslationUnit} or {@link ILanguage} to * @deprecated use {@link ITranslationUnit} or {@link ILanguage} to construct ASTs, instead.
* construct ASTs, instead.
*/ */
@Deprecated @Deprecated
public org.eclipse.cdt.core.dom.CDOM getDOM() { public org.eclipse.cdt.core.dom.CDOM getDOM() {
@ -1288,8 +1257,7 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Equivalent to * Equivalent to <code>createProjectDescription(IProject, boolean, false)</code>.
* <code>createProjectDescription(IProject, boolean, false)</code>.
* *
* @see #createProjectDescription(IProject, boolean, boolean) * @see #createProjectDescription(IProject, boolean, boolean)
*/ */
@ -1304,23 +1272,19 @@ public class CCorePlugin extends Plugin {
* @param project * @param project
* project for which the project description is requested * project for which the project description is requested
* @param loadIfExists * @param loadIfExists
* if true the method first tries to load and return the project * if true the method first tries to load and return the project description from the
* description from the settings file (.cproject), if false, the * settings file (.cproject), if false, the stored settings are ignored and the new
* stored settings are ignored and the new (empty) project * (empty) project description is created
* description is created
* @param creating * @param creating
* if true the created project description will be contain the * if true the created project description will be contain the true
* true "isCdtProjectCreating" state. <br> * "isCdtProjectCreating" state. <br>
* NOTE: in case the project already contains the project * NOTE: in case the project already contains the project description AND its
* description AND its "isCdtProjectCreating" is false the * "isCdtProjectCreating" is false the resulting description will be created with the
* resulting description will be created with the false * false "isCdtProjectCreating" state.
* "isCdtProjectCreating" state.
* *
* <br> * <br>
* NOTE: changes made to the returned project description will * NOTE: changes made to the returned project description will not be applied until
* not be applied until the * the {@link #setProjectDescription(IProject, ICProjectDescription)} is called.
* {@link #setProjectDescription(IProject, ICProjectDescription)}
* is called.
* @return {@link ICProjectDescription} * @return {@link ICProjectDescription}
* @throws CoreException * @throws CoreException
*/ */
@ -1330,20 +1294,17 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the project description associated with this project or null if * Returns the project description associated with this project or null if the project does not
* the project does not contain the CDT data associated with it. * contain the CDT data associated with it.
* *
* This is a convenience method fully equivalent to * This is a convenience method fully equivalent to getProjectDescription(project, true) see
* getProjectDescription(project, true) see
* {@link #getProjectDescription(IProject, boolean)} for more detail. * {@link #getProjectDescription(IProject, boolean)} for more detail.
* *
* @param project * @param project
* @return a writable copy of the ICProjectDescription or null if the * @return a writable copy of the ICProjectDescription or null if the project does not contain
* project does not contain the CDT data associated with it. <br> * the CDT data associated with it. <br>
* Note: changes to the project description will not be * Note: changes to the project description will not be reflected/used by the core until
* reflected/used by the core until the * the {@link #setProjectDescription(IProject, ICProjectDescription)} is called.
* {@link #setProjectDescription(IProject, ICProjectDescription)} is
* called.
* *
* @see #getProjectDescription(IProject, boolean) * @see #getProjectDescription(IProject, boolean)
*/ */
@ -1352,8 +1313,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Called to save/apply the project description. The method should be called * Called to save/apply the project description. The method should be called to apply changes
* to apply changes made to the project description returned by the * made to the project description returned by the
* {@link #getProjectDescription(IProject, boolean)} or * {@link #getProjectDescription(IProject, boolean)} or
* {@link #createProjectDescription(IProject, boolean)} * {@link #createProjectDescription(IProject, boolean)}
* *
@ -1374,40 +1335,37 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the project description associated with this project or null if * Returns the project description associated with this project or null if the project does not
* the project does not contain the CDT data associated with it. * contain the CDT data associated with it.
* *
* @param project * @param project
* project for which the description is requested * project for which the description is requested
* @param write * @param write
* if true, the writable description copy is returned. If false * if true, the writable description copy is returned. If false the cached read-only
* the cached read-only description is returned. * description is returned.
* *
* <br> * <br>
* CDT core maintains the cached project description settings. If * CDT core maintains the cached project description settings. If only read access is
* only read access is needed to description, then the read-only * needed to description, then the read-only project description should be obtained.
* project description should be obtained. This description * This description always operates with cached data and thus it is better to use it
* always operates with cached data and thus it is better to use * for performance reasons. All set* calls to the read-only description result in the
* it for performance reasons. All set* calls to the read-only * {@link WriteAccessException}.
* description result in the {@link WriteAccessException}.
* *
* When the writable description is requested, the description * When the writable description is requested, the description copy is created.
* copy is created. Changes to this description will not be * Changes to this description will not be reflected/used by the core and the Build
* reflected/used by the core and the Build System until the * System until the {@link #setProjectDescription(IProject, ICProjectDescription)} is
* {@link #setProjectDescription(IProject, ICProjectDescription)} * called.
* is called.
* *
* Each getProjectDescription(project, true) returns a new copy * Each getProjectDescription(project, true) returns a new copy of the project
* of the project description. * description.
* *
* The writable description uses the cached data until the first * The writable description uses the cached data until the first set call after that
* set call after that the description communicates directly to * the description communicates directly to the Build System i.e. the implementer of
* the Build System i.e. the implementer of the * the org.eclipse.cdt.core.CConfigurationDataProvider extension This ensures the
* org.eclipse.cdt.core.CConfigurationDataProvider extension This * Core<->Build System settings integrity.
* ensures the Core<->Build System settings integrity.
* *
* @return {@link ICProjectDescription} or null if the project does not * @return {@link ICProjectDescription} or null if the project does not contain the CDT data
* contain the CDT data associated with it. * associated with it.
*/ */
public ICProjectDescription getProjectDescription(IProject project, boolean write) { public ICProjectDescription getProjectDescription(IProject project, boolean write) {
return fNewCProjectDescriptionManager.getProjectDescription(project, write); return fNewCProjectDescriptionManager.getProjectDescription(project, write);
@ -1417,8 +1375,7 @@ public class CCorePlugin extends Plugin {
* Forces the cached data of the specified projects to be re-calculated. * Forces the cached data of the specified projects to be re-calculated.
* *
* @param projects * @param projects
* if <code>null</code>, all projects within the workspace are * if <code>null</code>, all projects within the workspace are updated
* updated
* @param monitor * @param monitor
* @throws CoreException * @throws CoreException
*/ */
@ -1457,8 +1414,7 @@ public class CCorePlugin extends Plugin {
// NON-API // NON-API
/** /**
* @noreference This constructor is not intended to be referenced by * @noreference This constructor is not intended to be referenced by clients.
* clients.
*/ */
public CCorePlugin() { public CCorePlugin() {
super(); super();
@ -1476,9 +1432,8 @@ public class CCorePlugin extends Plugin {
* Prints a message in the log * Prints a message in the log
* *
* @param severity * @param severity
* - desired severity of the message in the log, one of * - desired severity of the message in the log, one of {@link IStatus#INFO},
* {@link IStatus#INFO}, {@link IStatus#WARNING} or * {@link IStatus#WARNING} or {@link IStatus#ERROR}
* {@link IStatus#ERROR}
* @param msg * @param msg
* - message * - message
* *
@ -1493,9 +1448,8 @@ public class CCorePlugin extends Plugin {
* Prints a message in the log accompanied by stack trace * Prints a message in the log accompanied by stack trace
* *
* @param severity * @param severity
* - desired severity of the message in the log, one of * - desired severity of the message in the log, one of {@link IStatus#INFO},
* {@link IStatus#INFO}, {@link IStatus#WARNING} or * {@link IStatus#WARNING} or {@link IStatus#ERROR}
* {@link IStatus#ERROR}
* @param msg * @param msg
* - message * - message
* *
@ -1561,9 +1515,8 @@ public class CCorePlugin extends Plugin {
} }
/** /**
* Returns the preference controlling whether source roots are shown at the * Returns the preference controlling whether source roots are shown at the top of projects or
* top of projects or embedded within the resource tree of projects when * embedded within the resource tree of projects when they are not top level folders.
* they are not top level folders.
* *
* @return boolean preference value * @return boolean preference value
* @since 5.2 * @since 5.2

View file

@ -79,287 +79,4 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.7 org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=110
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

View file

@ -1,5 +1,4 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
formatter_profile=_CDT
formatter_settings_version=12 formatter_settings_version=12
org.eclipse.jdt.ui.ignorelowercasenames=true org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;org.eclipse.cdt;org.eclipse.cdt.internal;org.eclipse.cdt.internal.ui; org.eclipse.jdt.ui.importorder=java;javax;org;com;org.eclipse.cdt;org.eclipse.cdt.internal;org.eclipse.cdt.internal.ui;

View file

@ -21,10 +21,12 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
@ -69,8 +71,7 @@ import org.eclipse.cdt.internal.ui.newui.Messages;
import org.eclipse.cdt.internal.ui.newui.StatusMessageLine; import org.eclipse.cdt.internal.ui.newui.StatusMessageLine;
/** /**
* This tab presents language settings entries categorized by language * This tab presents language settings entries categorized by language settings providers.
* settings providers.
* *
* @noinstantiate This class is not intended to be instantiated by clients. * @noinstantiate This class is not intended to be instantiated by clients.
* @noextend This class is not intended to be subclassed by clients. * @noextend This class is not intended to be subclassed by clients.
@ -133,17 +134,23 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
if (entriesParent != null) { if (entriesParent != null) {
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_PARENT; overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_PARENT;
} }
} else if (provider instanceof ILanguageSettingsBroadcastingProvider && (page.isForFile() || page.isForFolder())) { } else if (provider instanceof ILanguageSettingsBroadcastingProvider
&& (page.isForFile() || page.isForFolder())) {
// Assuming that the default entries for a resource are always null. // Assuming that the default entries for a resource are always null.
// Using that for performance reasons. See note in performDefaults(). // Using that for performance reasons. See note in performDefaults().
List<ICLanguageSettingEntry> entriesParent = provider.getSettingEntries(null, null, currentLanguageId); List<ICLanguageSettingEntry> entriesParent = provider
.getSettingEntries((ICConfigurationDescription) null, null, currentLanguageId);
if (entriesParent == null) {
entriesParent = provider.getSettingEntries((IBuildConfiguration) null, null, currentLanguageId);
}
if (entries != null && !entries.equals(entriesParent)) { if (entries != null && !entries.equals(entriesParent)) {
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING;
} }
} }
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
List<ILanguageSettingsProvider> initialProviders = initialProvidersMap.get(cfgDescription.getId()); List<ILanguageSettingsProvider> initialProviders = initialProvidersMap
.get(cfgDescription.getId());
if (initialProviders != null && !initialProviders.contains(provider)) { if (initialProviders != null && !initialProviders.contains(provider)) {
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED;
} }
@ -302,19 +309,28 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
*/ */
private List<ICLanguageSettingEntry> getSettingEntriesUpResourceTree(ILanguageSettingsProvider provider) { private List<ICLanguageSettingEntry> getSettingEntriesUpResourceTree(ILanguageSettingsProvider provider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
IResource rc = getResource(); IResource rc = getResource();
List<ICLanguageSettingEntry> entries = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider, cfgDescription, rc, currentLanguageId); List<ICLanguageSettingEntry> entries = LanguageSettingsManager
.getSettingEntriesUpResourceTree(provider, config, rc, currentLanguageId);
return entries; return entries;
} }
/** /**
* Shortcut for getting setting entries for current context without checking the parent resource. * Shortcut for getting setting entries for current context without checking the parent
* resource.
*
* @return list of setting entries for the current context. * @return list of setting entries for the current context.
*/ */
private List<ICLanguageSettingEntry> getSettingEntries(ILanguageSettingsProvider provider) { private List<ICLanguageSettingEntry> getSettingEntries(ILanguageSettingsProvider provider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription();
IResource rc = getResource(); IResource rc = getResource();
return provider.getSettingEntries(cfgDescription, rc, currentLanguageId); ICConfigurationDescription cfgDescription = getConfigurationDescription();
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(cfgDescription, rc, currentLanguageId);
if (entries == null) {
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
entries = provider.getSettingEntries(config, rc, currentLanguageId);
}
return entries;
} }
/** /**
@ -326,7 +342,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
for (ICConfigurationDescription cfgDescription : cfgDescriptions) { for (ICConfigurationDescription cfgDescription : cfgDescriptions) {
if (cfgDescription instanceof ILanguageSettingsProvidersKeeper) { if (cfgDescription instanceof ILanguageSettingsProvidersKeeper) {
String cfgId = cfgDescription.getId(); String cfgId = cfgDescription.getId();
List<ILanguageSettingsProvider> initialProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> initialProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
initialProvidersMap.put(cfgId, initialProviders); initialProvidersMap.put(cfgId, initialProviders);
} }
} }
@ -443,7 +460,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
* Create check-box to control whether to show built-in entries or not. * Create check-box to control whether to show built-in entries or not.
*/ */
private void createBuiltInsCheckBox() { private void createBuiltInsCheckBox() {
builtInCheckBox = setupCheck(usercomp, Messages.AbstractLangsListTab_ShowBuiltin, 1, GridData.FILL_HORIZONTAL); builtInCheckBox = setupCheck(usercomp, Messages.AbstractLangsListTab_ShowBuiltin, 1,
GridData.FILL_HORIZONTAL);
builtInCheckBox.addSelectionListener(new SelectionAdapter() { builtInCheckBox.addSelectionListener(new SelectionAdapter() {
@Override @Override
public void widgetSelected(SelectionEvent e) { public void widgetSelected(SelectionEvent e) {
@ -594,12 +612,14 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
boolean isAllowedEditing = provider instanceof ILanguageSettingsEditableProvider boolean isAllowedEditing = provider instanceof ILanguageSettingsEditableProvider
&& LanguageSettingsProviderAssociationManager.isAllowedToEditEntries(provider); && LanguageSettingsProviderAssociationManager.isAllowedToEditEntries(provider);
if (provider != null && !isAllowedEditing) { if (provider != null && !isAllowedEditing) {
status = new Status(IStatus.INFO, CUIPlugin.PLUGIN_ID, Messages.LanguageSettingsEntriesTab_Entries_Not_Editable); status = new Status(IStatus.INFO, CUIPlugin.PLUGIN_ID,
Messages.LanguageSettingsEntriesTab_Entries_Not_Editable);
} }
} }
if (status == null || status == Status.OK_STATUS) { if (status == null || status == Status.OK_STATUS) {
if (treeLanguages.getItemCount() <= 0) { if (treeLanguages.getItemCount() <= 0) {
status = new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, Messages.LanguageSettingsEntriesTab_Cannot_Determine_Languages); status = new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID,
Messages.LanguageSettingsEntriesTab_Cannot_Determine_Languages);
} }
} }
fStatusLine.setErrorStatus(status); fStatusLine.setErrorStatus(status);
@ -638,9 +658,9 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
} }
/** /**
* That method returns exact position of an element in the list. * That method returns exact position of an element in the list. Note that
* Note that {@link List#indexOf(Object)} returns position of the first element * {@link List#indexOf(Object)} returns position of the first element equals to the given one,
* equals to the given one, not exact element. * not exact element.
* *
* @param entries * @param entries
* @param entry * @param entry
@ -737,27 +757,34 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
private void saveEntries(ILanguageSettingsProvider provider, List<ICLanguageSettingEntry> entries) { private void saveEntries(ILanguageSettingsProvider provider, List<ICLanguageSettingEntry> entries) {
if (provider instanceof ILanguageSettingsEditableProvider) { if (provider instanceof ILanguageSettingsEditableProvider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
IResource rc = getResource(); IResource rc = getResource();
if (entries != null && rc != null) { if (entries != null && rc != null) {
IContainer parent = rc instanceof IProject ? null : rc.getParent(); IContainer parent = rc instanceof IProject ? null : rc.getParent();
List<ICLanguageSettingEntry> parentEntries = LanguageSettingsManager.getSettingEntriesUpResourceTree(provider, cfgDescription, parent, currentLanguageId); List<ICLanguageSettingEntry> parentEntries = LanguageSettingsManager
.getSettingEntriesUpResourceTree(provider, config, parent, currentLanguageId);
if (entries.equals(parentEntries)) { if (entries.equals(parentEntries)) {
// to use parent entries instead // to use parent entries instead
entries = null; entries = null;
} }
} }
((ILanguageSettingsEditableProvider)provider).setSettingEntries(cfgDescription, rc, currentLanguageId, entries); ((ILanguageSettingsEditableProvider) provider).setSettingEntries(config, rc, currentLanguageId,
entries);
} }
} }
/** /**
* Get list of setting entries shown to user. If current resource has no entries assigned the parent * Get list of setting entries shown to user. If current resource has no entries assigned the
* resource is inspected. * parent resource is inspected.
*/ */
private List<ICLanguageSettingEntry> getEntriesShownToUser(ILanguageSettingsProvider provider) { private List<ICLanguageSettingEntry> getEntriesShownToUser(ILanguageSettingsProvider provider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription();
IResource rc = getResource(); IResource rc = getResource();
ICConfigurationDescription cfgDescription = getConfigurationDescription();
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(cfgDescription, rc, currentLanguageId); List<ICLanguageSettingEntry> entries = provider.getSettingEntries(cfgDescription, rc, currentLanguageId);
if (entries == null) {
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
entries = provider.getSettingEntries(config, rc, currentLanguageId);
}
if (entries == null) { if (entries == null) {
entries = getSettingEntriesUpResourceTree(provider); entries = getSettingEntriesUpResourceTree(provider);
} }
@ -772,7 +799,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
if (selectedProvider instanceof ILanguageSettingsEditableProvider) { if (selectedProvider instanceof ILanguageSettingsEditableProvider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
ICLanguageSettingEntry selectedEntry = getSelectedEntry(); ICLanguageSettingEntry selectedEntry = getSelectedEntry();
LanguageSettingEntryDialog addDialog = new LanguageSettingEntryDialog(usercomp.getShell(), cfgDescription, selectedEntry, true); LanguageSettingEntryDialog addDialog = new LanguageSettingEntryDialog(usercomp.getShell(),
cfgDescription, selectedEntry, true);
if (addDialog.open()) { if (addDialog.open()) {
ICLanguageSettingEntry settingEntry = addDialog.getEntries()[0]; ICLanguageSettingEntry settingEntry = addDialog.getEntries()[0];
if (settingEntry != null) { if (settingEntry != null) {
@ -784,20 +812,22 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
} }
/** /**
* Return working copy of the provider to edit in current session. If the supplied provider is already * Return working copy of the provider to edit in current session. If the supplied provider is
* the working copy return it. If not, create a copy to be edited. * already the working copy return it. If not, create a copy to be edited.
*/ */
private ILanguageSettingsEditableProvider getWorkingCopy(ILanguageSettingsEditableProvider provider) { private ILanguageSettingsEditableProvider getWorkingCopy(ILanguageSettingsEditableProvider provider) {
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
List<ILanguageSettingsProvider> initialProviders = initialProvidersMap.get(cfgDescription.getId()); List<ILanguageSettingsProvider> initialProviders = initialProvidersMap.get(cfgDescription.getId());
if (initialProviders.contains(provider)) { if (initialProviders.contains(provider)) {
List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders()); List<ILanguageSettingsProvider> providers = new ArrayList<ILanguageSettingsProvider>(
((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders());
int pos = providers.indexOf(provider); int pos = providers.indexOf(provider);
if (pos >= 0) { if (pos >= 0) {
try { try {
provider = provider.clone(); provider = provider.clone();
providers.set(pos, provider); providers.set(pos, provider);
((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(providers); ((ILanguageSettingsProvidersKeeper) cfgDescription)
.setLanguageSettingProviders(providers);
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
CUIPlugin.log("Internal Error: cannot clone provider " + provider.getId(), e); //$NON-NLS-1$ CUIPlugin.log("Internal Error: cannot clone provider " + provider.getId(), e); //$NON-NLS-1$
} }
@ -811,10 +841,12 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Call dialog to edit settings entry. * Call dialog to edit settings entry.
*/ */
private void performEdit(ILanguageSettingsProvider selectedProvider, ICLanguageSettingEntry selectedEntry) { private void performEdit(ILanguageSettingsProvider selectedProvider,
ICLanguageSettingEntry selectedEntry) {
if (selectedProvider instanceof ILanguageSettingsEditableProvider && selectedEntry != null) { if (selectedProvider instanceof ILanguageSettingsEditableProvider && selectedEntry != null) {
ICConfigurationDescription cfgDecsription = getConfigurationDescription(); ICConfigurationDescription cfgDecsription = getConfigurationDescription();
LanguageSettingEntryDialog editDialog = new LanguageSettingEntryDialog(usercomp.getShell(), cfgDecsription, selectedEntry); LanguageSettingEntryDialog editDialog = new LanguageSettingEntryDialog(usercomp.getShell(),
cfgDecsription, selectedEntry);
if (editDialog.open()) { if (editDialog.open()) {
ICLanguageSettingEntry newEntry = editDialog.getEntries()[0]; ICLanguageSettingEntry newEntry = editDialog.getEntries()[0];
if (newEntry != null) { if (newEntry != null) {
@ -850,7 +882,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Replace provider's entry and update UI. * Replace provider's entry and update UI.
*/ */
private void replaceEntry(ILanguageSettingsProvider provider, ICLanguageSettingEntry oldEntry, ICLanguageSettingEntry newEntry) { private void replaceEntry(ILanguageSettingsProvider provider, ICLanguageSettingEntry oldEntry,
ICLanguageSettingEntry newEntry) {
if (provider != null && oldEntry != null && newEntry != null) { if (provider != null && oldEntry != null && newEntry != null) {
String providerId = provider.getId(); String providerId = provider.getId();
@ -878,7 +911,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Clear provider's entries for the given resource or remove one entry depending on selection. * Clear provider's entries for the given resource or remove one entry depending on selection.
*/ */
private void performDelete(ILanguageSettingsProvider selectedProvider, ICLanguageSettingEntry selectedEntry) { private void performDelete(ILanguageSettingsProvider selectedProvider,
ICLanguageSettingEntry selectedEntry) {
if (selectedProvider instanceof ILanguageSettingsEditableProvider) { if (selectedProvider instanceof ILanguageSettingsEditableProvider) {
selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider); selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider);
if (selectedEntry != null) { if (selectedEntry != null) {
@ -892,7 +926,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Change "Export" flag of provider's entry and update UI. * Change "Export" flag of provider's entry and update UI.
*/ */
private void exportEntry(ILanguageSettingsProvider provider, ICLanguageSettingEntry entry, boolean isExport) { private void exportEntry(ILanguageSettingsProvider provider, ICLanguageSettingEntry entry,
boolean isExport) {
if (provider instanceof ILanguageSettingsEditableProvider && entry != null) { if (provider instanceof ILanguageSettingsEditableProvider && entry != null) {
int flags = entry.getFlags(); int flags = entry.getFlags();
if (isExport) { if (isExport) {
@ -936,7 +971,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Export or un-export provider's entry or entries. * Export or un-export provider's entry or entries.
*/ */
private void performExport(ILanguageSettingsProvider selectedProvider, ICLanguageSettingEntry selectedEntry) { private void performExport(ILanguageSettingsProvider selectedProvider,
ICLanguageSettingEntry selectedEntry) {
if (selectedProvider instanceof ILanguageSettingsEditableProvider) { if (selectedProvider instanceof ILanguageSettingsEditableProvider) {
boolean isExport = isExportMode(selectedProvider, selectedEntry); boolean isExport = isExportMode(selectedProvider, selectedEntry);
if (selectedEntry != null) { if (selectedEntry != null) {
@ -967,7 +1003,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Move provider's entry up. * Move provider's entry up.
*/ */
private void performMoveUp(ILanguageSettingsProvider selectedProvider, ICLanguageSettingEntry selectedEntry) { private void performMoveUp(ILanguageSettingsProvider selectedProvider,
ICLanguageSettingEntry selectedEntry) {
if (selectedEntry != null && (selectedProvider instanceof ILanguageSettingsEditableProvider)) { if (selectedEntry != null && (selectedProvider instanceof ILanguageSettingsEditableProvider)) {
selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider); selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider);
moveEntry(selectedProvider, selectedEntry, true); moveEntry(selectedProvider, selectedEntry, true);
@ -977,7 +1014,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Move provider's entry down. * Move provider's entry down.
*/ */
private void performMoveDown(ILanguageSettingsProvider selectedProvider, ICLanguageSettingEntry selectedEntry) { private void performMoveDown(ILanguageSettingsProvider selectedProvider,
ICLanguageSettingEntry selectedEntry) {
if (selectedEntry != null && (selectedProvider instanceof ILanguageSettingsEditableProvider)) { if (selectedEntry != null && (selectedProvider instanceof ILanguageSettingsEditableProvider)) {
selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider); selectedProvider = getWorkingCopy((ILanguageSettingsEditableProvider) selectedProvider);
moveEntry(selectedProvider, selectedEntry, false); moveEntry(selectedProvider, selectedEntry, false);
@ -992,12 +1030,14 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
IResource rc = getResource(); IResource rc = getResource();
ICConfigurationDescription cfgDescription = getConfigurationDescription(); ICConfigurationDescription cfgDescription = getConfigurationDescription();
if (rc != null && cfgDescription instanceof ILanguageSettingsProvidersKeeper) { if (rc != null && cfgDescription instanceof ILanguageSettingsProvidersKeeper) {
List<ILanguageSettingsProvider> cfgProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> cfgProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders();
for (ILanguageSettingsProvider cfgProvider : cfgProviders) { for (ILanguageSettingsProvider cfgProvider : cfgProviders) {
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(cfgProvider); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(cfgProvider);
if (rawProvider instanceof LanguageSettingsBaseProvider) { if (rawProvider instanceof LanguageSettingsBaseProvider) {
// filter out providers incapable of providing entries for this language // filter out providers incapable of providing entries for this language
List<String> languageIds = ((LanguageSettingsBaseProvider)rawProvider).getLanguageScope(); List<String> languageIds = ((LanguageSettingsBaseProvider) rawProvider)
.getLanguageScope();
if (languageIds != null && !languageIds.contains(currentLanguageId)) { if (languageIds != null && !languageIds.contains(currentLanguageId)) {
continue; continue;
} }
@ -1011,9 +1051,11 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
/** /**
* Re-reads and refreshes the entries tree. * Re-reads and refreshes the entries tree.
* *
* @param selectedProviderId - provider of the entry to select after update. * @param selectedProviderId
* If the entry is {@code null} the provider itself will be selected. * - provider of the entry to select after update. If the entry is {@code null} the
* @param selectedEntry - entry to select in the tree after update. * provider itself will be selected.
* @param selectedEntry
* - entry to select in the tree after update.
*/ */
private void updateTreeForEntries(String selectedProviderId, ICLanguageSettingEntry selectedEntry) { private void updateTreeForEntries(String selectedProviderId, ICLanguageSettingEntry selectedEntry) {
Object[] expandedElements = treeEntriesViewer.getExpandedElements(); Object[] expandedElements = treeEntriesViewer.getExpandedElements();
@ -1031,7 +1073,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
if (provider.getId().equals(selectedProviderId)) { if (provider.getId().equals(selectedProviderId)) {
for (int i = 0; i < expandedElements.length; i++) { for (int i = 0; i < expandedElements.length; i++) {
if (expandedElements[i] instanceof ILanguageSettingsProvider) { if (expandedElements[i] instanceof ILanguageSettingsProvider) {
if (((ILanguageSettingsProvider) expandedElements[i]).getId().equals(selectedProviderId)) { if (((ILanguageSettingsProvider) expandedElements[i]).getId()
.equals(selectedProviderId)) {
expandedElements[i] = provider; expandedElements[i] = provider;
break; break;
} }
@ -1062,7 +1105,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
// remove null language when some real ones are defined // remove null language when some real ones are defined
languageIds.remove(null); languageIds.remove(null);
} else if (languageIds.isEmpty()) { } else if (languageIds.isEmpty()) {
// if no languages are defined keep null language as "Unspecified language" // if no languages are defined keep null language as "Unspecified
// language"
languageIds.add(null); languageIds.add(null);
} }
@ -1072,7 +1116,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
for (String langId : languageIds) { for (String langId : languageIds) {
ILanguage language = LanguageManager.getInstance().getLanguage(langId); ILanguage language = LanguageManager.getInstance().getLanguage(langId);
String langName = language != null ? language.getName() : Messages.LanguageSettingsEntriesTab_UnspecifiedLanguage; String langName = language != null ? language.getName()
: Messages.LanguageSettingsEntriesTab_UnspecifiedLanguage;
if (langName == null || langName.length() == 0) if (langName == null || langName.length() == 0)
continue; continue;
List<String> langIds = map.get(langName); List<String> langIds = map.get(langName);
@ -1170,26 +1215,33 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
return; return;
} }
IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
boolean changed = false; boolean changed = false;
IResource rc = getResource(); IResource rc = getResource();
List<ILanguageSettingsProvider> oldProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); List<ILanguageSettingsProvider> oldProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription)
List<ILanguageSettingsProvider> newProviders = new ArrayList<ILanguageSettingsProvider>(oldProviders.size()); .getLanguageSettingProviders();
List<ILanguageSettingsProvider> newProviders = new ArrayList<ILanguageSettingsProvider>(
oldProviders.size());
// clear entries for a given resource for all languages where applicable // clear entries for a given resource for all languages where
// applicable
providers: for (ILanguageSettingsProvider provider : oldProviders) { providers: for (ILanguageSettingsProvider provider : oldProviders) {
ILanguageSettingsEditableProvider providerCopy = null; ILanguageSettingsEditableProvider providerCopy = null;
if (provider instanceof ILanguageSettingsEditableProvider) { if (provider instanceof ILanguageSettingsEditableProvider) {
for (TreeItem langItems : treeLanguages.getItems()) { for (TreeItem langItems : treeLanguages.getItems()) {
String langId = (String) langItems.getData(); String langId = (String) langItems.getData();
if (provider.getSettingEntries(cfgDescription, rc, langId) != null) { if (provider.getSettingEntries(cfgDescription, rc, langId) != null
|| provider.getSettingEntries(config, rc, langId) != null) {
if (providerCopy == null) { if (providerCopy == null) {
// copy providers to be able to "Cancel" in UI // copy providers to be able to "Cancel" in UI
providerCopy = LanguageSettingsManager.getProviderCopy((ILanguageSettingsEditableProvider) provider, true); providerCopy = LanguageSettingsManager
.getProviderCopy((ILanguageSettingsEditableProvider) provider, true);
if (providerCopy == null) { if (providerCopy == null) {
continue providers; continue providers;
} }
} }
providerCopy.setSettingEntries(cfgDescription, rc, langId, null); providerCopy.setSettingEntries(config, rc, langId, null);
changed = true; changed = true;
} }
} }
@ -1208,12 +1260,15 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
} }
@Override @Override
protected void performApply(ICResourceDescription srcRcDescription, ICResourceDescription destRcDescription) { protected void performApply(ICResourceDescription srcRcDescription,
ICResourceDescription destRcDescription) {
if (!page.isForPrefs()) { if (!page.isForPrefs()) {
ICConfigurationDescription sd = srcRcDescription.getConfiguration(); ICConfigurationDescription sd = srcRcDescription.getConfiguration();
ICConfigurationDescription dd = destRcDescription.getConfiguration(); ICConfigurationDescription dd = destRcDescription.getConfiguration();
if (sd instanceof ILanguageSettingsProvidersKeeper && dd instanceof ILanguageSettingsProvidersKeeper) { if (sd instanceof ILanguageSettingsProvidersKeeper
List<ILanguageSettingsProvider> newProviders = ((ILanguageSettingsProvidersKeeper) sd).getLanguageSettingProviders(); && dd instanceof ILanguageSettingsProvidersKeeper) {
List<ILanguageSettingsProvider> newProviders = ((ILanguageSettingsProvidersKeeper) sd)
.getLanguageSettingProviders();
((ILanguageSettingsProvidersKeeper) dd).setLanguageSettingProviders(newProviders); ((ILanguageSettingsProvidersKeeper) dd).setLanguageSettingProviders(newProviders);
} }
} }
@ -1245,7 +1300,8 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab {
IResource rc = getResource(); IResource rc = getResource();
if (rc instanceof IFile) { if (rc instanceof IFile) {
try { try {
ILanguage language = LanguageManager.getInstance().getLanguageForFile((IFile)rc, null); ILanguage language = LanguageManager.getInstance().getLanguageForFile((IFile) rc,
null);
return language != null; return language != null;
} catch (CoreException e) { } catch (CoreException e) {
// who cares, not even logging // who cares, not even logging

View file

@ -12,10 +12,12 @@ package org.eclipse.cdt.internal.ui.viewsupport;
import java.util.List; import java.util.List;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.jface.viewers.ILightweightLabelDecorator;
@ -34,15 +36,18 @@ import org.eclipse.cdt.core.settings.model.ICResourceDescription;
import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.internal.ui.CPluginImages;
/** /**
* Determines if a file or folder got customized build settings and if so decorates with the "wrench" overlay. * Determines if a file or folder got customized build settings and if so decorates with the
* "wrench" overlay.
*/ */
public class CustomBuildSettingsDecorator implements ILightweightLabelDecorator { public class CustomBuildSettingsDecorator implements ILightweightLabelDecorator {
@Override @Override
public void decorate(Object element, IDecoration decoration) { public void decorate(Object element, IDecoration decoration) {
if (element instanceof IFile || element instanceof IFolder) { if (element instanceof IFile || element instanceof IFolder) {
IResource rc = (IResource) element; IResource rc = (IResource) element;
ICProjectDescriptionManager projectDescriptionManager = CoreModel.getDefault().getProjectDescriptionManager(); ICProjectDescriptionManager projectDescriptionManager = CoreModel.getDefault()
ICProjectDescription prjDescription = projectDescriptionManager.getProjectDescription(rc.getProject(), ICProjectDescriptionManager.GET_IF_LOADDED); .getProjectDescriptionManager();
ICProjectDescription prjDescription = projectDescriptionManager
.getProjectDescription(rc.getProject(), ICProjectDescriptionManager.GET_IF_LOADDED);
if (prjDescription != null) { if (prjDescription != null) {
ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration();
if (cfgDescription != null) { if (cfgDescription != null) {
@ -54,14 +59,23 @@ public class CustomBuildSettingsDecorator implements ILightweightLabelDecorator
} }
private static boolean isCustomizedResource(ICConfigurationDescription cfgDescription, IResource rc) { private static boolean isCustomizedResource(ICConfigurationDescription cfgDescription, IResource rc) {
if (ScannerDiscoveryLegacySupport.isLanguageSettingsProvidersFunctionalityEnabled(rc.getProject()) && cfgDescription instanceof ILanguageSettingsProvidersKeeper) { IBuildConfiguration config = Adapters.adapt(cfgDescription, IBuildConfiguration.class);
if (config != null
&& ScannerDiscoveryLegacySupport
.isLanguageSettingsProvidersFunctionalityEnabled(rc.getProject())
&& cfgDescription instanceof ILanguageSettingsProvidersKeeper) {
IContainer parent = rc.getParent(); IContainer parent = rc.getParent();
List<String> languages = LanguageSettingsManager.getLanguages(rc, cfgDescription); List<String> languages = LanguageSettingsManager.getLanguages(rc, cfgDescription);
for (ILanguageSettingsProvider provider: ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders()) { for (ILanguageSettingsProvider provider : ((ILanguageSettingsProvidersKeeper) cfgDescription)
.getLanguageSettingProviders()) {
for (String languageId : languages) { for (String languageId : languages) {
List<ICLanguageSettingEntry> list = provider.getSettingEntries(cfgDescription, rc, languageId); List<ICLanguageSettingEntry> list = provider.getSettingEntries(cfgDescription, rc, languageId);
if (list == null) {
list = provider.getSettingEntries(config, rc, languageId);
}
if (list != null) { if (list != null) {
List<ICLanguageSettingEntry> listDefault = provider.getSettingEntries(cfgDescription, parent, languageId); List<ICLanguageSettingEntry> listDefault = provider.getSettingEntries(config, parent,
languageId);
// != is OK here due as the equal lists will have the same reference in WeakHashSet // != is OK here due as the equal lists will have the same reference in WeakHashSet
if (list != listDefault) if (list != listDefault)
return true; return true;
@ -70,7 +84,8 @@ public class CustomBuildSettingsDecorator implements ILightweightLabelDecorator
} }
} }
ICResourceDescription rcDescription = cfgDescription.getResourceDescription(rc.getProjectRelativePath(), true); ICResourceDescription rcDescription = cfgDescription
.getResourceDescription(rc.getProjectRelativePath(), true);
return rcDescription != null; return rcDescription != null;
} }

View file

@ -18,24 +18,25 @@ import java.util.List;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider;
import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.utils.spawner.ProcessFactory; import org.eclipse.cdt.utils.spawner.ProcessFactory;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
/** /**
* Discovers and persists the list of Qt include paths for a particular installation of * Discovers and persists the list of Qt include paths for a particular
* Qt. The Qt installation is described by the path to qmake. * installation of Qt. The Qt installation is described by the path to qmake.
* <p> * <p>
* Qt uses a tool called qmake to generate makefiles for Qt projects. The tool has a * Qt uses a tool called qmake to generate makefiles for Qt projects. The tool
* query mode that can be used to discover information about the Qt installation. Here * has a query mode that can be used to discover information about the Qt
* qmake is used to build a list of all installed Qt include paths. * installation. Here qmake is used to build a list of all installed Qt include
* paths.
* <p> * <p>
* These paths are persisted into a file called language-settings.xml in the workspace * These paths are persisted into a file called language-settings.xml in the
* metadata area. * workspace metadata area.
* *
* @see QtIncludePathsProvider * @see QtIncludePathsProvider
*/ */
@ -52,34 +53,34 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
private long qmakeModTime; private long qmakeModTime;
/** /**
* The cached data is reloaded when the folder holding the include paths * The cached data is reloaded when the folder holding the include paths is
* is removed. * removed.
*/ */
private String qtInstallHeadersPath; private String qtInstallHeadersPath;
/** /**
* The cached data is reloaded when the folder containing the include folders is * The cached data is reloaded when the folder containing the include
* modified. * folders is modified.
*/ */
private long qtInstallHeadersModTime; private long qtInstallHeadersModTime;
private static final String ATTR_QMAKE = "qmake"; private static final String ATTR_QMAKE = "qmake"; //$NON-NLS-1$
private static final String ATTR_QMAKE_MOD = "qmakeModification"; private static final String ATTR_QMAKE_MOD = "qmakeModification"; //$NON-NLS-1$
private static final String ATTR_QT_INSTALL_HEADERS = "QT_INSTALL_HEADERS"; private static final String ATTR_QT_INSTALL_HEADERS = "QT_INSTALL_HEADERS"; //$NON-NLS-1$
private static final String ATTR_QT_INSTALL_HEADERS_MOD = "qtInstallHeadersModification"; private static final String ATTR_QT_INSTALL_HEADERS_MOD = "qtInstallHeadersModification"; //$NON-NLS-1$
/** /**
* Create a new instance of the include path wrapper for the Qt installation for * Create a new instance of the include path wrapper for the Qt installation
* the given qmake binary. * for the given qmake binary.
*/ */
public QtIncludePaths(String qmakePath) { public QtIncludePaths(String qmakePath) {
this.qmakePath = qmakePath; this.qmakePath = qmakePath;
} }
/** /**
* Create and load an instance of QtIncludePaths from data that was serialized into the * Create and load an instance of QtIncludePaths from data that was
* given XML element. Return null if an instance cannot be loaded or if the installation * serialized into the given XML element. Return null if an instance cannot
* is no longer valid. * be loaded or if the installation is no longer valid.
*/ */
public static QtIncludePaths loadFrom(Node node) { public static QtIncludePaths loadFrom(Node node) {
if (node.getNodeType() != Node.ELEMENT_NODE) if (node.getNodeType() != Node.ELEMENT_NODE)
@ -87,8 +88,7 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
Element element = (Element) node; Element element = (Element) node;
String qmakePath = element.getAttribute(ATTR_QMAKE); String qmakePath = element.getAttribute(ATTR_QMAKE);
if (qmakePath == null if (qmakePath == null || qmakePath.isEmpty())
|| qmakePath.isEmpty())
return null; return null;
QtIncludePaths qtIncludePaths = new QtIncludePaths(qmakePath); QtIncludePaths qtIncludePaths = new QtIncludePaths(qmakePath);
@ -101,18 +101,16 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
} }
/** /**
* Return true if the receiver points to a valid Qt installation and false otherwise. * Return true if the receiver points to a valid Qt installation and false
* The installation is considered valid if an executable qmake binary exists at the * otherwise. The installation is considered valid if an executable qmake
* expected location. * binary exists at the expected location.
*/ */
public boolean isValid() { public boolean isValid() {
if (qmakePath == null if (qmakePath == null || qmakePath.isEmpty())
|| qmakePath.isEmpty())
return false; return false;
File qmake = new File(qmakePath); File qmake = new File(qmakePath);
return qmake.exists() return qmake.exists() && qmake.canExecute();
&& qmake.canExecute();
} }
@Override @Override
@ -120,8 +118,10 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
if (!(obj instanceof QtIncludePaths)) if (!(obj instanceof QtIncludePaths))
return super.equals(obj); return super.equals(obj);
// Include paths are equivalent when they point to the same qmake binary. All other // Include paths are equivalent when they point to the same qmake
// values are reloaded from that binary and do not need to be directly compared. // binary. All other
// values are reloaded from that binary and do not need to be directly
// compared.
QtIncludePaths other = (QtIncludePaths) obj; QtIncludePaths other = (QtIncludePaths) obj;
return qmakePath == null ? other.qmakePath == null : qmakePath.equals(other.qmakePath); return qmakePath == null ? other.qmakePath == null : qmakePath.equals(other.qmakePath);
} }
@ -132,33 +132,32 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
} }
/** /**
* Return a current list of the include paths for this Qt installation. Return null if * Return a current list of the include paths for this Qt installation.
* no such paths can be found. * Return null if no such paths can be found.
* <p> * <p>
* Updates the cached results if needed. If the settings are updated then the new list * Updates the cached results if needed. If the settings are updated then
* will be serialized into the workspace metadata area. * the new list will be serialized into the workspace metadata area.
*/ */
@Override @Override
public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription configDesc, IResource rc, String languageId) { public List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc, String languageId) {
List<ICLanguageSettingEntry> entries = null; List<ICLanguageSettingEntry> entries = null;
File qmake = new File(qmakePath); File qmake = new File(qmakePath);
if (!qmake.exists() if (!qmake.exists() || qmakeModTime != qmake.lastModified())
|| qmakeModTime != qmake.lastModified())
entries = reload(); entries = reload();
else { else {
File qtInstallHeadersDir = new File(qtInstallHeadersPath); File qtInstallHeadersDir = new File(qtInstallHeadersPath);
if (!qtInstallHeadersDir.exists() if (!qtInstallHeadersDir.exists() || qtInstallHeadersModTime != qtInstallHeadersDir.lastModified())
|| qtInstallHeadersModTime != qtInstallHeadersDir.lastModified())
entries = reload(); entries = reload();
} }
// If the cache was not reloaded, then return the previously discovered entries. // If the cache was not reloaded, then return the previously discovered
// entries.
if (entries == null) if (entries == null)
return super.getSettingEntries(configDesc, rc, languageId); return super.getSettingEntries(config, rc, languageId);
// Otherwise store, persist, and return the newly discovered values. // Otherwise store, persist, and return the newly discovered values.
setSettingEntries(configDesc, rc, languageId, entries); setSettingEntries(config, rc, languageId, entries);
serializeLanguageSettingsInBackground(null); serializeLanguageSettingsInBackground(null);
return entries; return entries;
} }
@ -170,8 +169,10 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
parentElement.setAttribute(ATTR_QT_INSTALL_HEADERS, qtInstallHeadersPath); parentElement.setAttribute(ATTR_QT_INSTALL_HEADERS, qtInstallHeadersPath);
parentElement.setAttribute(ATTR_QT_INSTALL_HEADERS_MOD, Long.toString(qtInstallHeadersModTime)); parentElement.setAttribute(ATTR_QT_INSTALL_HEADERS_MOD, Long.toString(qtInstallHeadersModTime));
// The parent implementation tries to create a new child node (provider) that is used // The parent implementation tries to create a new child node (provider)
// as the part for later entries. This isn't needed in this case, we just want to // that is used
// as the part for later entries. This isn't needed in this case, we
// just want to
// use the part that serializes the languages. // use the part that serializes the languages.
return parentElement; return parentElement;
} }
@ -182,25 +183,26 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
qtInstallHeadersPath = element.getAttribute(ATTR_QT_INSTALL_HEADERS); qtInstallHeadersPath = element.getAttribute(ATTR_QT_INSTALL_HEADERS);
qtInstallHeadersModTime = getLongAttribute(element, ATTR_QT_INSTALL_HEADERS_MOD); qtInstallHeadersModTime = getLongAttribute(element, ATTR_QT_INSTALL_HEADERS_MOD);
// The parent implementation tries to create a new child node (provider) that is used // The parent implementation tries to create a new child node (provider)
// as the part for later entries. This isn't needed in this case, we just want to // that is used
// as the part for later entries. This isn't needed in this case, we
// just want to
// use the part that serializes the languages. // use the part that serializes the languages.
} }
/** /**
* Parse and return the given attribute as a long. Return 0 if the attribute does * Parse and return the given attribute as a long. Return 0 if the attribute
* not have a valid value. * does not have a valid value.
*/ */
private static long getLongAttribute(Element element, String attr) { private static long getLongAttribute(Element element, String attr) {
String value = element.getAttribute(attr); String value = element.getAttribute(attr);
if (value == null if (value == null || value.isEmpty())
|| value.isEmpty())
return 0; return 0;
try { try {
return Long.parseLong(value); return Long.parseLong(value);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
Activator.log("attribute name:" + attr + " value:" + value, e); Activator.log("attribute name:" + attr + " value:" + value, e); //$NON-NLS-1$ //$NON-NLS-2$
return 0; return 0;
} }
} }
@ -209,24 +211,25 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
* Reload and return the entries if possible, return null otherwise. * Reload and return the entries if possible, return null otherwise.
*/ */
private List<ICLanguageSettingEntry> reload() { private List<ICLanguageSettingEntry> reload() {
// All keys are reset and then updated as their values are discovered. This allows partial // All keys are reset and then updated as their values are discovered.
// This allows partial
// success to skip over previously calculated values. // success to skip over previously calculated values.
qmakeModTime = 0; qmakeModTime = 0;
qtInstallHeadersPath = null; qtInstallHeadersPath = null;
qtInstallHeadersModTime = 0; qtInstallHeadersModTime = 0;
File qmake = new File(qmakePath); File qmake = new File(qmakePath);
if (!qmake.exists() if (!qmake.exists() || !qmake.canExecute())
|| !qmake.canExecute())
return Collections.emptyList(); return Collections.emptyList();
qmakeModTime = qmake.lastModified(); qmakeModTime = qmake.lastModified();
// Run `qmake -query QT_INSTALL_HEADERS` to get output like "/opt/qt-5.0.0/include". // Run `qmake -query QT_INSTALL_HEADERS` to get output like
// "/opt/qt-5.0.0/include".
BufferedReader reader = null; BufferedReader reader = null;
Process process = null; Process process = null;
try { try {
process = ProcessFactory.getFactory().exec(new String[]{ qmakePath, "-query", "QT_INSTALL_HEADERS" }); process = ProcessFactory.getFactory().exec(new String[] { qmakePath, "-query", "QT_INSTALL_HEADERS" }); //$NON-NLS-1$ //$NON-NLS-2$
reader = new BufferedReader(new InputStreamReader(process.getInputStream())); reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
qtInstallHeadersPath = reader.readLine(); qtInstallHeadersPath = reader.readLine();
} catch (IOException e) { } catch (IOException e) {
@ -249,12 +252,11 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
File qtInstallHeadersDir = new File(qtInstallHeadersPath); File qtInstallHeadersDir = new File(qtInstallHeadersPath);
qtInstallHeadersModTime = qtInstallHeadersDir.lastModified(); qtInstallHeadersModTime = qtInstallHeadersDir.lastModified();
if (!qtInstallHeadersDir.exists() if (!qtInstallHeadersDir.exists() || !qtInstallHeadersDir.canRead() || !qtInstallHeadersDir.isDirectory())
|| !qtInstallHeadersDir.canRead()
|| !qtInstallHeadersDir.isDirectory())
return Collections.emptyList(); return Collections.emptyList();
// Create an include path entry for all sub-folders in the QT_INSTALL_HEADERS location, including // Create an include path entry for all sub-folders in the
// QT_INSTALL_HEADERS location, including
// the QT_INSTALL_HEADERS folder itself. // the QT_INSTALL_HEADERS folder itself.
File[] files = qtInstallHeadersDir.listFiles(new FileFilter() { File[] files = qtInstallHeadersDir.listFiles(new FileFilter() {
@Override @Override
@ -273,7 +275,8 @@ public class QtIncludePaths extends LanguageSettingsSerializableProvider {
private static void safeAdd(List<ICLanguageSettingEntry> entries, File file) { private static void safeAdd(List<ICLanguageSettingEntry> entries, File file) {
try { try {
entries.add(new CIncludePathEntry(file.getCanonicalPath(), ICSettingEntry.READONLY | ICSettingEntry.RESOLVED)); entries.add(
new CIncludePathEntry(file.getCanonicalPath(), ICSettingEntry.READONLY | ICSettingEntry.RESOLVED));
} catch (IOException e) { } catch (IOException e) {
Activator.log(e); Activator.log(e);
} }

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
@ -24,8 +25,8 @@ import org.w3c.dom.NodeList;
/** /**
* This provider uses persistent cache to store the include paths for different * This provider uses persistent cache to store the include paths for different
* Qt installations. A Qt installation is uniquely identified by the path to * Qt installations. A Qt installation is uniquely identified by the path to the
* the qmake binary within the installation. * qmake binary within the installation.
* <p> * <p>
* This result is shared among all Build Configurations that use the provider * This result is shared among all Build Configurations that use the provider
* with the same value for the QMAKE environment variable. * with the same value for the QMAKE environment variable.
@ -33,17 +34,19 @@ import org.w3c.dom.NodeList;
public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider { public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider {
/** /**
* The provider identifies Qt installations by the absolute path to the qmake binary. The * The provider identifies Qt installations by the absolute path to the
* include paths relevant to the installations are computed and persisted in {@link QtIncludePaths}. * qmake binary. The include paths relevant to the installations are
* computed and persisted in {@link QtIncludePaths}.
*/ */
private final Map<String, QtIncludePaths> qtInstallHeaders = new HashMap<String, QtIncludePaths>(); private final Map<String, QtIncludePaths> qtInstallHeaders = new HashMap<String, QtIncludePaths>();
/** /**
* The build configuration stores the path to the qmake binary as an environment variable. * The build configuration stores the path to the qmake binary as an
* environment variable.
*/ */
private static final String ENVVAR_QMAKE = "QMAKE"; private static final String ENVVAR_QMAKE = "QMAKE"; //$NON-NLS-1$
private static final String ELEMENT_QMAKE = "qmake"; private static final String ELEMENT_QMAKE = "qmake"; //$NON-NLS-1$
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
@ -68,17 +71,19 @@ public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider
public void loadEntries(Element providerNode) { public void loadEntries(Element providerNode) {
super.loadEntries(providerNode); super.loadEntries(providerNode);
// Find and load all qmake child nodes. There will be one node for each Qt // Find and load all qmake child nodes. There will be one node for each
// installation that has been used. Qt installations that are no longer valid // Qt
// are not loaded. This means they will be removed from the file the next time // installation that has been used. Qt installations that are no longer
// valid
// are not loaded. This means they will be removed from the file the
// next time
// that the language setting providers are serialized. // that the language setting providers are serialized.
NodeList children = providerNode.getChildNodes(); NodeList children = providerNode.getChildNodes();
for (int i = 0; i < children.getLength(); ++i) { for (int i = 0; i < children.getLength(); ++i) {
Node child = children.item(i); Node child = children.item(i);
if (ELEMENT_QMAKE.equals(child.getNodeName())) { if (ELEMENT_QMAKE.equals(child.getNodeName())) {
QtIncludePaths qtIncludePaths = QtIncludePaths.loadFrom(child); QtIncludePaths qtIncludePaths = QtIncludePaths.loadFrom(child);
if (qtIncludePaths != null if (qtIncludePaths != null && qtIncludePaths.isValid())
&& qtIncludePaths.isValid())
qtInstallHeaders.put(qtIncludePaths.getQMakePath(), qtIncludePaths); qtInstallHeaders.put(qtIncludePaths.getQMakePath(), qtIncludePaths);
} }
} }
@ -86,9 +91,12 @@ public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider
@Override @Override
public void serializeEntries(Element parent) { public void serializeEntries(Element parent) {
// NOTE: This creates its own XML structure where children of the provider node are qmake nodes. // NOTE: This creates its own XML structure where children of the
// Within each qmake node is a list of include paths for that installation. Calling the // provider node are qmake nodes.
// base #serializeEntries here would try to write this instance's (empty) list of settings // Within each qmake node is a list of include paths for that
// installation. Calling the
// base #serializeEntries here would try to write this instance's
// (empty) list of settings
// to the file. // to the file.
// Each value is serialized into a new element in the XML document. // Each value is serialized into a new element in the XML document.
@ -101,19 +109,24 @@ public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider
} }
/** /**
* The given build configuration's QMAKE environment variable is used to identify the appropriate * The given build configuration's QMAKE environment variable is used to
* Qt installation. The language settings are then either returned from the previously persisted * identify the appropriate Qt installation. The language settings are then
* data or loaded, serialized, and returned. * either returned from the previously persisted data or loaded, serialized,
* and returned.
*/ */
@Override @Override
public synchronized List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription configDesc, IResource rc, String languageId) { public synchronized List<ICLanguageSettingEntry> getSettingEntries(IBuildConfiguration config, IResource rc,
String languageId) {
// Make sure the requested language is in scope for this provider. // Make sure the requested language is in scope for this provider.
if (!getLanguageScope().contains(languageId)) if (!getLanguageScope().contains(languageId))
return null; return null;
// The value of the build configuration's QMAKE environment variable is used to select the // The value of the build configuration's QMAKE environment variable is
// used to select the
// right version of qmake. // right version of qmake.
IEnvironmentVariable qmake_var = CCorePlugin.getDefault().getBuildEnvironmentManager().getVariable(ENVVAR_QMAKE, configDesc, true); ICConfigurationDescription configDesc = config.getAdapter(ICConfigurationDescription.class);
IEnvironmentVariable qmake_var = CCorePlugin.getDefault().getBuildEnvironmentManager().getVariable(ENVVAR_QMAKE,
configDesc, true);
if (qmake_var == null) if (qmake_var == null)
return null; return null;
@ -121,13 +134,14 @@ public class QtIncludePathsProvider extends LanguageSettingsSerializableProvider
if (qmake == null) if (qmake == null)
return null; return null;
// The path to qmake is used as the key into the in-memory cache of header paths. // The path to qmake is used as the key into the in-memory cache of
// header paths.
QtIncludePaths paths = qtInstallHeaders.get(qmake); QtIncludePaths paths = qtInstallHeaders.get(qmake);
if (paths == null) { if (paths == null) {
paths = new QtIncludePaths(qmake); paths = new QtIncludePaths(qmake);
qtInstallHeaders.put(qmake, paths); qtInstallHeaders.put(qmake, paths);
} }
return paths.getSettingEntries(configDesc, null, languageId); return paths.getSettingEntries(config, null, languageId);
} }
} }