From 46ab14c54b175f1899c788c62b5fd6eb89e8b07b Mon Sep 17 00:00:00 2001 From: erititan <elemer.lelik@ericsson.com> Date: Mon, 7 Mar 2016 12:27:26 +0100 Subject: [PATCH] Sync with 5.4.3 --- Eclipse_Designer_userguide.doc | Bin 4709888 -> 4756480 bytes TITAN_Designer_feature/feature.xml | 37 +- TITAN_Executor_feature/feature.xml | 16 +- .../TITAN_Log_Viewer_Feature.iml | 2 +- TITAN_Log_Viewer_Feature/feature.xml | 14 +- Titanium_feature/Titanium_feature.iml | 2 +- Titanium_feature/feature.xml | 16 +- automatic_build/build_config.xml | 2 +- org.eclipse.titan.common/META-INF/MANIFEST.MF | 2 +- org.eclipse.titan.common/plugin.xml | 101 +- .../titan/common/actions/MergeLog.java | 5 +- .../titan/common/logging/ErrorReporter.java | 5 +- .../titan/common/parsers/LocationAST.java | 3 +- .../titan/common/parsers/TitanListener.java | 2 +- .../titan/common/parsers/cfg/CFGNumber.java | 64 +- .../titan/common/parsers/cfg/CfgAnalyzer.java | 47 +- .../common/parsers/cfg/CfgParseResult.java | 49 +- .../titan/common/parsers/cfg/CfgParser.g4 | 476 +++-- .../parsers/cfg/CfgParserBaseListener.java | 1626 --------------- .../common/parsers/cfg/CfgParserListener.java | 1357 ------------ .../parsers/cfg/CfgResolverListener.java | 503 ----- .../common/parsers/cfg/ConfigFileHandler.java | 1 + .../parsers/cfg/ConfigTreeNodeUtilities.java | 11 - org.eclipse.titan.debug/META-INF/MANIFEST.MF | 11 +- org.eclipse.titan.debug/plugin.xml | 2 +- .../META-INF/MANIFEST.MF | 4 +- org.eclipse.titan.designer/plugin.xml | 1831 ++++++++--------- .../designer/AST/ASN1/ASN1Assignment.java | 39 +- .../designer/AST/ASN1/ASN1Assignments.java | 4 +- .../designer/AST/ASN1/InformationFromObj.java | 6 +- .../Object/ObjectClassSyntax_Builder.java | 5 +- .../ASN1/Object/ObjectClassSyntax_Node.java | 4 +- .../ASN1/Object/ObjectClassSyntax_Parser.java | 23 +- .../AST/ASN1/Object/Object_Definition.java | 3 +- .../AST/ASN1/ObjectClass_Assignment.java | 19 +- .../AST/ASN1/ObjectSet_Assignment.java | 19 +- .../designer/AST/ASN1/Object_Assignment.java | 19 +- .../designer/AST/ASN1/Type_Assignment.java | 20 +- .../AST/ASN1/Undefined_Assignment.java | 23 +- .../ASN1/Undefined_Assignment_OS_or_VS.java | 28 +- .../AST/ASN1/Undefined_Assignment_O_or_V.java | 37 +- .../ASN1/Undefined_Assignment_T_or_OC.java | 20 +- .../AST/ASN1/ValueSet_Assignment.java | 11 +- .../designer/AST/ASN1/Value_Assignment.java | 29 +- .../AST/ASN1/definitions/ASN1Module.java | 14 +- .../AST/ASN1/definitions/Exports.java | 14 +- .../AST/ASN1/definitions/ImportModule.java | 18 +- .../AST/ASN1/definitions/Imports.java | 22 +- .../ASN1/definitions/SpecialASN1Module.java | 6 +- .../AST/ASN1/types/ASN1_Sequence_Type.java | 10 +- .../ASN1/types/ComponentsOfComponentType.java | 4 +- .../AST/ASN1/types/PrintableString_Type.java | 8 +- .../AST/ASN1/types/RegularComponentType.java | 2 +- .../types/RelativeObjectIdentifier_Type.java | 2 +- .../AST/ASN1/types/Selection_Type.java | 14 +- .../AST/ASN1/types/TeletexString_Type.java | 8 +- .../designer/AST/ASN1/types/UTCTime_Type.java | 8 +- .../AST/ASN1/types/UTF8String_Type.java | 8 +- .../ASN1/types/UnrestrictedString_Type.java | 6 +- .../AST/ASN1/types/VideotexString_Type.java | 8 +- .../AST/ASN1/types/VisibleString_Type.java | 8 +- .../AST/ASN1/values/ASN1_Null_Value.java | 4 +- .../AST/ASN1/values/Charsymbols_Value.java | 4 +- .../AST/ASN1/values/ISO2022String_Value.java | 18 +- .../designer/AST/ASN1/values/Named_Bits.java | 16 +- .../AST/ASN1/values/Named_Integer_Value.java | 10 +- .../RelativeObjectIdentifier_Value.java | 4 +- .../ASN1/values/Undefined_Block_Value.java | 18 +- .../eclipse/titan/designer/AST/ASTNode.java | 20 +- .../titan/designer/AST/Assignment.java | 15 +- .../eclipse/titan/designer/AST/ISetting.java | 4 +- .../org/eclipse/titan/designer/AST/IType.java | 23 +- .../eclipse/titan/designer/AST/IValue.java | 8 +- .../titan/designer/AST/Identifier.java | 20 +- .../designer/AST/KeywordLessIdentifier.java | 14 +- .../titan/designer/AST/MarkerHandler.java | 4 +- .../titan/designer/AST/ModuleImportation.java | 2 +- .../titan/designer/AST/PortReference.java | 78 + .../eclipse/titan/designer/AST/Reference.java | 52 +- .../titan/designer/AST/ReferenceFinder.java | 9 +- .../eclipse/titan/designer/AST/Setting.java | 4 +- .../AST/TTCN3/TemplateRestriction.java | 18 +- .../attributes/DecodeTypeMappingTarget.java | 24 +- .../attributes/EncodeTypeMappingTarget.java | 24 +- .../ErroneousAttributeSpecification.java | 4 +- .../TTCN3/attributes/ErroneousAttributes.java | 22 +- .../TTCN3/attributes/ErrorBehaviorList.java | 10 +- .../attributes/FunctionTypeMappingTarget.java | 6 +- .../attributes/SimpleTypeMappingTarget.java | 20 +- .../AST/TTCN3/attributes/TypeMappings.java | 10 +- .../TTCN3/attributes/WithAttributesPath.java | 4 +- .../AST/TTCN3/definitions/Def_Altstep.java | 50 +- .../AST/TTCN3/definitions/Def_Const.java | 4 - .../TTCN3/definitions/Def_ExternalConst.java | 4 - .../TTCN3/definitions/Def_Extfunction.java | 20 +- .../TTCN3/definitions/Def_Extfunction.java_ | 720 ------- .../AST/TTCN3/definitions/Def_Function.java | 76 +- .../AST/TTCN3/definitions/Def_ModulePar.java | 53 +- .../definitions/Def_ModulePar_Template.java | 13 +- .../AST/TTCN3/definitions/Def_Port.java | 4 - .../AST/TTCN3/definitions/Def_Template.java | 26 +- .../AST/TTCN3/definitions/Def_Testcase.java | 24 +- .../AST/TTCN3/definitions/Def_Timer.java | 72 +- .../AST/TTCN3/definitions/Def_Type.java | 3 - .../AST/TTCN3/definitions/Def_Var.java | 68 +- .../TTCN3/definitions/Def_Var_Template.java | 74 +- .../definitions/Default_ActualParameter.java | 16 +- .../AST/TTCN3/definitions/Definition.java | 46 +- .../AST/TTCN3/definitions/Definitions.java | 60 +- .../TTCN3/definitions/FormalParameter.java | 4 +- .../designer/AST/TTCN3/definitions/Group.java | 18 +- .../AST/TTCN3/definitions/ImportModule.java | 26 +- .../AST/TTCN3/definitions/TTCN3Module.java | 77 +- .../Activate_Referenced_Statement.java | 38 +- .../statements/Altstep_Applied_Statement.java | 28 +- .../AST/TTCN3/statements/Catch_Statement.java | 10 +- .../TTCN3/statements/Connect_Statement.java | 18 +- .../statements/Disconnect_Statement.java | 18 +- .../AST/TTCN3/statements/For_Statement.java | 1 - .../Function_Applied_Statement.java | 28 +- .../TTCN3/statements/Getcall_Statement.java | 10 +- .../AST/TTCN3/statements/If_Statement.java | 56 +- .../AST/TTCN3/statements/Map_Statement.java | 20 +- .../statements/Parameter_Assignments.java | 34 +- .../AST/TTCN3/statements/Port_Utility.java | 4 +- .../statements/Receive_Port_Statement.java | 12 +- ...eferenced_Testcase_Instance_Statement.java | 36 +- .../statements/Setverdict_Statement.java | 6 +- .../Start_Referenced_Component_Statement.java | 54 +- .../statements/TestcaseStop_Statement.java | 5 + .../statements/Unknown_Applied_Statement.java | 40 +- .../AST/TTCN3/statements/Unmap_Statement.java | 20 +- .../AST/TTCN3/templates/AllElementsFrom.java | 4 +- .../TTCN3/templates/AnyOrOmit_Template.java | 2 +- .../CharString_Pattern_Template.java | 2 +- .../templates/ComplementedList_Template.java | 57 +- .../TTCN3/templates/CompositeTemplate.java | 62 + .../AST/TTCN3/templates/ITTCN3Template.java | 6 +- .../templates/Indexed_Template_List.java | 8 +- .../AST/TTCN3/templates/Invoke_Template.java | 8 +- .../TTCN3/templates/LengthRestriction.java | 4 +- .../AST/TTCN3/templates/NamedTemplate.java | 3 + .../TTCN3/templates/Named_Template_List.java | 4 +- .../AST/TTCN3/templates/NotUsed_Template.java | 4 +- .../TTCN3/templates/OmitValue_Template.java | 6 +- .../templates/PermutationMatch_Template.java | 2 +- .../templates/RangeLenghtRestriction.java | 12 +- .../TTCN3/templates/Referenced_Template.java | 20 +- .../templates/SingleLenghtRestriction.java | 4 +- .../templates/SpecificValue_Template.java | 34 +- .../TTCN3/templates/SubsetMatch_Template.java | 4 +- .../templates/SupersetMatch_Template.java | 4 +- .../AST/TTCN3/templates/TTCN3Template.java | 16 +- .../AST/TTCN3/templates/TemplateBody.java | 12 +- .../AST/TTCN3/templates/Template_List.java | 6 +- .../TTCN3/templates/ValueList_Template.java | 17 +- .../AST/TTCN3/templates/ValueRange.java | 16 +- .../AST/TTCN3/types/Altstep_Type.java | 2 +- .../designer/AST/TTCN3/types/Array_Type.java | 7 +- .../designer/AST/TTCN3/types/CompField.java | 3 + .../AST/TTCN3/types/ComponentTypeBody.java | 12 +- .../AST/TTCN3/types/Component_Type.java | 4 +- .../AST/TTCN3/types/DefinitionContainer.java | 16 + .../designer/AST/TTCN3/types/EnumItem.java | 22 +- .../AST/TTCN3/types/Function_Type.java | 2 +- .../AST/TTCN3/types/SequenceOf_Type.java | 8 +- .../TTCN3/types/TTCN3_Enumerated_Type.java | 10 +- .../types/TTCN3_Set_Seq_Choice_BaseType.java | 11 - .../AST/TTCN3/types/Testcase_Type.java | 2 +- .../TTCN3/types/subtypes/EmptyStringSet.java | 6 +- .../TTCN3/types/subtypes/FullStringSet.java | 6 +- .../TTCN3/types/subtypes/IntegerLimit.java | 26 +- .../types/subtypes/Range_ParsedSubType.java | 6 +- .../AST/TTCN3/types/subtypes/RealLimit.java | 18 +- .../subtypes/RealRangeListConstraint.java | 34 +- .../types/subtypes/StringSetConstraint.java | 66 +- .../types/subtypes/StringSetOperation.java | 50 +- .../StringSizeAndValueListConstraint.java | 4 +- .../subtypes/StringSubtypeTreeElement.java | 6 +- .../types/subtypes/StringValueConstraint.java | 2 +- .../subtypes/UStringValueConstraint.java | 10 +- .../subtypes/ValueListAndSizeConstraint.java | 14 +- .../types/subtypes/ValueListConstraint.java | 10 +- .../TTCN3/values/Altstep_Reference_Value.java | 14 +- .../values/Function_Reference_Value.java | 12 +- .../designer/AST/TTCN3/values/NamedValue.java | 3 + .../values/Testcase_Reference_Value.java | 12 +- .../expressions/MTCComponentExpression.java | 6 +- .../values/expressions/RefersExpression.java | 60 +- .../expressions/SelfComponentExpression.java | 6 +- .../SystemComponentExpression.java | 6 +- .../org/eclipse/titan/designer/AST/Type.java | 46 +- .../org/eclipse/titan/designer/Activator.java | 47 +- .../titan/designer/GeneralConstants.java | 2 +- .../titan/designer/GlobalDeltaVisitor.java | 9 +- .../designer/actions/ConvertXSD2TTCN.java | 3 +- .../designer/actions/NatureConverter.java | 6 +- .../designer/application/LoadFromTpd.java | 3 +- .../brokenpartsanalyzers/AnalyzerFactory.java | 45 + .../AssignmentHandler.java | 187 ++ .../AssignmentHandlerAFTGeneral.java | 39 + .../AssignmentHandlerAFTRerences.java | 99 + .../AssignmentHandlerComponent.java | 123 ++ .../AssignmentHandlerFactory.java | 45 + .../BrokenPartsChecker.java | 100 + .../BrokenPartsViaReferences.java | 431 ++++ .../IAssignmentChecker.java | 15 + .../brokenpartsanalyzers/IBaseAnalyzer.java | 18 + .../OriginalModuleSelection.java | 226 ++ .../ReferenceCollector.java | 47 + .../ReferencesProcessor.java | 58 + .../SelectionAlgorithm.java | 42 + .../SelectionMethodBase.java | 103 + .../ResourceExclusionHelper.java | 1 - .../CompilerVersionInformationCollector.java | 6 +- .../titan/designer/core/OutputAnalyzer.java | 16 + .../designer/core/ProjectBasedBuilder.java | 53 + .../titan/designer/core/TITANBuilder.java | 2 +- .../core/TITANInstallationValidator.java | 10 +- .../eclipse/titan/designer/core/TITANJob.java | 20 +- .../IdentifierFinderVisitor.java | 9 + .../editors/DeclarationCollector.java | 13 +- .../designer/editors/OccurencesMarker.java | 14 +- .../editors/OpenDeclarationHelper.java | 2 +- .../designer/editors/ProposalCollector.java | 12 +- .../editors/asn1editor/OpenDeclaration.java | 6 +- .../asn1editor/ReconcilingStrategy.java | 9 +- .../editors/configeditor/OpenDeclaration.java | 7 +- .../pages/logging/GeneralOptionsSubPage.java | 5 +- .../pages/logging/ParamDialog.java | 2 +- .../editors/ttcn3editor/AddImport.java | 5 +- .../editors/ttcn3editor/OpenDeclaration.java | 111 +- .../editors/ttcn3editor/Reconciler.java | 1 + .../ttcn3editor/ReconcilingStrategy.java | 31 +- .../editors/ttcnppeditor/Configuration.java | 15 - .../editors/ttcnppeditor/OpenDeclaration.java | 7 +- .../ttcnppeditor/ReconcilingStrategy.java | 14 +- .../designer/license/LicenseValidator.java | 7 +- .../NativeWIN32TITANJob.java | 10 +- .../designer/parsers/ProjectSourceParser.java | 66 +- .../ProjectSourceSemanticAnalyzer.java | 639 +----- .../ProjectSourceSyntacticAnalyzer.java | 10 +- .../parsers/asn1parser/ASN1Analyzer.java | 11 +- .../designer/parsers/asn1parser/Asn1Parser.g4 | 144 +- .../parsers/ttcn3parser/TTCN3Analyzer.java | 7 +- .../ttcn3parser/TTCN3ReparseUpdater.java | 20 +- .../parsers/ttcn3parser/Ttcn3BaseLexer.g4 | 86 +- .../parsers/ttcn3parser/Ttcn3Parser.g4 | 194 +- .../preferences/PreferenceConstantValues.java | 4 + .../preferences/PreferenceConstants.java | 3 +- .../preferences/PreferenceInitializer.java | 3 +- .../pages/ErrorsWarningsPreferencePage.java | 7 +- .../ExcludedResourcesPreferencePage.java | 3 +- .../pages/OnTheFlyCheckerPreferencePage.java | 63 +- .../BaseNamingConventionPropertyData.java | 12 +- .../data/TITANFlagsOptionsData.java | 11 +- .../pages/ConfigurationManagerControl.java | 3 +- .../FolderNamingConventionPropertyPage.java | 3 +- .../pages/ProjectBuildPropertyPage.java | 4 +- .../ProjectConfigurationsPropertyPage.java | 1 - .../ProjectNamingConventionPropertyPage.java | 3 +- .../pages/TITANFlagsOptionsPage.java | 14 +- .../refactoring/RenameRefactoring.java | 95 +- .../designer/wizards/GUIProjectImporter.java | 2 +- .../wizards/NewTITANProjectWizard.java | 7 +- .../wizards/TITANProjectImportMainPage.java | 4 +- .../wizards/TITANProjectImportWizard.java | 4 +- .../NewTITANProjectImportWizard.java | 4 +- .../wizards/projectFormat/TpdImporter.java | 25 +- .../META-INF/MANIFEST.MF | 4 +- org.eclipse.titan.executor/plugin.xml | 616 +++--- .../executor/executors/LaunchShortcut.java | 14 +- .../executors/LaunchShortcutConfig.java | 14 +- .../executor/executors/jni/JniExecutor.java | 4 +- .../jni/LaunchConfigurationDelegate.java | 4 +- .../executors/mctr/cli/CliExecutor.java | 37 +- .../executors/single/SingleExecutor.java | 7 +- org.eclipse.titan.help/META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 4 +- .../org.eclipse.titan.log.viewer.iml | 2 +- org.eclipse.titan.log.viewer/plugin.xml | 1060 +++++----- .../CloseAllConnectedViewMenuAction.java | 27 +- .../actions/ExtractComponentsMenuAction.java | 38 +- .../actions/ExtractTestCasesMenuAction.java | 33 +- .../viewer/actions/LogFileActionProvider.java | 5 +- .../log/viewer/actions/OpenMSCViewAction.java | 67 + .../viewer/actions/OpenMSCViewMenuAction.java | 38 +- .../actions/OpenSourceViewMenuAction.java | 7 +- .../OpenStatisticalViewMenuAction.java | 32 +- .../OpenTextTableProjectsViewMenuAction.java | 41 +- .../actions/TestCaseActionProvider.java | 4 +- .../exceptions/TitanLogExceptionHandler.java | 7 +- .../pages/DecipheringPreferencePage.java | 4 +- .../log/viewer/utils/ImportExportUtils.java | 40 +- .../log/viewer/utils/LogFileCacheHandler.java | 6 +- .../titan/log/viewer/views/MSCView.java | 4 + .../log/viewer/views/StatisticalView.java | 51 +- .../views/text/table/SwitchToMscAction.java | 9 +- .../views/text/table/TextTableViewHelper.java | 14 +- .../META-INF/MANIFEST.MF | 4 +- org.eclipse.titan.regressiontests/build.xml | 6 +- .../fragment.xml | 71 +- .../statictests/Basic_tests/AST_tests.java | 5 +- .../fragment.xml | 26 +- org.eclipse.titanium/META-INF/MANIFEST.MF | 6 +- org.eclipse.titanium/plugin.xml | 829 +++----- .../titanium/actions/OrganizeFromBrowser.java | 1 - .../titanium/actions/OrganizeFromEditor.java | 11 +- .../eclipse/titanium/error/ErrorMessage.java | 7 +- .../UnusedStartedRefFuncRetVal.java | 12 +- .../titanium/organize/OrganizeImports.java | 2 +- .../pages/MarkersPreferencePage.java | 4 +- org.eclipse.titanium/toc.xml | 10 +- 313 files changed, 6722 insertions(+), 9817 deletions(-) delete mode 100644 org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserBaseListener.java delete mode 100644 org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserListener.java delete mode 100644 org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgResolverListener.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/PortReference.java delete mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java_ create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AnalyzerFactory.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandler.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTGeneral.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTRerences.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerComponent.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerFactory.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsChecker.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsViaReferences.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IAssignmentChecker.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IBaseAnalyzer.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/OriginalModuleSelection.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferenceCollector.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferencesProcessor.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionAlgorithm.java create mode 100644 org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionMethodBase.java create mode 100644 org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewAction.java diff --git a/Eclipse_Designer_userguide.doc b/Eclipse_Designer_userguide.doc index 5cec2bf02e6cd1663ab2d91f6a1b1f850475ba3e..516788cda8d7a95eb1b8dee685d997cf0b57fffe 100755 GIT binary patch delta 233463 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⪚W>q;70)5UbYXJy;5oqNOOy5>eWc-Ix+0g-YF7CWvMG z@(Pr~_#DZU5K?YZKc++=lvgm+CBxW~$Ze?EvS=@o1DR#ra6ik;0c@f>D~Zkj{jMU( zP&k=Uv(n9y$zYpIcc+l{QUj@nwwDmge#52O{n%*;D~r6U6Prj)iG`a~NBWkM*O40W zUYF11EZI|+QQy_<#wOI&<-efB9IKHqHh-4o`Sqn{eyyKg_wBPscOKojap%#6vxjzX z-@Rq`q1|g%EL^d0?xZnu$3#yW(__rs&f?B)9(`}|!=+bn{a~qec3olTURS#xS3fJa zzSbA7*KM$?HrumdOR-2^=U%qcqyp+j(objEtm=j(<?9;yk^0L8WaVHDeRW-_<u&yN z!%4oXm|0hU*!<z;!w(OypT2(h!{II051&5#;o*l>DN|-^QzoTM8GfA{7t4};q`vp& zqLP#~yDo!0J6q=as`FEdr>?c5h|OANQFg6x>T1>01=6jyudvN(Y1aBOBx&O)HEpPu znxk_=NeXPpmmanO``QwGEd%K*M9olbb=N5w(&B1d≤!ztNvFB_$-?yMFKd^?TP3 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�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	J|@ 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 delta 187336 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%0Dic!kqsEc~2 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]+8&pqOg^mNE9oK! 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 diff --git a/TITAN_Designer_feature/feature.xml b/TITAN_Designer_feature/feature.xml index 21383b82d9..180d0d15a8 100755 --- a/TITAN_Designer_feature/feature.xml +++ b/TITAN_Designer_feature/feature.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 @@ -10,37 +10,44 @@ <feature id="TITAN_Designer" label="TITAN_Designer_Feature" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" provider-name="Eclipse Titan Project"> <description url="http://ttcn.ericsson.se/download/update_site/releasenotes.pdf"> - CRL 113 200/5 R4C (5.4.pl2) version of the TITAN Designer plug-in. + CRL 113 200/5 R4D (5.4.pl3) version of the TITAN Designer plug-in. </description> <copyright> /******************************************************************************* -* Copyright (c) 2000-2015 Ericsson Telecom AB +* Copyright (c) 2000-2016 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 +* 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 * * Contributors: -* Zoltan Janos Szabo (Ericsson) - initial architecture design and implementation +* Zoltan Janos Szabo (Ericsson) - initial architecture design +and implementation * Roland Gecse (Ericsson) - initial architecture design -* Akos Cserveni (Ericsson) - Basic AST in compiler, semantic checking +* Akos Cserveni (Ericsson) - Basic AST in compiler, semantic +checking * Gabor Szalai (Ericsson) – RAW and TEXT codecs -* Matyas Forstner (Ericsson) - ASN.1 extension of the compiler and BER/CER/DER codecs -* Kristof Szabados (Ericsson) - Eclipse Designer, Executor, Titanium UIs +* Matyas Forstner (Ericsson) - ASN.1 extension of the compiler +and BER/CER/DER codecs +* Kristof Szabados (Ericsson) - Eclipse Designer, Executor, +Titanium UIs * Szabolcs Beres (Ericsson) - Eclipse LogViewer -* Ferenc Kovacs (Ericsson) – log interfaces, big number support, subtype checking +* Ferenc Kovacs (Ericsson) – log interfaces, big number support, +subtype checking * Csaba Raduly (Ericsson) – ASN.1 additions, XML encoder/decoder -* Adam Delic (Ericsson) – template restrictions, try and catch, support of pre-processor directives in Eclipse +* Adam Delic (Ericsson) – template restrictions, try and +catch, support of pre-processor directives in Eclipse * Krisztian Pandi (Ericsson) – import of imports * Peter Dimitrov (Ericsson)- maintenance * Balazs Andor Zalanyi (Ericsson) – code splitting * Gabor Szalai (Ericsson) – RAW encoding/decoding -* Jeno Attila Balasko (Ericsson) – tests +* Jeno Attila Balasko (Ericsson) – tests, maintenance * Csaba Feher (Ericsson) – epoll support * Tamas Buti (Ericsson)- maintenance * Szabolcs Beres (Ericsson) - Eclipse LogViever @@ -155,21 +162,21 @@ This Agreement is governed by the laws of the State of New York and the intellec id="org.eclipse.titan.designer" download-size="3841" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.help" download-size="10546" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.common" download-size="532" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> </feature> diff --git a/TITAN_Executor_feature/feature.xml b/TITAN_Executor_feature/feature.xml index f2f0c88d0f..aff1d5b084 100755 --- a/TITAN_Executor_feature/feature.xml +++ b/TITAN_Executor_feature/feature.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 @@ -10,17 +10,17 @@ <feature id="TITAN_Executor" label="TITAN_Executor_Feature" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" provider-name="Eclipse Titan Project"> <description url="http://ttcn.ericsson.se/download/update_site/releasenotes.pdf"> - CRL 113 200/5 R4C (5.4.pl2) version of the TITAN Executor + CRL 113 200/5 R4D (5.4.pl3) version of the TITAN Executor plug-in. </description> <copyright> /******************************************************************************* -* Copyright (c) 2000-2015 Ericsson Telecom AB +* Copyright (c) 2000-2016 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -138,6 +138,7 @@ This Agreement is governed by the laws of the State of New York and the intellec </url> <requires> + <import feature="TITAN_Designer" version="5.4.3" match="greaterOrEqual"/> <import plugin="org.eclipse.ui"/> <import plugin="org.eclipse.core.runtime"/> <import plugin="org.eclipse.debug.core"/> @@ -149,28 +150,27 @@ This Agreement is governed by the laws of the State of New York and the intellec <import plugin="org.eclipse.core.expressions"/> <import plugin="org.eclipse.core.filesystem"/> <import plugin="org.eclipse.ui.ide"/> - <import feature="TITAN_Designer" version="5.4.2" match="greaterOrEqual"/> </requires> <plugin id="org.eclipse.titan.executor" download-size="720" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.help" download-size="10546" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.common" download-size="532" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> </feature> diff --git a/TITAN_Log_Viewer_Feature/TITAN_Log_Viewer_Feature.iml b/TITAN_Log_Viewer_Feature/TITAN_Log_Viewer_Feature.iml index a3ad0437df..529092389c 100644 --- a/TITAN_Log_Viewer_Feature/TITAN_Log_Viewer_Feature.iml +++ b/TITAN_Log_Viewer_Feature/TITAN_Log_Viewer_Feature.iml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 diff --git a/TITAN_Log_Viewer_Feature/feature.xml b/TITAN_Log_Viewer_Feature/feature.xml index 8f5ddb9bc2..dd2e72fc47 100755 --- a/TITAN_Log_Viewer_Feature/feature.xml +++ b/TITAN_Log_Viewer_Feature/feature.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 @@ -10,16 +10,16 @@ <feature id="TITAN_Log_Viewer" label="TITAN Log Viewer" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" provider-name="Eclipse Titan Project"> <description url="http://ttcn.ericsson.se/download/update_site/releasenotes.pdf"> - CRL 113 200/5 R4C (5.4.pl2) version of the TITAN Log Viewer plug-in. + CRL 113 200/5 R4D (5.4.pl3) version of the TITAN Log Viewer plug-in. </description> <copyright> /******************************************************************************* -* Copyright (c) 2000-2015 Ericsson Telecom AB +* Copyright (c) 2000-2016 Ericsson Telecom AB * 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 @@ -144,20 +144,20 @@ This Agreement is governed by the laws of the State of New York and the intellec id="org.eclipse.titan.log.viewer" download-size="0" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.common" download-size="0" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.help" download-size="0" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100"/> + version="5.4.3.CRL_113_200_5_R4D_20160301-1100"/> </feature> diff --git a/Titanium_feature/Titanium_feature.iml b/Titanium_feature/Titanium_feature.iml index a3ad0437df..529092389c 100644 --- a/Titanium_feature/Titanium_feature.iml +++ b/Titanium_feature/Titanium_feature.iml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 diff --git a/Titanium_feature/feature.xml b/Titanium_feature/feature.xml index 5bb3b84957..8d92298558 100755 --- a/Titanium_feature/feature.xml +++ b/Titanium_feature/feature.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 @@ -10,17 +10,17 @@ <feature id="Titanium" label="Titanium_Feature" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" provider-name="Eclipse Titan Project"> <description url="http://ttcn.ericsson.se/download/update_site/releasenotes.pdf"> - CRL 113 200/5 R4C (5.4.pl2) version of the Titanium + CRL 113 200/5 R4D (5.4.pl3) version of the Titanium plug-in. </description> <copyright> /******************************************************************************* -* Copyright (c) 2000-2015 Ericsson Telecom AB +* Copyright (c) 2000-2016 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -167,28 +167,28 @@ This Agreement is governed by the laws of the State of New York and the intellec id="org.eclipse.titanium" download-size="3841" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.designer" download-size="5894" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.help" download-size="10546" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> <plugin id="org.eclipse.titan.common" download-size="532" install-size="0" - version="5.4.2.CRL_113_200_5_R4C_20160105-1100" + version="5.4.3.CRL_113_200_5_R4D_20160301-1100" unpack="false"/> </feature> diff --git a/automatic_build/build_config.xml b/automatic_build/build_config.xml index 42d0c096f7..414e12fffc 100644 --- a/automatic_build/build_config.xml +++ b/automatic_build/build_config.xml @@ -10,7 +10,7 @@ <project basedir="." name="config"> <!-- The qualifier of the features --> - <property name="version" value="5.4.2.CRL_113_200_5_R4C"/> + <property name="version" value="5.4.3.CRL_113_200_5_R4D"/> <tstamp/> <property name="timestamp" value="${DSTAMP}-${TSTAMP}"/> <property name="version.qualifier" value="${version}_${timestamp}"/> diff --git a/org.eclipse.titan.common/META-INF/MANIFEST.MF b/org.eclipse.titan.common/META-INF/MANIFEST.MF index 8dde50182d..748a4c5bac 100755 --- a/org.eclipse.titan.common/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.common/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Created-By: 23.6-b04 (Oracle Corporation) Bundle-ManifestVersion: 2 Bundle-Name: Common TITAN on Eclipse Plug-in Bundle-SymbolicName: org.eclipse.titan.common;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titan.common.Activator Bundle-Vendor: Eclipse Titan Project Require-Bundle: org.eclipse.ui, diff --git a/org.eclipse.titan.common/plugin.xml b/org.eclipse.titan.common/plugin.xml index 4ae6ae18e6..bd9abda91b 100644 --- a/org.eclipse.titan.common/plugin.xml +++ b/org.eclipse.titan.common/plugin.xml @@ -1,75 +1,64 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?eclipse version="3.2"?> +<?eclipse version="4.4"?> <plugin> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.common.actions.FormatLog" - id="org.eclipse.titan.common.actions.FormatLog" - name="FormatLog"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.common.actions.MergeLog" - id="org.eclipse.titan.common.actions.MergeLog" - name="FormatLog"/></extension> - <extension - point="org.eclipse.ui.menus"> - <menuContribution - locationURI="popup:org.eclipse.ui.popup.any?after=additions"> - <menu - label="Titan log"> - <command - commandId="org.eclipse.titan.common.actions.FormatLog" - label="Format log"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IResource"> - <test property="org.eclipse.core.resources.name" value="*.log"/> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.common.actions.MergeLog" - label="Merge log"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IResource"> - <test property="org.eclipse.core.resources.name" value="*.log"/> - </adapt> - </iterate> - </with> - </visibleWhen> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.common.actions.FormatLog" + id="org.eclipse.titan.common.actions.FormatLog" name="FormatLog" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.common.actions.MergeLog" + id="org.eclipse.titan.common.actions.MergeLog" name="FormatLog" /> + </extension> + <extension point="org.eclipse.ui.menus"> + <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> + <menu label="Titan log"> + <command commandId="org.eclipse.titan.common.actions.FormatLog" + label="Format log"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IResource"> + <test property="org.eclipse.core.resources.name" + value="*.log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.common.actions.MergeLog" + label="Merge log"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IResource"> + <test property="org.eclipse.core.resources.name" + value="*.log" /> + </adapt> + </iterate> + </with> + </visibleWhen> - </command> - </menu> + </command> + </menu> </menuContribution> - </extension> + </extension> - <extension - point="org.eclipse.core.runtime.preferences"> - <initializer class="org.eclipse.titan.common.preferences.PreferenceInitializer"/> + <extension point="org.eclipse.core.runtime.preferences"> + <initializer + class="org.eclipse.titan.common.preferences.PreferenceInitializer" /> </extension> <extension point="org.eclipse.ui.preferencePages"> <page id="org.eclipse.titan.common.preferences.pages.TITANCommonPreferencePage" class="org.eclipse.titan.common.preferences.pages.TITANCommonPreferencePage" - name="TITAN Common Preferences"/> + name="TITAN Common Preferences" /> </extension> </plugin> diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/actions/MergeLog.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/actions/MergeLog.java index d234873823..478944ef2f 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/actions/MergeLog.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/actions/MergeLog.java @@ -36,7 +36,6 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.Activator; import org.eclipse.titan.common.graphics.ImageCache; import org.eclipse.titan.common.log.merge.LogMerger; @@ -123,7 +122,7 @@ public final class MergeLog extends AbstractHandler implements IWorkbenchWindowA * target of the merge. */ private void displayOutputSelectionDialog() { - final FileDialog dialog = new FileDialog(new Shell(Display.getDefault()), SWT.SAVE); + final FileDialog dialog = new FileDialog(null, SWT.SAVE); if (staticOutput != null) { dialog.setFileName(staticOutput.getName()); dialog.setFilterPath(staticOutput.getParent()); @@ -212,7 +211,7 @@ public final class MergeLog extends AbstractHandler implements IWorkbenchWindowA "Overwrite" }; MessageDialogWithToggle msgDialog = new MessageDialogWithToggle( - new Shell(Display.getDefault()), + null, "File already exists", null, "An error occured during log file merging. The file '" diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/logging/ErrorReporter.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/logging/ErrorReporter.java index 9c4e55ddd3..3db9dd0218 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/logging/ErrorReporter.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/logging/ErrorReporter.java @@ -13,7 +13,6 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.product.ProductConstants; import org.eclipse.ui.IEditorPart; @@ -170,7 +169,7 @@ public final class ErrorReporter { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), title, message); //$NON-NLS-1$ + MessageDialog.openError(null, title, message); //$NON-NLS-1$ } }); } @@ -184,7 +183,7 @@ public final class ErrorReporter { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), title, message); + MessageDialog.openWarning(null, title, message); } }); } diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/LocationAST.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/LocationAST.java index 2ef4dd360a..ae861a67d0 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/LocationAST.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/LocationAST.java @@ -46,8 +46,7 @@ public class LocationAST { sb.append("" + mRule.stop + ", "); sb.append("" + mRule.getChildCount() + ", " ); sb.append(mRule.getText() + "}" ); - } - else { + } else { sb.append("null"); } sb.append(", " ); diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/TitanListener.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/TitanListener.java index 9803a1adcc..7cb46db978 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/TitanListener.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/TitanListener.java @@ -23,7 +23,7 @@ public class TitanListener extends BaseErrorListener { public TitanListener() { this.errorsStored = new ArrayList<SyntacticErrorStorage>(); } - public TitanListener(ArrayList<SyntacticErrorStorage> storage) { + public TitanListener(List<SyntacticErrorStorage> storage) { this.errorsStored = storage; } diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CFGNumber.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CFGNumber.java index 8a455acadf..c0191a0a7f 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CFGNumber.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CFGNumber.java @@ -11,13 +11,18 @@ import java.math.BigInteger; /** * @author Kristof Szabados - * */ + * @author Arpad Lovassy + */ public final class CFGNumber { private static final String DIV_BY_ZERO = "Division by zero"; private boolean isFloatNumber; private float floatNumber; private BigInteger intNumber; + /** + * Constructor + * @param text the string representation of the number. The constructor will decide if it will be stored as float or integer + */ public CFGNumber(final String text) { try { floatNumber = Float.parseFloat(text); @@ -33,6 +38,9 @@ public final class CFGNumber { return isFloatNumber; } + /** + * @return this + num + */ public void add(final CFGNumber num) { if (isFloatNumber) { if (num.isFloatNumber) { @@ -50,6 +58,29 @@ public final class CFGNumber { } } + /** + * @return this - num + */ + public void sub(final CFGNumber num) { + if (isFloatNumber) { + if (num.isFloatNumber) { + floatNumber -= num.floatNumber; + } else { + floatNumber -= num.intNumber.floatValue(); + } + } else { + if (num.isFloatNumber) { + isFloatNumber = true; + floatNumber = intNumber.floatValue() - num.floatNumber; + } else { + intNumber = intNumber.subtract(num.intNumber); + } + } + } + + /** + * @return this * num + */ public void mul(final int num) { if (isFloatNumber) { floatNumber *= num; @@ -58,6 +89,9 @@ public final class CFGNumber { } } + /** + * @return this * num + */ public void mul(final CFGNumber num) { if (isFloatNumber) { if (num.isFloatNumber) { @@ -75,6 +109,10 @@ public final class CFGNumber { } } + /** + * @return this / num + * @throws ArithmeticException if num == 0 + */ public void div(final CFGNumber num) throws ArithmeticException { if (isFloatNumber) { if (num.isFloatNumber) { @@ -108,7 +146,7 @@ public final class CFGNumber { public String toString() { if (isFloatNumber) { // "Infinity" is not a valid value in a configuration file. - if ((floatNumber == Float.NEGATIVE_INFINITY) || (floatNumber == Float.POSITIVE_INFINITY)) { + if (Float.isInfinite(floatNumber)) { return "0.0"; } return Float.toString(floatNumber); @@ -116,4 +154,26 @@ public final class CFGNumber { return intNumber.toString(); } + + /** + * @return float value of the number + */ + public Double getValue() { + if ( isFloatNumber ) { + return new Double( floatNumber ); + } else { + return intNumber.doubleValue(); + } + } + + /** + * @return integer value, or null if number is float + */ + public Integer getIntegerValue() { + if ( isFloatNumber ) { + return null; + } else { + return intNumber.intValue(); + } + } } diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgAnalyzer.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgAnalyzer.java index ea36737a5d..be798adc4d 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgAnalyzer.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgAnalyzer.java @@ -66,6 +66,11 @@ public final class CfgAnalyzer { private LoggingSectionHandler loggingSectionHandler = null; private ParserRuleContext mParseTreeRoot = null; private String mLogFileName = null; + private Integer mTcpPort = null; + private String mLocalAddress = null; + private Double mKillTimer = null; + private Integer mNumHcs = null; + private Boolean mUnixDomainSocket = null; public List<TITANMarker> getWarnings() { return warnings; @@ -83,6 +88,26 @@ public final class CfgAnalyzer { return mLogFileName; } + public Integer getTcpPort() { + return mTcpPort; + } + + public String getLocalAddress() { + return mLocalAddress; + } + + public Double getKillTimer() { + return mKillTimer; + } + + public Integer getNumHcs() { + return mNumHcs; + } + + public Boolean isUnixDomainSocketEnabled() { + return mUnixDomainSocket; + } + public Map<String, CfgDefinitionInformation> getDefinitions(){ return definitions; } @@ -146,11 +171,9 @@ public final class CfgAnalyzer { public List<SyntacticErrorStorage> getErrorStorage() { if (!lexerListener.getErrorsStored().isEmpty() && parserListener.getErrorsStored().isEmpty()) { return lexerListener.getErrorsStored(); - } - else if (lexerListener.getErrorsStored().isEmpty() && !parserListener.getErrorsStored().isEmpty()) { + } else if (lexerListener.getErrorsStored().isEmpty() && !parserListener.getErrorsStored().isEmpty()) { return parserListener.getErrorsStored(); - } - else if (!lexerListener.getErrorsStored().isEmpty() && !parserListener.getErrorsStored().isEmpty()) { + } else if (!lexerListener.getErrorsStored().isEmpty() && !parserListener.getErrorsStored().isEmpty()) { if (lexerListener.addAll(parserListener.getErrorsStored())) { return lexerListener.getErrorsStored(); } @@ -186,8 +209,7 @@ public final class CfgAnalyzer { Reader reader = null; if (null != code) { reader = new StringReader(code); - } - else if (null != file) { + } else if (null != file) { try { reader = new BufferedReader(new InputStreamReader(file.getContents(), StandardCharsets.UTF8)); } catch (CoreException e) { @@ -217,7 +239,8 @@ public final class CfgAnalyzer { //TODO: implement: fill rootInterval if needed definitions = parser.getDefinitions(); - mExecuteElements = parser.getExecuteElements(); + final CfgParseResult cfgParseResult = parser.getCfgParseResult(); + mExecuteElements = cfgParseResult.getExecuteElements(); includeFiles = parser.getIncludeFiles(); // fill handlers @@ -233,8 +256,12 @@ public final class CfgAnalyzer { defineSectionHandler = parser.getDefineSectionHandler(); loggingSectionHandler = parser.getLoggingSectionHandler(); - logFileNameDefined = parser.isLogFileDefined(); - mLogFileName = parser.getLogFileName(); + logFileNameDefined = cfgParseResult.isLogFileDefined(); + mLogFileName = cfgParseResult.getLogFileName(); + mTcpPort = cfgParseResult.getTcpPort(); + mLocalAddress = cfgParseResult.getLocalAddress(); + mKillTimer = cfgParseResult.getKillTimer(); + mNumHcs = cfgParseResult.getNumHcs(); + mUnixDomainSocket = cfgParseResult.isUnixDomainSocket(); } - } diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParseResult.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParseResult.java index cbd5a1ee0b..e507e904d3 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParseResult.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParseResult.java @@ -27,21 +27,58 @@ public class CfgParseResult { private List<String> mIncludeFiles = new ArrayList<String>(); + /** + * true if and only if LogFile parameter is defined in [LOGGING] section + */ private boolean mLogFileDefined = false; + /** + * Format string of the log file. <br> + * This value is read from the [LOGGING] section with this parameter: + * <pre> + * LogFile := "<log_file_name>" + * </pre> + * where log_file_name is a relative file name to the bin/ directory of the TTCN-3 project, + * it must contain "%n" (node), which will be for example "hc" or "mtc". <br> + * Example: + * <pre> + * LogFile := "../log/MyExample-%n.log" + * </pre> + * This will create the following log files if there is 1 HC: <br> + * <project_dir>/log/MyExample-hc.log <br> + * <project_dir>/log/MyExample-mtc.log + */ + private String mLogFileName = null; + private Integer mTcpPort = null; private String mLocalAddress = null; + /** + * Setting for kill timer (in seconds). + * The executing process is killed, if there is no answer form the Main Controller. <br> + * NOTE: this value has effect only for the Titan Eclipse Executor plug-in, works only in JNI Executor mode <br> + * This value is read from the [MAIN_CONTROLLER] section with this parameter: + * <pre> + * KillTimer := <float>; + * </pre> + */ private Double mKillTimer = null; + /** + * Number of Host Controllers. <br> + * This value is read from the [MAIN_CONTROLLER] section with this parameter: + * <pre> + * NumHCs := <integer>; + * </pre> + */ private Integer mNumHcs = null; private Boolean mUnixDomainSocket = null; private Map<String, String> mComponents = new HashMap<String, String>(); - private Map<String , String[]> mGroups = new HashMap<String, String[]>(); + private Map<String, String[]> mGroups = new HashMap<String, String[]>(); private List<String> mExecuteElements = new ArrayList<String>(); @@ -77,6 +114,14 @@ public class CfgParseResult { this.mLogFileDefined = aLogFileDefined; } + public String getLogFileName() { + return mLogFileName; + } + + public void setLogFileName(String aLogFileName) { + this.mLogFileName = aLogFileName; + } + public Integer getTcpPort() { return mTcpPort; } @@ -109,7 +154,7 @@ public class CfgParseResult { this.mNumHcs = aNumHcs; } - public Boolean getUnixDomainSocket() { + public Boolean isUnixDomainSocket() { return mUnixDomainSocket; } diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParser.g4 b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParser.g4 index 593f49ac8f..2fbd0b53db 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParser.g4 +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParser.g4 @@ -22,6 +22,16 @@ import java.util.Map; } @members{ + // format strings for error messages if definition (macro or environment variable) cannot be resolved + // %s : definition + private static final String DEFINITION_NOT_FOUND_STRING = "Could not resolve definition: %s using \"\" as a replacement."; + private static final String DEFINITION_NOT_FOUND_BSTR = "Could not resolve definition: %s using ''B as a replacement."; + private static final String DEFINITION_NOT_FOUND_HSTR = "Could not resolve definition: %s using ''H as a replacement."; + private static final String DEFINITION_NOT_FOUND_OSTR = "Could not resolve definition: %s using ''O as a replacement."; + private static final String DEFINITION_NOT_FOUND_INT = "Could not resolve integer definition: %s using 0 as replacement."; + private static final String DEFINITION_NOT_FOUND_FLOAT = "No macro or environmental variable defined %s could be found, using 0.0 as a replacement value."; + private static final String DEFINITION_NOT_FOUND_BOOLEAN = "Could not resolve definition: %s using \"true\" as a replacement."; + private List<TITANMarker> mWarnings = new ArrayList<TITANMarker>(); private List<ISection> mSections = new ArrayList<ISection>(); @@ -32,20 +42,10 @@ import java.util.Map; private IFile mActualFile = null; - private boolean mLogFileDefined = false; - - private String mLogFileName = null; - private Map<String, String> mEnvVariables; - private Integer mTcpPort = null; - private String mLocalAddress = null; - private Double mKillTimer = null; - private Integer mNumHcs = null; - private Boolean mUnixDomainSocket = null; - private Map<String, String> mComponents = new HashMap<String, String>(); - private Map<String , String[]> mGroups = new HashMap<String, String[]>(); - private List<String> mExecuteElements = new ArrayList<String>(); + private CfgParseResult mCfgParseResult = new CfgParseResult(); + private int mLine = 1; private int mOffset = 0; @@ -89,44 +89,8 @@ import java.util.Map; mActualFile = file; } - public boolean isLogFileDefined() { - return mLogFileDefined; - } - - public String getLogFileName() { - return mLogFileName; - } - - public Integer getTcpPort() { - return mTcpPort; - } - - public String getLocalAddress() { - return mLocalAddress; - } - - public Double getKillTimer() { - return mKillTimer; - } - - public Integer getNumHcs() { - return mNumHcs; - } - - public Boolean isUnixDomainSocketEnabled() { - return mUnixDomainSocket; - } - - public Map<String, String> getComponents() { - return mComponents; - } - - public Map<String, String[]> getGroups() { - return mGroups; - } - - public List<String> getExecuteElements() { - return mExecuteElements; + public CfgParseResult getCfgParseResult() { + return mCfgParseResult; } public void setEnvironmentalVariables(Map<String, String> aEnvVariables){ @@ -225,6 +189,84 @@ import java.util.Map; return null; } } + + /** + * Gets the macro value string of a macro (without type) + * @param aMacroToken the macro token + * @param aErrorFormatStr format strings for error messages if definition (macro or environment variable) cannot be resolved + * %s : definition + * @return the macro value string + * or "" if macro is invalid. In this case an error marker is also created + */ + private String getMacroValue( Token aMacroToken, String aErrorFormatStr ) { + String definition = aMacroToken.getText().substring( 1, aMacroToken.getText().length() ); + String value = getDefinitionValue( definition ); + if ( value == null ) { + String errorMsg = String.format( aErrorFormatStr, definition ); + reportError( errorMsg, aMacroToken, aMacroToken ); + return ""; + } + return value; + } + + /** + * Gets the macro value string of a macro (without type) + * @param aMacroRule the macro rule + * @param aErrorFormatStr format strings for error messages if definition (macro or environment variable) cannot be resolved + * %s : definition + * @return the macro value string + * or "" if macro is invalid. In this case an error marker is also created + */ + private String getMacroValue( ParserRuleContext aMacroRule, String aErrorFormatStr ) { + String definition = aMacroRule.getText().substring( 1, aMacroRule.getText().length() ); + String value = getDefinitionValue( definition ); + if ( value == null ) { + String errorMsg = String.format( aErrorFormatStr, definition ); + reportError( errorMsg, aMacroRule.start, aMacroRule.stop ); + return ""; + } + return value; + } + + /** + * Gets the macro value string of a macro (with type) + * @param aMacroToken the macro token + * @param aErrorFormatStr format strings for error messages if definition (macro or environment variable) cannot be resolved + * %s : definition + * @return the macro value string + * or "" if macro is invalid. In this case an error marker is also created + */ + private String getTypedMacroValue( Token aMacroToken, String aErrorFormatStr ) { + int commaPosition = aMacroToken.getText().indexOf( ',' ); + String definition = aMacroToken.getText().substring( 2, commaPosition ); + String value = getDefinitionValue( definition ); + if ( value == null ) { + String errorMsg = String.format( aErrorFormatStr, definition ); + reportError( errorMsg, aMacroToken, aMacroToken ); + return ""; + } + return value; + } + + /** + * Gets the macro value string of a macro (with type) + * @param aMacroRule the macro rule + * @param aErrorFormatStr format strings for error messages if definition (macro or environment variable) cannot be resolved + * %s : definition + * @return the macro value string + * or "" if macro is invalid. In this case an error marker is also created + */ + private String getTypedMacroValue( ParserRuleContext aMacroRule, String aErrorFormatStr ) { + int commaPosition = aMacroRule.getText().indexOf( ',' ); + String definition = aMacroRule.getText().substring( 2, commaPosition ); + String value = getDefinitionValue( definition ); + if ( value == null ) { + String errorMsg = String.format( aErrorFormatStr, definition ); + reportError( errorMsg, aMacroRule.start, aMacroRule.stop ); + return ""; + } + return value; + } } options{ @@ -244,8 +286,7 @@ pr_ConfigFile: pr_Section returns [ ISection section ]: { $section = null; } -( pr_DefaultSection -| pr_MainControllerSection +( pr_MainControllerSection | i = pr_IncludeSection { $section = $i.includeSection; } | pr_OrderedIncludeSection | pr_ExecuteSection @@ -260,13 +301,6 @@ pr_Section returns [ ISection section ]: ) ; -pr_DefaultSection: -( WS -| LINE_COMMENT -| BLOCK_COMMENT -) -; - pr_MainControllerSection: MAIN_CONTROLLER_SECTION ( pr_MainControllerItem SEMICOLON1? @@ -284,36 +318,30 @@ pr_MainControllerItem: pr_MainControllerItemUnixDomainSocket: UNIXSOCKETS1 ASSIGNMENTCHAR1 u = (YES1 | NO1) SEMICOLON1? - { mUnixDomainSocket = Boolean.parseBoolean( $u.getText() ); + { mCfgParseResult.setUnixDomainSocket( Boolean.parseBoolean( $u.getText() ) ); } ; pr_MainControllerItemKillTimer: KILLTIMER1 ASSIGNMENTCHAR1 k = pr_ArithmeticValueExpression SEMICOLON1? - { try { - mKillTimer = Double.parseDouble( $k.text ); - } catch( NumberFormatException e ) {} + { mCfgParseResult.setKillTimer( $k.number.getValue() ); } ; pr_MainControllerItemLocalAddress: LOCALADDRESS1 ASSIGNMENTCHAR1 l = pr_HostName SEMICOLON1? - { mLocalAddress = $l.text; } + { mCfgParseResult.setLocalAddress( $l.text ); } ; pr_MainControllerItemNumHcs: NUMHCS1 ASSIGNMENTCHAR1 n = pr_IntegerValueExpression SEMICOLON1? - { try { - mNumHcs = Integer.parseInt( $n.text ); - } catch( NumberFormatException e ) {} + { mCfgParseResult.setNumHcs( $n.number.getIntegerValue() ); } ; pr_MainControllerItemTcpPort: TCPPORT1 ASSIGNMENTCHAR1 t = pr_IntegerValueExpression SEMICOLON1? - { try { - mTcpPort = Integer.parseInt( $t.text ); - } catch( NumberFormatException e ) {} + { mCfgParseResult.setTcpPort( $t.number.getIntegerValue() ); } ; @@ -341,7 +369,7 @@ pr_ExecuteSection: ; pr_ExecuteSectionItem: - t = TEST3 { mExecuteElements.add( $t.getText() ); } + t = TEST3 { mCfgParseResult.getExecuteElements().add( $t.getText() ); } SEMICOLON3? ; @@ -438,16 +466,20 @@ pr_DisableCoverage: pr_DatabaseFile: DATABASEFILE ASSIGNMENTCHAR12 - ( STRING12 - | MACRO12 - ) + pr_DatabaseFilePart ( AND12 - ( STRING12 - | MACRO12 - ) + pr_DatabaseFilePart )* ; +pr_DatabaseFilePart: +( STRING12 +| macro = MACRO12 + { String value = getMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); + //TODO: implement: use value if needed + } +); + pr_AggregateData: AGGREGATEDATA ASSIGNMENTCHAR12 @@ -459,16 +491,22 @@ pr_AggregateData: pr_StatisticsFile: STATISTICSFILE ASSIGNMENTCHAR12 - ( STRING12 - | MACRO12 - ) + pr_StatisticsFilePart ( AND12 - ( STRING12 - | MACRO12 - ) + pr_StatisticsFilePart )* ; +// currently it is the same as pr_DatabaseFilePart, +// but it will be different if value is used +pr_StatisticsFilePart: +( STRING12 +| macro = MACRO12 + { String value = getMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); + //TODO: implement: use value if needed + } +); + pr_DisableStatistics: DISABLESTATISTICS ASSIGNMENTCHAR12 @@ -587,15 +625,12 @@ pr_PlainLoggingParam: | LOGFILENUMBER ASSIGNMENTCHAR11 pr_Number | LOGFILESIZE ASSIGNMENTCHAR11 pr_Number | LOGFILENAME ASSIGNMENTCHAR11 f = pr_LogfileName - { mLogFileDefined = true; - mLogFileName = $f.text; - if ( mLogFileName != null ) { - if ( mLogFileName.length() > 0 && mLogFileName.startsWith( "\"" ) ) { - mLogFileName = mLogFileName.substring( 1 ); - } - if ( mLogFileName.length() > 0 && mLogFileName.endsWith( "\"" ) ) { - mLogFileName = mLogFileName.substring( 0, mLogFileName.length() - 1 ); - } + { mCfgParseResult.setLogFileDefined( true ); + String logFileName = $f.text; + if ( logFileName != null ) { + // remove quotes + logFileName = logFileName.replaceAll("^\"|\"$", ""); + mCfgParseResult.setLogFileName( logFileName ); } } | (TIMESTAMPFORMAT | CONSOLETIMESTAMPFORMAT) ASSIGNMENTCHAR11 TIMESTAMPVALUE @@ -718,8 +753,8 @@ pr_Detailed: pr_ComponentItem: n = pr_ComponentName ASSIGNMENTCHAR10 - ( h = pr_HostName { mComponents.put( $n.text, $h.text ); } - | i = IPV6_10 { mComponents.put( $n.text, $i.getText() ); } + ( h = pr_HostName { mCfgParseResult.getComponents().put( $n.text, $h.text ); } + | i = IPV6_10 { mCfgParseResult.getComponents().put( $n.text, $i.getText() ); } ) ; @@ -732,7 +767,10 @@ pr_ComponentName: pr_HostName: ( pr_DNSName | TTCN3IDENTIFIER1 | TTCN3IDENTIFIER10 -| MACRO_HOSTNAME1 | MACRO_HOSTNAME10 +| macro = (MACRO_HOSTNAME1 | MACRO_HOSTNAME10) + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); + //TODO: implement: use value if needed + } ) ; @@ -811,103 +849,98 @@ pr_TestportName: ) ; -pr_Identifier: -( MACRO_ID7 | MACRO_ID8 | MACRO_ID9 | MACRO_ID10 | MACRO_ID11 -| TTCN3IDENTIFIER7 | TTCN3IDENTIFIER8 | TTCN3IDENTIFIER9 | TTCN3IDENTIFIER10 | TTCN3IDENTIFIER11 +pr_Identifier returns [String identifier]: +( macro = (MACRO_ID7 | MACRO_ID8 | MACRO_ID9 | MACRO_ID10 | MACRO_ID11) + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); + $identifier = value; + } +| a = (TTCN3IDENTIFIER7 | TTCN3IDENTIFIER8 | TTCN3IDENTIFIER9 | TTCN3IDENTIFIER10 | TTCN3IDENTIFIER11) + { $identifier = $a.getText(); } ) ; -pr_IntegerValueExpression: - pr_IntegerAddExpression +pr_IntegerValueExpression returns [CFGNumber number]: + a = pr_IntegerAddExpression { $number = $a.number; } ; -pr_IntegerAddExpression: - pr_IntegerMulExpression - ( ( PLUS1 | PLUS7 | PLUS9 - | MINUS1 | MINUS7 | MINUS9 - ) - pr_IntegerMulExpression +pr_IntegerAddExpression returns [CFGNumber number]: + a = pr_IntegerMulExpression { $number = $a.number; } + ( ( PLUS1 | PLUS7 | PLUS9 ) b1 = pr_IntegerMulExpression { $number.add($b1.number); } + | ( MINUS1 | MINUS7 | MINUS9 ) b2 = pr_IntegerMulExpression { $b2.number.mul(-1); $number.add($b2.number); } )* ; -pr_IntegerMulExpression: - pr_IntegerUnaryExpression - ( ( STAR1 | STAR7 | STAR9 - | SLASH1 | SLASH7 | SLASH9 - ) - pr_IntegerUnaryExpression +pr_IntegerMulExpression returns [CFGNumber number]: + a = pr_IntegerUnaryExpression { $number = $a.number; } + ( ( STAR1 | STAR7 | STAR9 ) b1 = pr_IntegerUnaryExpression { $number.mul($b1.number); } + | ( SLASH1 | SLASH7 | SLASH9 ) b2 = pr_IntegerUnaryExpression + { try { + $number.div($b2.number); + } catch ( ArithmeticException e ) { + // division by 0 + reportError( e.getMessage(), $a.start, $b2.stop ); + $number = new CFGNumber( "0" ); + } + } )* ; -pr_IntegerUnaryExpression: - ( PLUS1 | PLUS7 | PLUS9 - | MINUS1 | MINUS7 | MINUS9 - )? - pr_IntegerPrimaryExpression +pr_IntegerUnaryExpression returns [CFGNumber number]: +{ boolean negate = false; +} + ( (PLUS1 | PLUS7 | PLUS9) + | (MINUS1 | MINUS7 | MINUS9) { negate = !negate; } + )* + a = pr_IntegerPrimaryExpression + { $number = $a.number; + if ( negate ) { + $number.mul( -1 ); + } + } ; -pr_IntegerPrimaryExpression: -( pr_Number -| LPAREN1 pr_IntegerAddExpression RPAREN1 -| LPAREN7 pr_IntegerAddExpression RPAREN7 -| LPAREN9 pr_IntegerAddExpression RPAREN9 +pr_IntegerPrimaryExpression returns [CFGNumber number]: +( a = pr_Number { $number = $a.number; } +| LPAREN1 b = pr_IntegerAddExpression RPAREN1 { $number = $b.number; } +| LPAREN7 c = pr_IntegerAddExpression RPAREN7 { $number = $c.number; } +| LPAREN9 d = pr_IntegerAddExpression RPAREN9 { $number = $d.number; } ) ; -pr_Number: -( NUMBER1 | NUMBER7 | NUMBER9 | NUMBER11 -| MACRO_INT1 | MACRO_INT7 | MACRO_INT9 | MACRO_INT11 +pr_Number returns [CFGNumber number]: +( a = (NUMBER1 | NUMBER7 | NUMBER9 | NUMBER11) {$number = new CFGNumber($a.text);} +| macro = (MACRO_INT1 | MACRO_INT7 | MACRO_INT9 | MACRO_INT11) + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_INT ); + $number = new CFGNumber( value.length() > 0 ? value : "0" ); + } ) ; -pr_StringValue: - pr_CString - ( (STRINGOP1 | STRINGOP7 | STRINGOP9 | STRINGOP11) pr_CString +pr_StringValue returns [String string]: + a = pr_CString { $string = $a.string.replaceAll("^\"|\"$", ""); } + ( (STRINGOP1 | STRINGOP7 | STRINGOP9 | STRINGOP11) b = pr_CString { $string = $string + $b.string.replaceAll("^\"|\"$", ""); } )* + { $string = "\"" + $string + "\""; } ; -pr_CString: -( STRING1 | STRING7 | STRING9 | STRING11 -| macro2 = pr_MacroCString - { -//TODO -/* - String definition = $macro2.text.substring(1, $macro2.text.length()); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if ( value != null ) { - tempAST.initialize(STRING,"\""+value+"\""); - } else { - tempAST.initialize(STRING,"\"\""); - reportError( "Could not resolve definition: " + definition + " using \"\" as a replacement.", $macro2.start, $macro2.stop ); - } -//*/ - } -| macro1 = pr_MacroExpliciteCString - { -//TODO -/* - int commaPosition = $macro1.text.indexOf(','); - String definition = $macro1.text.substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if ( value != null ) { - tempAST.initialize(STRING,"\""+value+"\""); - } else { - tempAST.initialize(STRING,"\"\""); - reportError( "Could not resolve definition: " + definition + " using \"\" as a replacement.", $macro1.start, $macro1.stop ); - } -//*/ +pr_CString returns [String string]: +( a = (STRING1 | STRING7 | STRING9 | STRING11) + { + $string = $a.text; } +| macro2 = pr_MacroCString { $string = "\"" + $macro2.string + "\""; } +| macro1 = pr_MacroExpliciteCString { $string = "\"" + $macro1.string + "\""; } ) ; -pr_MacroCString: - (MACRO1 | MACRO7 | MACRO9 | MACRO11) +pr_MacroCString returns [String string]: + macro = (MACRO1 | MACRO7 | MACRO9 | MACRO11) + { $string = getMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); } ; -pr_MacroExpliciteCString: - (MACRO_EXP_CSTR1 | MACRO_EXP_CSTR7 | MACRO_EXP_CSTR9 | MACRO_EXP_CSTR11) +pr_MacroExpliciteCString returns [String string]: + macro = (MACRO_EXP_CSTR1 | MACRO_EXP_CSTR7 | MACRO_EXP_CSTR9 | MACRO_EXP_CSTR11) + { $string = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_STRING ); } ; pr_GroupItem: @@ -925,7 +958,7 @@ pr_GroupItem: )* ) ) -{ mGroups.put( $a.text, memberlist.toArray( new String[ memberlist.size() ] ) ); +{ mCfgParseResult.getGroups().put( $a.text, memberlist.toArray( new String[ memberlist.size() ] ) ); } ; @@ -995,53 +1028,74 @@ pr_LengthBound: pr_IntegerValueExpression ; -pr_ArithmeticValueExpression: - pr_ArithmeticAddExpression +pr_ArithmeticValueExpression returns [CFGNumber number]: + a = pr_ArithmeticAddExpression { $number = $a.number; } ; -pr_ArithmeticAddExpression: - pr_ArithmeticMulExpression - ( ( PLUS1 | PLUS9 - | MINUS1 | MINUS9 - ) - pr_ArithmeticMulExpression +pr_ArithmeticAddExpression returns [CFGNumber number]: + a = pr_ArithmeticMulExpression { $number = $a.number; } + ( ( PLUS1 | PLUS9 ) b1 = pr_ArithmeticMulExpression { $number.add($b1.number); } + | ( MINUS1 | MINUS9 ) b2 = pr_ArithmeticMulExpression { $b2.number.mul(-1); $number.add($b2.number); } )* ; -pr_ArithmeticMulExpression: - pr_ArithmeticUnaryExpression - ( ( STAR1 | STAR9 - | SLASH1 | SLASH9 - ) - pr_ArithmeticUnaryExpression +pr_ArithmeticMulExpression returns [CFGNumber number]: + a = pr_ArithmeticUnaryExpression { $number = $a.number; } + ( ( STAR1 | STAR9 ) b1 = pr_ArithmeticUnaryExpression { $number.mul($b1.number); } + | ( SLASH1 | SLASH9 ) b2 = pr_ArithmeticUnaryExpression + { try { + $number.div($b2.number); + } catch ( ArithmeticException e ) { + // division by 0 + reportError( e.getMessage(), $a.start, $b2.stop ); + $number = new CFGNumber( "0.0" ); + } + } )* ; -pr_ArithmeticUnaryExpression: - ( PLUS1 | PLUS9 - | MINUS1 | MINUS9 +pr_ArithmeticUnaryExpression returns [CFGNumber number]: +{ boolean negate = false; +} + ( ( PLUS1 | PLUS9 ) + | ( MINUS1 | MINUS9 ) { negate = !negate; } )* - pr_ArithmeticPrimaryExpression + a = pr_ArithmeticPrimaryExpression + { $number = $a.number; + if ( negate ) { + $number.mul( -1 ); + } + } ; -pr_ArithmeticPrimaryExpression: -( pr_Float -| pr_Number -| LPAREN1 pr_ArithmeticAddExpression RPAREN1 -| LPAREN9 pr_ArithmeticAddExpression RPAREN9 +pr_ArithmeticPrimaryExpression returns [CFGNumber number]: +( a = pr_Float {$number = $a.number;} +| b = pr_Number {$number = $b.number;} +| LPAREN1 c = pr_ArithmeticAddExpression RPAREN1 {$number = $c.number;} +| LPAREN9 d = pr_ArithmeticAddExpression RPAREN9 {$number = $d.number;} ) ; -pr_Float: -( FLOAT1 | FLOAT9 -| MACRO_FLOAT1 | MACRO_FLOAT9 +pr_Float returns [CFGNumber number]: +( a = (FLOAT1 | FLOAT9) {$number = new CFGNumber($a.text);} +| macro = (MACRO_FLOAT1 | MACRO_FLOAT9) + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_FLOAT ); + $number = new CFGNumber( value.length() > 0 ? value : "0.0" ); + } ) ; -pr_Boolean: -( TRUE9 | TRUE11 -| FALSE9 | FALSE11 -| MACRO_BOOL9 | MACRO_BOOL11 +pr_Boolean returns [String string]: +( t = (TRUE9 | TRUE11) { $string = $t.getText(); } +| f = (FALSE9 | FALSE11) { $string = $f.getText(); } +| macro = (MACRO_BOOL9 | MACRO_BOOL11) + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_BOOLEAN ); + if ( "false".equals( value ) ) { + $string = "false"; + } else { + $string = "true"; + } + } ) ; @@ -1068,9 +1122,12 @@ pr_BStringValue: pr_BString ( STRINGOP9 pr_BString )* ; -pr_BString: -( BITSTRING9 -| MACRO_BSTR9 +pr_BString returns [String string]: +( b = BITSTRING9 { $string = $b.getText(); } +| macro = MACRO_BSTR9 + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_BSTR ); + $string = "'" + value + "'B"; + } ) ; @@ -1078,9 +1135,12 @@ pr_HStringValue: pr_HString ( STRINGOP9 pr_HString )* ; -pr_HString: -( HEXSTRING9 -| MACRO_HSTR9 +pr_HString returns [String string]: +( h = HEXSTRING9 { $string = $h.getText(); } +| macro = MACRO_HSTR9 + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_HSTR ); + $string = "'" + value + "'H"; + } ) ; @@ -1088,10 +1148,16 @@ pr_OStringValue: pr_OString ( STRINGOP9 pr_OString )* ; -pr_OString: -( OCTETSTRING9 -| MACRO_OSTR9 -| MACRO_BINARY9 +pr_OString returns [String string]: +( o = OCTETSTRING9 { $string = $o.getText(); } +| macro = MACRO_OSTR9 + { String value = getTypedMacroValue( $macro, DEFINITION_NOT_FOUND_OSTR ); + $string = "'" + value + "'0"; + } +| macro_bin = MACRO_BINARY9 + { String value = getTypedMacroValue( $macro_bin, DEFINITION_NOT_FOUND_STRING ); + $string = value; + } ) ; diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserBaseListener.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserBaseListener.java deleted file mode 100644 index 328afec24a..0000000000 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserBaseListener.java +++ /dev/null @@ -1,1626 +0,0 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * 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 - ******************************************************************************/ -// Generated from CfgParser.g4 by ANTLR 4.3 -package org.eclipse.titan.common.parsers.cfg; - -import java.util.HashMap; - -import org.eclipse.titan.common.parsers.LocationAST; -import org.eclipse.titan.common.parsers.TITANMarker; -import org.eclipse.titan.common.parsers.cfg.indices.ComponentSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.DefineSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ExecuteSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ExternalCommandSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.GroupSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.IncludeSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.LoggingSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.MCSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ModuleParameterSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.TestportParameterSectionHandler; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IFile; - -import java.util.Map; - - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.misc.NotNull; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link CfgParserListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -public class CfgParserBaseListener implements CfgParserListener { - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItemTcpPort(@NotNull CfgParser.Pr_MainControllerItemTcpPortContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItemTcpPort(@NotNull CfgParser.Pr_MainControllerItemTcpPortContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ComponentSpecificLoggingParam(@NotNull CfgParser.Pr_ComponentSpecificLoggingParamContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ComponentSpecificLoggingParam(@NotNull CfgParser.Pr_ComponentSpecificLoggingParamContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArithmeticPrimaryExpression(@NotNull CfgParser.Pr_ArithmeticPrimaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArithmeticPrimaryExpression(@NotNull CfgParser.Pr_ArithmeticPrimaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_OString(@NotNull CfgParser.Pr_OStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_OString(@NotNull CfgParser.Pr_OStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerValueExpression(@NotNull CfgParser.Pr_IntegerValueExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerValueExpression(@NotNull CfgParser.Pr_IntegerValueExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StructuredValue(@NotNull CfgParser.Pr_StructuredValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StructuredValue(@NotNull CfgParser.Pr_StructuredValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggingParam(@NotNull CfgParser.Pr_LoggingParamContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggingParam(@NotNull CfgParser.Pr_LoggingParamContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerMulExpression(@NotNull CfgParser.Pr_IntegerMulExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerMulExpression(@NotNull CfgParser.Pr_IntegerMulExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItem(@NotNull CfgParser.Pr_MainControllerItemContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItem(@NotNull CfgParser.Pr_MainControllerItemContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_SimpleValue(@NotNull CfgParser.Pr_SimpleValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_SimpleValue(@NotNull CfgParser.Pr_SimpleValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItemKillTimer(@NotNull CfgParser.Pr_MainControllerItemKillTimerContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItemKillTimer(@NotNull CfgParser.Pr_MainControllerItemKillTimerContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MacroCString(@NotNull CfgParser.Pr_MacroCStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MacroCString(@NotNull CfgParser.Pr_MacroCStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_AggregateData(@NotNull CfgParser.Pr_AggregateDataContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_AggregateData(@NotNull CfgParser.Pr_AggregateDataContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_SimpleParameterValue(@NotNull CfgParser.Pr_SimpleParameterValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_SimpleParameterValue(@NotNull CfgParser.Pr_SimpleParameterValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_OrderedIncludeSection(@NotNull CfgParser.Pr_OrderedIncludeSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_OrderedIncludeSection(@NotNull CfgParser.Pr_OrderedIncludeSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_HostName(@NotNull CfgParser.Pr_HostNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_HostName(@NotNull CfgParser.Pr_HostNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerRange(@NotNull CfgParser.Pr_IntegerRangeContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerRange(@NotNull CfgParser.Pr_IntegerRangeContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_BString(@NotNull CfgParser.Pr_BStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_BString(@NotNull CfgParser.Pr_BStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_CString(@NotNull CfgParser.Pr_CStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_CString(@NotNull CfgParser.Pr_CStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DefinitionRValue(@NotNull CfgParser.Pr_DefinitionRValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DefinitionRValue(@NotNull CfgParser.Pr_DefinitionRValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FieldValue(@NotNull CfgParser.Pr_FieldValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FieldValue(@NotNull CfgParser.Pr_FieldValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ConfigFile(@NotNull CfgParser.Pr_ConfigFileContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ConfigFile(@NotNull CfgParser.Pr_ConfigFileContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatAddExpression(@NotNull CfgParser.Pr_FloatAddExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatAddExpression(@NotNull CfgParser.Pr_FloatAddExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_BStringValue(@NotNull CfgParser.Pr_BStringValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_BStringValue(@NotNull CfgParser.Pr_BStringValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatRange(@NotNull CfgParser.Pr_FloatRangeContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatRange(@NotNull CfgParser.Pr_FloatRangeContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LogEventType(@NotNull CfgParser.Pr_LogEventTypeContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LogEventType(@NotNull CfgParser.Pr_LogEventTypeContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_GroupsSection(@NotNull CfgParser.Pr_GroupsSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_GroupsSection(@NotNull CfgParser.Pr_GroupsSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StringRange(@NotNull CfgParser.Pr_StringRangeContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StringRange(@NotNull CfgParser.Pr_StringRangeContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_NULLKeyword(@NotNull CfgParser.Pr_NULLKeywordContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_NULLKeyword(@NotNull CfgParser.Pr_NULLKeywordContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPt_TestComponentID(@NotNull CfgParser.Pt_TestComponentIDContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPt_TestComponentID(@NotNull CfgParser.Pt_TestComponentIDContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Float(@NotNull CfgParser.Pr_FloatContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Float(@NotNull CfgParser.Pr_FloatContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItemUnixDomainSocket(@NotNull CfgParser.Pr_MainControllerItemUnixDomainSocketContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItemUnixDomainSocket(@NotNull CfgParser.Pr_MainControllerItemUnixDomainSocketContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DiskFullActionValue(@NotNull CfgParser.Pr_DiskFullActionValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DiskFullActionValue(@NotNull CfgParser.Pr_DiskFullActionValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Section(@NotNull CfgParser.Pr_SectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Section(@NotNull CfgParser.Pr_SectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_PlainLoggingParam(@NotNull CfgParser.Pr_PlainLoggingParamContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_PlainLoggingParam(@NotNull CfgParser.Pr_PlainLoggingParamContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArrayItem(@NotNull CfgParser.Pr_ArrayItemContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArrayItem(@NotNull CfgParser.Pr_ArrayItemContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_VerdictValue(@NotNull CfgParser.Pr_VerdictValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_VerdictValue(@NotNull CfgParser.Pr_VerdictValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerSection(@NotNull CfgParser.Pr_MainControllerSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerSection(@NotNull CfgParser.Pr_MainControllerSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StructuredValue2(@NotNull CfgParser.Pr_StructuredValue2Context ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StructuredValue2(@NotNull CfgParser.Pr_StructuredValue2Context ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ExecuteSectionItem(@NotNull CfgParser.Pr_ExecuteSectionItemContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ExecuteSectionItem(@NotNull CfgParser.Pr_ExecuteSectionItemContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArithmeticMulExpression(@NotNull CfgParser.Pr_ArithmeticMulExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArithmeticMulExpression(@NotNull CfgParser.Pr_ArithmeticMulExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArithmeticAddExpression(@NotNull CfgParser.Pr_ArithmeticAddExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArithmeticAddExpression(@NotNull CfgParser.Pr_ArithmeticAddExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StringValue(@NotNull CfgParser.Pr_StringValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StringValue(@NotNull CfgParser.Pr_StringValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerAddExpression(@NotNull CfgParser.Pr_IntegerAddExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerAddExpression(@NotNull CfgParser.Pr_IntegerAddExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_EnumeratedValue(@NotNull CfgParser.Pr_EnumeratedValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_EnumeratedValue(@NotNull CfgParser.Pr_EnumeratedValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ModuleParam(@NotNull CfgParser.Pr_ModuleParamContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ModuleParam(@NotNull CfgParser.Pr_ModuleParamContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_TestportParametersSection(@NotNull CfgParser.Pr_TestportParametersSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_TestportParametersSection(@NotNull CfgParser.Pr_TestportParametersSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatMulExpression(@NotNull CfgParser.Pr_FloatMulExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatMulExpression(@NotNull CfgParser.Pr_FloatMulExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DisableStatistics(@NotNull CfgParser.Pr_DisableStatisticsContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DisableStatistics(@NotNull CfgParser.Pr_DisableStatisticsContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ObjIdValue(@NotNull CfgParser.Pr_ObjIdValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ObjIdValue(@NotNull CfgParser.Pr_ObjIdValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LengthMatch(@NotNull CfgParser.Pr_LengthMatchContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LengthMatch(@NotNull CfgParser.Pr_LengthMatchContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggingBitMask(@NotNull CfgParser.Pr_LoggingBitMaskContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggingBitMask(@NotNull CfgParser.Pr_LoggingBitMaskContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArithmeticValueExpression(@NotNull CfgParser.Pr_ArithmeticValueExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArithmeticValueExpression(@NotNull CfgParser.Pr_ArithmeticValueExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FieldName(@NotNull CfgParser.Pr_FieldNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FieldName(@NotNull CfgParser.Pr_FieldNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DefineSection(@NotNull CfgParser.Pr_DefineSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DefineSection(@NotNull CfgParser.Pr_DefineSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ArithmeticUnaryExpression(@NotNull CfgParser.Pr_ArithmeticUnaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ArithmeticUnaryExpression(@NotNull CfgParser.Pr_ArithmeticUnaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ModuleParametersSection(@NotNull CfgParser.Pr_ModuleParametersSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ModuleParametersSection(@NotNull CfgParser.Pr_ModuleParametersSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DNSName(@NotNull CfgParser.Pr_DNSNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DNSName(@NotNull CfgParser.Pr_DNSNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItemLocalAddress(@NotNull CfgParser.Pr_MainControllerItemLocalAddressContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItemLocalAddress(@NotNull CfgParser.Pr_MainControllerItemLocalAddressContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ComponentItem(@NotNull CfgParser.Pr_ComponentItemContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ComponentItem(@NotNull CfgParser.Pr_ComponentItemContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerPrimaryExpression(@NotNull CfgParser.Pr_IntegerPrimaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerPrimaryExpression(@NotNull CfgParser.Pr_IntegerPrimaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Boolean(@NotNull CfgParser.Pr_BooleanContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Boolean(@NotNull CfgParser.Pr_BooleanContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StatisticsFile(@NotNull CfgParser.Pr_StatisticsFileContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StatisticsFile(@NotNull CfgParser.Pr_StatisticsFileContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DatabaseFile(@NotNull CfgParser.Pr_DatabaseFileContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DatabaseFile(@NotNull CfgParser.Pr_DatabaseFileContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_CompoundValue(@NotNull CfgParser.Pr_CompoundValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_CompoundValue(@NotNull CfgParser.Pr_CompoundValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatValueExpression(@NotNull CfgParser.Pr_FloatValueExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatValueExpression(@NotNull CfgParser.Pr_FloatValueExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Identifier(@NotNull CfgParser.Pr_IdentifierContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Identifier(@NotNull CfgParser.Pr_IdentifierContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ParameterValue(@NotNull CfgParser.Pr_ParameterValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ParameterValue(@NotNull CfgParser.Pr_ParameterValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_PatternChunk(@NotNull CfgParser.Pr_PatternChunkContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_PatternChunk(@NotNull CfgParser.Pr_PatternChunkContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StatisticsFilterEntry(@NotNull CfgParser.Pr_StatisticsFilterEntryContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StatisticsFilterEntry(@NotNull CfgParser.Pr_StatisticsFilterEntryContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_YesNoOrBoolean(@NotNull CfgParser.Pr_YesNoOrBooleanContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_YesNoOrBoolean(@NotNull CfgParser.Pr_YesNoOrBooleanContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LogEventTypesValue(@NotNull CfgParser.Pr_LogEventTypesValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LogEventTypesValue(@NotNull CfgParser.Pr_LogEventTypesValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DisableCoverage(@NotNull CfgParser.Pr_DisableCoverageContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DisableCoverage(@NotNull CfgParser.Pr_DisableCoverageContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ParameterName(@NotNull CfgParser.Pr_ParameterNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ParameterName(@NotNull CfgParser.Pr_ParameterNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ProfilerSetting(@NotNull CfgParser.Pr_ProfilerSettingContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ProfilerSetting(@NotNull CfgParser.Pr_ProfilerSettingContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IndexValue(@NotNull CfgParser.Pr_IndexValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IndexValue(@NotNull CfgParser.Pr_IndexValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ComponentID(@NotNull CfgParser.Pr_ComponentIDContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ComponentID(@NotNull CfgParser.Pr_ComponentIDContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggingMaskElement(@NotNull CfgParser.Pr_LoggingMaskElementContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggingMaskElement(@NotNull CfgParser.Pr_LoggingMaskElementContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_BStringMatch(@NotNull CfgParser.Pr_BStringMatchContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_BStringMatch(@NotNull CfgParser.Pr_BStringMatchContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ExecuteSection(@NotNull CfgParser.Pr_ExecuteSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ExecuteSection(@NotNull CfgParser.Pr_ExecuteSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatPrimaryExpression(@NotNull CfgParser.Pr_FloatPrimaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatPrimaryExpression(@NotNull CfgParser.Pr_FloatPrimaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_NetFunctionTimes(@NotNull CfgParser.Pr_NetFunctionTimesContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_NetFunctionTimes(@NotNull CfgParser.Pr_NetFunctionTimesContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_HStringValue(@NotNull CfgParser.Pr_HStringValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_HStringValue(@NotNull CfgParser.Pr_HStringValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IntegerUnaryExpression(@NotNull CfgParser.Pr_IntegerUnaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IntegerUnaryExpression(@NotNull CfgParser.Pr_IntegerUnaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_FloatUnaryExpression(@NotNull CfgParser.Pr_FloatUnaryExpressionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_FloatUnaryExpression(@NotNull CfgParser.Pr_FloatUnaryExpressionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MatchingHintsValue(@NotNull CfgParser.Pr_MatchingHintsValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MatchingHintsValue(@NotNull CfgParser.Pr_MatchingHintsValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_IncludeSection(@NotNull CfgParser.Pr_IncludeSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_IncludeSection(@NotNull CfgParser.Pr_IncludeSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_HString(@NotNull CfgParser.Pr_HStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_HString(@NotNull CfgParser.Pr_HStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_PatternChunkList(@NotNull CfgParser.Pr_PatternChunkListContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_PatternChunkList(@NotNull CfgParser.Pr_PatternChunkListContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_UniversalOrNotStringValue(@NotNull CfgParser.Pr_UniversalOrNotStringValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_UniversalOrNotStringValue(@NotNull CfgParser.Pr_UniversalOrNotStringValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Detailed(@NotNull CfgParser.Pr_DetailedContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Detailed(@NotNull CfgParser.Pr_DetailedContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_NetLineTimes(@NotNull CfgParser.Pr_NetLineTimesContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_NetLineTimes(@NotNull CfgParser.Pr_NetLineTimesContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ObjIdComponent(@NotNull CfgParser.Pr_ObjIdComponentContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ObjIdComponent(@NotNull CfgParser.Pr_ObjIdComponentContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ExternalCommandsSection(@NotNull CfgParser.Pr_ExternalCommandsSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ExternalCommandsSection(@NotNull CfgParser.Pr_ExternalCommandsSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_TestportName(@NotNull CfgParser.Pr_TestportNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_TestportName(@NotNull CfgParser.Pr_TestportNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_OStringValue(@NotNull CfgParser.Pr_OStringValueContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_OStringValue(@NotNull CfgParser.Pr_OStringValueContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DefaultSection(@NotNull CfgParser.Pr_DefaultSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DefaultSection(@NotNull CfgParser.Pr_DefaultSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LogEventTypeSet(@NotNull CfgParser.Pr_LogEventTypeSetContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LogEventTypeSet(@NotNull CfgParser.Pr_LogEventTypeSetContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggerPluginEntry(@NotNull CfgParser.Pr_LoggerPluginEntryContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggerPluginEntry(@NotNull CfgParser.Pr_LoggerPluginEntryContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_deprecatedEventTypeSet(@NotNull CfgParser.Pr_deprecatedEventTypeSetContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_deprecatedEventTypeSet(@NotNull CfgParser.Pr_deprecatedEventTypeSetContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LengthBound(@NotNull CfgParser.Pr_LengthBoundContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LengthBound(@NotNull CfgParser.Pr_LengthBoundContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StatisticsFilter(@NotNull CfgParser.Pr_StatisticsFilterContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StatisticsFilter(@NotNull CfgParser.Pr_StatisticsFilterContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_DisableProfiler(@NotNull CfgParser.Pr_DisableProfilerContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_DisableProfiler(@NotNull CfgParser.Pr_DisableProfilerContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MacroAssignment(@NotNull CfgParser.Pr_MacroAssignmentContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MacroAssignment(@NotNull CfgParser.Pr_MacroAssignmentContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggingSection(@NotNull CfgParser.Pr_LoggingSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggingSection(@NotNull CfgParser.Pr_LoggingSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LogfileName(@NotNull CfgParser.Pr_LogfileNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LogfileName(@NotNull CfgParser.Pr_LogfileNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_TemplateItemList(@NotNull CfgParser.Pr_TemplateItemListContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_TemplateItemList(@NotNull CfgParser.Pr_TemplateItemListContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_StartAutomatically(@NotNull CfgParser.Pr_StartAutomaticallyContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_StartAutomatically(@NotNull CfgParser.Pr_StartAutomaticallyContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ComponentsSection(@NotNull CfgParser.Pr_ComponentsSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ComponentsSection(@NotNull CfgParser.Pr_ComponentsSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MainControllerItemNumHcs(@NotNull CfgParser.Pr_MainControllerItemNumHcsContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MainControllerItemNumHcs(@NotNull CfgParser.Pr_MainControllerItemNumHcsContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Quadruple(@NotNull CfgParser.Pr_QuadrupleContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Quadruple(@NotNull CfgParser.Pr_QuadrupleContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ProfilerSection(@NotNull CfgParser.Pr_ProfilerSectionContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ProfilerSection(@NotNull CfgParser.Pr_ProfilerSectionContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_HStringMatch(@NotNull CfgParser.Pr_HStringMatchContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_HStringMatch(@NotNull CfgParser.Pr_HStringMatchContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_MacroExpliciteCString(@NotNull CfgParser.Pr_MacroExpliciteCStringContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_MacroExpliciteCString(@NotNull CfgParser.Pr_MacroExpliciteCStringContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ComponentName(@NotNull CfgParser.Pr_ComponentNameContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ComponentName(@NotNull CfgParser.Pr_ComponentNameContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_OStringMatch(@NotNull CfgParser.Pr_OStringMatchContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_OStringMatch(@NotNull CfgParser.Pr_OStringMatchContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_GroupItem(@NotNull CfgParser.Pr_GroupItemContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_GroupItem(@NotNull CfgParser.Pr_GroupItemContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_LoggerPluginsPart(@NotNull CfgParser.Pr_LoggerPluginsPartContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_LoggerPluginsPart(@NotNull CfgParser.Pr_LoggerPluginsPartContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_ParameterValueOrNotUsedSymbol(@NotNull CfgParser.Pr_ParameterValueOrNotUsedSymbolContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_ParameterValueOrNotUsedSymbol(@NotNull CfgParser.Pr_ParameterValueOrNotUsedSymbolContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterPr_Number(@NotNull CfgParser.Pr_NumberContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitPr_Number(@NotNull CfgParser.Pr_NumberContext ctx) { } - - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void enterEveryRule(@NotNull ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void exitEveryRule(@NotNull ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void visitTerminal(@NotNull TerminalNode node) { } - /** - * {@inheritDoc} - * - * <p>The default implementation does nothing.</p> - */ - @Override public void visitErrorNode(@NotNull ErrorNode node) { } -} \ No newline at end of file diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserListener.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserListener.java deleted file mode 100644 index 2db33d0af4..0000000000 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgParserListener.java +++ /dev/null @@ -1,1357 +0,0 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * 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 - ******************************************************************************/ -// Generated from CfgParser.g4 by ANTLR 4.3 -package org.eclipse.titan.common.parsers.cfg; - -import java.util.HashMap; - -import org.eclipse.titan.common.parsers.LocationAST; -import org.eclipse.titan.common.parsers.TITANMarker; -import org.eclipse.titan.common.parsers.cfg.indices.ComponentSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.DefineSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ExecuteSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ExternalCommandSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.GroupSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.IncludeSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.LoggingSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.MCSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.ModuleParameterSectionHandler; -import org.eclipse.titan.common.parsers.cfg.indices.TestportParameterSectionHandler; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IFile; - -import java.util.Map; - -import org.antlr.v4.runtime.misc.NotNull; -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link CfgParser}. - */ -public interface CfgParserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItemTcpPort}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItemTcpPort(@NotNull CfgParser.Pr_MainControllerItemTcpPortContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItemTcpPort}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItemTcpPort(@NotNull CfgParser.Pr_MainControllerItemTcpPortContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ComponentSpecificLoggingParam}. - * @param ctx the parse tree - */ - void enterPr_ComponentSpecificLoggingParam(@NotNull CfgParser.Pr_ComponentSpecificLoggingParamContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ComponentSpecificLoggingParam}. - * @param ctx the parse tree - */ - void exitPr_ComponentSpecificLoggingParam(@NotNull CfgParser.Pr_ComponentSpecificLoggingParamContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArithmeticPrimaryExpression}. - * @param ctx the parse tree - */ - void enterPr_ArithmeticPrimaryExpression(@NotNull CfgParser.Pr_ArithmeticPrimaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArithmeticPrimaryExpression}. - * @param ctx the parse tree - */ - void exitPr_ArithmeticPrimaryExpression(@NotNull CfgParser.Pr_ArithmeticPrimaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_OString}. - * @param ctx the parse tree - */ - void enterPr_OString(@NotNull CfgParser.Pr_OStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_OString}. - * @param ctx the parse tree - */ - void exitPr_OString(@NotNull CfgParser.Pr_OStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerValueExpression}. - * @param ctx the parse tree - */ - void enterPr_IntegerValueExpression(@NotNull CfgParser.Pr_IntegerValueExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerValueExpression}. - * @param ctx the parse tree - */ - void exitPr_IntegerValueExpression(@NotNull CfgParser.Pr_IntegerValueExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StructuredValue}. - * @param ctx the parse tree - */ - void enterPr_StructuredValue(@NotNull CfgParser.Pr_StructuredValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StructuredValue}. - * @param ctx the parse tree - */ - void exitPr_StructuredValue(@NotNull CfgParser.Pr_StructuredValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggingParam}. - * @param ctx the parse tree - */ - void enterPr_LoggingParam(@NotNull CfgParser.Pr_LoggingParamContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggingParam}. - * @param ctx the parse tree - */ - void exitPr_LoggingParam(@NotNull CfgParser.Pr_LoggingParamContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerMulExpression}. - * @param ctx the parse tree - */ - void enterPr_IntegerMulExpression(@NotNull CfgParser.Pr_IntegerMulExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerMulExpression}. - * @param ctx the parse tree - */ - void exitPr_IntegerMulExpression(@NotNull CfgParser.Pr_IntegerMulExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItem}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItem(@NotNull CfgParser.Pr_MainControllerItemContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItem}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItem(@NotNull CfgParser.Pr_MainControllerItemContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_SimpleValue}. - * @param ctx the parse tree - */ - void enterPr_SimpleValue(@NotNull CfgParser.Pr_SimpleValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_SimpleValue}. - * @param ctx the parse tree - */ - void exitPr_SimpleValue(@NotNull CfgParser.Pr_SimpleValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItemKillTimer}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItemKillTimer(@NotNull CfgParser.Pr_MainControllerItemKillTimerContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItemKillTimer}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItemKillTimer(@NotNull CfgParser.Pr_MainControllerItemKillTimerContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MacroCString}. - * @param ctx the parse tree - */ - void enterPr_MacroCString(@NotNull CfgParser.Pr_MacroCStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MacroCString}. - * @param ctx the parse tree - */ - void exitPr_MacroCString(@NotNull CfgParser.Pr_MacroCStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_AggregateData}. - * @param ctx the parse tree - */ - void enterPr_AggregateData(@NotNull CfgParser.Pr_AggregateDataContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_AggregateData}. - * @param ctx the parse tree - */ - void exitPr_AggregateData(@NotNull CfgParser.Pr_AggregateDataContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_SimpleParameterValue}. - * @param ctx the parse tree - */ - void enterPr_SimpleParameterValue(@NotNull CfgParser.Pr_SimpleParameterValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_SimpleParameterValue}. - * @param ctx the parse tree - */ - void exitPr_SimpleParameterValue(@NotNull CfgParser.Pr_SimpleParameterValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_OrderedIncludeSection}. - * @param ctx the parse tree - */ - void enterPr_OrderedIncludeSection(@NotNull CfgParser.Pr_OrderedIncludeSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_OrderedIncludeSection}. - * @param ctx the parse tree - */ - void exitPr_OrderedIncludeSection(@NotNull CfgParser.Pr_OrderedIncludeSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_HostName}. - * @param ctx the parse tree - */ - void enterPr_HostName(@NotNull CfgParser.Pr_HostNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_HostName}. - * @param ctx the parse tree - */ - void exitPr_HostName(@NotNull CfgParser.Pr_HostNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerRange}. - * @param ctx the parse tree - */ - void enterPr_IntegerRange(@NotNull CfgParser.Pr_IntegerRangeContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerRange}. - * @param ctx the parse tree - */ - void exitPr_IntegerRange(@NotNull CfgParser.Pr_IntegerRangeContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_BString}. - * @param ctx the parse tree - */ - void enterPr_BString(@NotNull CfgParser.Pr_BStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_BString}. - * @param ctx the parse tree - */ - void exitPr_BString(@NotNull CfgParser.Pr_BStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_CString}. - * @param ctx the parse tree - */ - void enterPr_CString(@NotNull CfgParser.Pr_CStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_CString}. - * @param ctx the parse tree - */ - void exitPr_CString(@NotNull CfgParser.Pr_CStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DefinitionRValue}. - * @param ctx the parse tree - */ - void enterPr_DefinitionRValue(@NotNull CfgParser.Pr_DefinitionRValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DefinitionRValue}. - * @param ctx the parse tree - */ - void exitPr_DefinitionRValue(@NotNull CfgParser.Pr_DefinitionRValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FieldValue}. - * @param ctx the parse tree - */ - void enterPr_FieldValue(@NotNull CfgParser.Pr_FieldValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FieldValue}. - * @param ctx the parse tree - */ - void exitPr_FieldValue(@NotNull CfgParser.Pr_FieldValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ConfigFile}. - * @param ctx the parse tree - */ - void enterPr_ConfigFile(@NotNull CfgParser.Pr_ConfigFileContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ConfigFile}. - * @param ctx the parse tree - */ - void exitPr_ConfigFile(@NotNull CfgParser.Pr_ConfigFileContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatAddExpression}. - * @param ctx the parse tree - */ - void enterPr_FloatAddExpression(@NotNull CfgParser.Pr_FloatAddExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatAddExpression}. - * @param ctx the parse tree - */ - void exitPr_FloatAddExpression(@NotNull CfgParser.Pr_FloatAddExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_BStringValue}. - * @param ctx the parse tree - */ - void enterPr_BStringValue(@NotNull CfgParser.Pr_BStringValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_BStringValue}. - * @param ctx the parse tree - */ - void exitPr_BStringValue(@NotNull CfgParser.Pr_BStringValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatRange}. - * @param ctx the parse tree - */ - void enterPr_FloatRange(@NotNull CfgParser.Pr_FloatRangeContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatRange}. - * @param ctx the parse tree - */ - void exitPr_FloatRange(@NotNull CfgParser.Pr_FloatRangeContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LogEventType}. - * @param ctx the parse tree - */ - void enterPr_LogEventType(@NotNull CfgParser.Pr_LogEventTypeContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LogEventType}. - * @param ctx the parse tree - */ - void exitPr_LogEventType(@NotNull CfgParser.Pr_LogEventTypeContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_GroupsSection}. - * @param ctx the parse tree - */ - void enterPr_GroupsSection(@NotNull CfgParser.Pr_GroupsSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_GroupsSection}. - * @param ctx the parse tree - */ - void exitPr_GroupsSection(@NotNull CfgParser.Pr_GroupsSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StringRange}. - * @param ctx the parse tree - */ - void enterPr_StringRange(@NotNull CfgParser.Pr_StringRangeContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StringRange}. - * @param ctx the parse tree - */ - void exitPr_StringRange(@NotNull CfgParser.Pr_StringRangeContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_NULLKeyword}. - * @param ctx the parse tree - */ - void enterPr_NULLKeyword(@NotNull CfgParser.Pr_NULLKeywordContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_NULLKeyword}. - * @param ctx the parse tree - */ - void exitPr_NULLKeyword(@NotNull CfgParser.Pr_NULLKeywordContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pt_TestComponentID}. - * @param ctx the parse tree - */ - void enterPt_TestComponentID(@NotNull CfgParser.Pt_TestComponentIDContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pt_TestComponentID}. - * @param ctx the parse tree - */ - void exitPt_TestComponentID(@NotNull CfgParser.Pt_TestComponentIDContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Float}. - * @param ctx the parse tree - */ - void enterPr_Float(@NotNull CfgParser.Pr_FloatContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Float}. - * @param ctx the parse tree - */ - void exitPr_Float(@NotNull CfgParser.Pr_FloatContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItemUnixDomainSocket}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItemUnixDomainSocket(@NotNull CfgParser.Pr_MainControllerItemUnixDomainSocketContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItemUnixDomainSocket}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItemUnixDomainSocket(@NotNull CfgParser.Pr_MainControllerItemUnixDomainSocketContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DiskFullActionValue}. - * @param ctx the parse tree - */ - void enterPr_DiskFullActionValue(@NotNull CfgParser.Pr_DiskFullActionValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DiskFullActionValue}. - * @param ctx the parse tree - */ - void exitPr_DiskFullActionValue(@NotNull CfgParser.Pr_DiskFullActionValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Section}. - * @param ctx the parse tree - */ - void enterPr_Section(@NotNull CfgParser.Pr_SectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Section}. - * @param ctx the parse tree - */ - void exitPr_Section(@NotNull CfgParser.Pr_SectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_PlainLoggingParam}. - * @param ctx the parse tree - */ - void enterPr_PlainLoggingParam(@NotNull CfgParser.Pr_PlainLoggingParamContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_PlainLoggingParam}. - * @param ctx the parse tree - */ - void exitPr_PlainLoggingParam(@NotNull CfgParser.Pr_PlainLoggingParamContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArrayItem}. - * @param ctx the parse tree - */ - void enterPr_ArrayItem(@NotNull CfgParser.Pr_ArrayItemContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArrayItem}. - * @param ctx the parse tree - */ - void exitPr_ArrayItem(@NotNull CfgParser.Pr_ArrayItemContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_VerdictValue}. - * @param ctx the parse tree - */ - void enterPr_VerdictValue(@NotNull CfgParser.Pr_VerdictValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_VerdictValue}. - * @param ctx the parse tree - */ - void exitPr_VerdictValue(@NotNull CfgParser.Pr_VerdictValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerSection}. - * @param ctx the parse tree - */ - void enterPr_MainControllerSection(@NotNull CfgParser.Pr_MainControllerSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerSection}. - * @param ctx the parse tree - */ - void exitPr_MainControllerSection(@NotNull CfgParser.Pr_MainControllerSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StructuredValue2}. - * @param ctx the parse tree - */ - void enterPr_StructuredValue2(@NotNull CfgParser.Pr_StructuredValue2Context ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StructuredValue2}. - * @param ctx the parse tree - */ - void exitPr_StructuredValue2(@NotNull CfgParser.Pr_StructuredValue2Context ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ExecuteSectionItem}. - * @param ctx the parse tree - */ - void enterPr_ExecuteSectionItem(@NotNull CfgParser.Pr_ExecuteSectionItemContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ExecuteSectionItem}. - * @param ctx the parse tree - */ - void exitPr_ExecuteSectionItem(@NotNull CfgParser.Pr_ExecuteSectionItemContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArithmeticMulExpression}. - * @param ctx the parse tree - */ - void enterPr_ArithmeticMulExpression(@NotNull CfgParser.Pr_ArithmeticMulExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArithmeticMulExpression}. - * @param ctx the parse tree - */ - void exitPr_ArithmeticMulExpression(@NotNull CfgParser.Pr_ArithmeticMulExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArithmeticAddExpression}. - * @param ctx the parse tree - */ - void enterPr_ArithmeticAddExpression(@NotNull CfgParser.Pr_ArithmeticAddExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArithmeticAddExpression}. - * @param ctx the parse tree - */ - void exitPr_ArithmeticAddExpression(@NotNull CfgParser.Pr_ArithmeticAddExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StringValue}. - * @param ctx the parse tree - */ - void enterPr_StringValue(@NotNull CfgParser.Pr_StringValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StringValue}. - * @param ctx the parse tree - */ - void exitPr_StringValue(@NotNull CfgParser.Pr_StringValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerAddExpression}. - * @param ctx the parse tree - */ - void enterPr_IntegerAddExpression(@NotNull CfgParser.Pr_IntegerAddExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerAddExpression}. - * @param ctx the parse tree - */ - void exitPr_IntegerAddExpression(@NotNull CfgParser.Pr_IntegerAddExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_EnumeratedValue}. - * @param ctx the parse tree - */ - void enterPr_EnumeratedValue(@NotNull CfgParser.Pr_EnumeratedValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_EnumeratedValue}. - * @param ctx the parse tree - */ - void exitPr_EnumeratedValue(@NotNull CfgParser.Pr_EnumeratedValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ModuleParam}. - * @param ctx the parse tree - */ - void enterPr_ModuleParam(@NotNull CfgParser.Pr_ModuleParamContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ModuleParam}. - * @param ctx the parse tree - */ - void exitPr_ModuleParam(@NotNull CfgParser.Pr_ModuleParamContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_TestportParametersSection}. - * @param ctx the parse tree - */ - void enterPr_TestportParametersSection(@NotNull CfgParser.Pr_TestportParametersSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_TestportParametersSection}. - * @param ctx the parse tree - */ - void exitPr_TestportParametersSection(@NotNull CfgParser.Pr_TestportParametersSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatMulExpression}. - * @param ctx the parse tree - */ - void enterPr_FloatMulExpression(@NotNull CfgParser.Pr_FloatMulExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatMulExpression}. - * @param ctx the parse tree - */ - void exitPr_FloatMulExpression(@NotNull CfgParser.Pr_FloatMulExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DisableStatistics}. - * @param ctx the parse tree - */ - void enterPr_DisableStatistics(@NotNull CfgParser.Pr_DisableStatisticsContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DisableStatistics}. - * @param ctx the parse tree - */ - void exitPr_DisableStatistics(@NotNull CfgParser.Pr_DisableStatisticsContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ObjIdValue}. - * @param ctx the parse tree - */ - void enterPr_ObjIdValue(@NotNull CfgParser.Pr_ObjIdValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ObjIdValue}. - * @param ctx the parse tree - */ - void exitPr_ObjIdValue(@NotNull CfgParser.Pr_ObjIdValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LengthMatch}. - * @param ctx the parse tree - */ - void enterPr_LengthMatch(@NotNull CfgParser.Pr_LengthMatchContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LengthMatch}. - * @param ctx the parse tree - */ - void exitPr_LengthMatch(@NotNull CfgParser.Pr_LengthMatchContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggingBitMask}. - * @param ctx the parse tree - */ - void enterPr_LoggingBitMask(@NotNull CfgParser.Pr_LoggingBitMaskContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggingBitMask}. - * @param ctx the parse tree - */ - void exitPr_LoggingBitMask(@NotNull CfgParser.Pr_LoggingBitMaskContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArithmeticValueExpression}. - * @param ctx the parse tree - */ - void enterPr_ArithmeticValueExpression(@NotNull CfgParser.Pr_ArithmeticValueExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArithmeticValueExpression}. - * @param ctx the parse tree - */ - void exitPr_ArithmeticValueExpression(@NotNull CfgParser.Pr_ArithmeticValueExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FieldName}. - * @param ctx the parse tree - */ - void enterPr_FieldName(@NotNull CfgParser.Pr_FieldNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FieldName}. - * @param ctx the parse tree - */ - void exitPr_FieldName(@NotNull CfgParser.Pr_FieldNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DefineSection}. - * @param ctx the parse tree - */ - void enterPr_DefineSection(@NotNull CfgParser.Pr_DefineSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DefineSection}. - * @param ctx the parse tree - */ - void exitPr_DefineSection(@NotNull CfgParser.Pr_DefineSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ArithmeticUnaryExpression}. - * @param ctx the parse tree - */ - void enterPr_ArithmeticUnaryExpression(@NotNull CfgParser.Pr_ArithmeticUnaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ArithmeticUnaryExpression}. - * @param ctx the parse tree - */ - void exitPr_ArithmeticUnaryExpression(@NotNull CfgParser.Pr_ArithmeticUnaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ModuleParametersSection}. - * @param ctx the parse tree - */ - void enterPr_ModuleParametersSection(@NotNull CfgParser.Pr_ModuleParametersSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ModuleParametersSection}. - * @param ctx the parse tree - */ - void exitPr_ModuleParametersSection(@NotNull CfgParser.Pr_ModuleParametersSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DNSName}. - * @param ctx the parse tree - */ - void enterPr_DNSName(@NotNull CfgParser.Pr_DNSNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DNSName}. - * @param ctx the parse tree - */ - void exitPr_DNSName(@NotNull CfgParser.Pr_DNSNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItemLocalAddress}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItemLocalAddress(@NotNull CfgParser.Pr_MainControllerItemLocalAddressContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItemLocalAddress}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItemLocalAddress(@NotNull CfgParser.Pr_MainControllerItemLocalAddressContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ComponentItem}. - * @param ctx the parse tree - */ - void enterPr_ComponentItem(@NotNull CfgParser.Pr_ComponentItemContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ComponentItem}. - * @param ctx the parse tree - */ - void exitPr_ComponentItem(@NotNull CfgParser.Pr_ComponentItemContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerPrimaryExpression}. - * @param ctx the parse tree - */ - void enterPr_IntegerPrimaryExpression(@NotNull CfgParser.Pr_IntegerPrimaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerPrimaryExpression}. - * @param ctx the parse tree - */ - void exitPr_IntegerPrimaryExpression(@NotNull CfgParser.Pr_IntegerPrimaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Boolean}. - * @param ctx the parse tree - */ - void enterPr_Boolean(@NotNull CfgParser.Pr_BooleanContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Boolean}. - * @param ctx the parse tree - */ - void exitPr_Boolean(@NotNull CfgParser.Pr_BooleanContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StatisticsFile}. - * @param ctx the parse tree - */ - void enterPr_StatisticsFile(@NotNull CfgParser.Pr_StatisticsFileContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StatisticsFile}. - * @param ctx the parse tree - */ - void exitPr_StatisticsFile(@NotNull CfgParser.Pr_StatisticsFileContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DatabaseFile}. - * @param ctx the parse tree - */ - void enterPr_DatabaseFile(@NotNull CfgParser.Pr_DatabaseFileContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DatabaseFile}. - * @param ctx the parse tree - */ - void exitPr_DatabaseFile(@NotNull CfgParser.Pr_DatabaseFileContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_CompoundValue}. - * @param ctx the parse tree - */ - void enterPr_CompoundValue(@NotNull CfgParser.Pr_CompoundValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_CompoundValue}. - * @param ctx the parse tree - */ - void exitPr_CompoundValue(@NotNull CfgParser.Pr_CompoundValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatValueExpression}. - * @param ctx the parse tree - */ - void enterPr_FloatValueExpression(@NotNull CfgParser.Pr_FloatValueExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatValueExpression}. - * @param ctx the parse tree - */ - void exitPr_FloatValueExpression(@NotNull CfgParser.Pr_FloatValueExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Identifier}. - * @param ctx the parse tree - */ - void enterPr_Identifier(@NotNull CfgParser.Pr_IdentifierContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Identifier}. - * @param ctx the parse tree - */ - void exitPr_Identifier(@NotNull CfgParser.Pr_IdentifierContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ParameterValue}. - * @param ctx the parse tree - */ - void enterPr_ParameterValue(@NotNull CfgParser.Pr_ParameterValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ParameterValue}. - * @param ctx the parse tree - */ - void exitPr_ParameterValue(@NotNull CfgParser.Pr_ParameterValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_PatternChunk}. - * @param ctx the parse tree - */ - void enterPr_PatternChunk(@NotNull CfgParser.Pr_PatternChunkContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_PatternChunk}. - * @param ctx the parse tree - */ - void exitPr_PatternChunk(@NotNull CfgParser.Pr_PatternChunkContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StatisticsFilterEntry}. - * @param ctx the parse tree - */ - void enterPr_StatisticsFilterEntry(@NotNull CfgParser.Pr_StatisticsFilterEntryContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StatisticsFilterEntry}. - * @param ctx the parse tree - */ - void exitPr_StatisticsFilterEntry(@NotNull CfgParser.Pr_StatisticsFilterEntryContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_YesNoOrBoolean}. - * @param ctx the parse tree - */ - void enterPr_YesNoOrBoolean(@NotNull CfgParser.Pr_YesNoOrBooleanContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_YesNoOrBoolean}. - * @param ctx the parse tree - */ - void exitPr_YesNoOrBoolean(@NotNull CfgParser.Pr_YesNoOrBooleanContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LogEventTypesValue}. - * @param ctx the parse tree - */ - void enterPr_LogEventTypesValue(@NotNull CfgParser.Pr_LogEventTypesValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LogEventTypesValue}. - * @param ctx the parse tree - */ - void exitPr_LogEventTypesValue(@NotNull CfgParser.Pr_LogEventTypesValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DisableCoverage}. - * @param ctx the parse tree - */ - void enterPr_DisableCoverage(@NotNull CfgParser.Pr_DisableCoverageContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DisableCoverage}. - * @param ctx the parse tree - */ - void exitPr_DisableCoverage(@NotNull CfgParser.Pr_DisableCoverageContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ParameterName}. - * @param ctx the parse tree - */ - void enterPr_ParameterName(@NotNull CfgParser.Pr_ParameterNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ParameterName}. - * @param ctx the parse tree - */ - void exitPr_ParameterName(@NotNull CfgParser.Pr_ParameterNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ProfilerSetting}. - * @param ctx the parse tree - */ - void enterPr_ProfilerSetting(@NotNull CfgParser.Pr_ProfilerSettingContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ProfilerSetting}. - * @param ctx the parse tree - */ - void exitPr_ProfilerSetting(@NotNull CfgParser.Pr_ProfilerSettingContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IndexValue}. - * @param ctx the parse tree - */ - void enterPr_IndexValue(@NotNull CfgParser.Pr_IndexValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IndexValue}. - * @param ctx the parse tree - */ - void exitPr_IndexValue(@NotNull CfgParser.Pr_IndexValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ComponentID}. - * @param ctx the parse tree - */ - void enterPr_ComponentID(@NotNull CfgParser.Pr_ComponentIDContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ComponentID}. - * @param ctx the parse tree - */ - void exitPr_ComponentID(@NotNull CfgParser.Pr_ComponentIDContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggingMaskElement}. - * @param ctx the parse tree - */ - void enterPr_LoggingMaskElement(@NotNull CfgParser.Pr_LoggingMaskElementContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggingMaskElement}. - * @param ctx the parse tree - */ - void exitPr_LoggingMaskElement(@NotNull CfgParser.Pr_LoggingMaskElementContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_BStringMatch}. - * @param ctx the parse tree - */ - void enterPr_BStringMatch(@NotNull CfgParser.Pr_BStringMatchContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_BStringMatch}. - * @param ctx the parse tree - */ - void exitPr_BStringMatch(@NotNull CfgParser.Pr_BStringMatchContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ExecuteSection}. - * @param ctx the parse tree - */ - void enterPr_ExecuteSection(@NotNull CfgParser.Pr_ExecuteSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ExecuteSection}. - * @param ctx the parse tree - */ - void exitPr_ExecuteSection(@NotNull CfgParser.Pr_ExecuteSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatPrimaryExpression}. - * @param ctx the parse tree - */ - void enterPr_FloatPrimaryExpression(@NotNull CfgParser.Pr_FloatPrimaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatPrimaryExpression}. - * @param ctx the parse tree - */ - void exitPr_FloatPrimaryExpression(@NotNull CfgParser.Pr_FloatPrimaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_NetFunctionTimes}. - * @param ctx the parse tree - */ - void enterPr_NetFunctionTimes(@NotNull CfgParser.Pr_NetFunctionTimesContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_NetFunctionTimes}. - * @param ctx the parse tree - */ - void exitPr_NetFunctionTimes(@NotNull CfgParser.Pr_NetFunctionTimesContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_HStringValue}. - * @param ctx the parse tree - */ - void enterPr_HStringValue(@NotNull CfgParser.Pr_HStringValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_HStringValue}. - * @param ctx the parse tree - */ - void exitPr_HStringValue(@NotNull CfgParser.Pr_HStringValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IntegerUnaryExpression}. - * @param ctx the parse tree - */ - void enterPr_IntegerUnaryExpression(@NotNull CfgParser.Pr_IntegerUnaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IntegerUnaryExpression}. - * @param ctx the parse tree - */ - void exitPr_IntegerUnaryExpression(@NotNull CfgParser.Pr_IntegerUnaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_FloatUnaryExpression}. - * @param ctx the parse tree - */ - void enterPr_FloatUnaryExpression(@NotNull CfgParser.Pr_FloatUnaryExpressionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_FloatUnaryExpression}. - * @param ctx the parse tree - */ - void exitPr_FloatUnaryExpression(@NotNull CfgParser.Pr_FloatUnaryExpressionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MatchingHintsValue}. - * @param ctx the parse tree - */ - void enterPr_MatchingHintsValue(@NotNull CfgParser.Pr_MatchingHintsValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MatchingHintsValue}. - * @param ctx the parse tree - */ - void exitPr_MatchingHintsValue(@NotNull CfgParser.Pr_MatchingHintsValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_IncludeSection}. - * @param ctx the parse tree - */ - void enterPr_IncludeSection(@NotNull CfgParser.Pr_IncludeSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_IncludeSection}. - * @param ctx the parse tree - */ - void exitPr_IncludeSection(@NotNull CfgParser.Pr_IncludeSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_HString}. - * @param ctx the parse tree - */ - void enterPr_HString(@NotNull CfgParser.Pr_HStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_HString}. - * @param ctx the parse tree - */ - void exitPr_HString(@NotNull CfgParser.Pr_HStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_PatternChunkList}. - * @param ctx the parse tree - */ - void enterPr_PatternChunkList(@NotNull CfgParser.Pr_PatternChunkListContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_PatternChunkList}. - * @param ctx the parse tree - */ - void exitPr_PatternChunkList(@NotNull CfgParser.Pr_PatternChunkListContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_UniversalOrNotStringValue}. - * @param ctx the parse tree - */ - void enterPr_UniversalOrNotStringValue(@NotNull CfgParser.Pr_UniversalOrNotStringValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_UniversalOrNotStringValue}. - * @param ctx the parse tree - */ - void exitPr_UniversalOrNotStringValue(@NotNull CfgParser.Pr_UniversalOrNotStringValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Detailed}. - * @param ctx the parse tree - */ - void enterPr_Detailed(@NotNull CfgParser.Pr_DetailedContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Detailed}. - * @param ctx the parse tree - */ - void exitPr_Detailed(@NotNull CfgParser.Pr_DetailedContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_NetLineTimes}. - * @param ctx the parse tree - */ - void enterPr_NetLineTimes(@NotNull CfgParser.Pr_NetLineTimesContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_NetLineTimes}. - * @param ctx the parse tree - */ - void exitPr_NetLineTimes(@NotNull CfgParser.Pr_NetLineTimesContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ObjIdComponent}. - * @param ctx the parse tree - */ - void enterPr_ObjIdComponent(@NotNull CfgParser.Pr_ObjIdComponentContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ObjIdComponent}. - * @param ctx the parse tree - */ - void exitPr_ObjIdComponent(@NotNull CfgParser.Pr_ObjIdComponentContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ExternalCommandsSection}. - * @param ctx the parse tree - */ - void enterPr_ExternalCommandsSection(@NotNull CfgParser.Pr_ExternalCommandsSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ExternalCommandsSection}. - * @param ctx the parse tree - */ - void exitPr_ExternalCommandsSection(@NotNull CfgParser.Pr_ExternalCommandsSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_TestportName}. - * @param ctx the parse tree - */ - void enterPr_TestportName(@NotNull CfgParser.Pr_TestportNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_TestportName}. - * @param ctx the parse tree - */ - void exitPr_TestportName(@NotNull CfgParser.Pr_TestportNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_OStringValue}. - * @param ctx the parse tree - */ - void enterPr_OStringValue(@NotNull CfgParser.Pr_OStringValueContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_OStringValue}. - * @param ctx the parse tree - */ - void exitPr_OStringValue(@NotNull CfgParser.Pr_OStringValueContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DefaultSection}. - * @param ctx the parse tree - */ - void enterPr_DefaultSection(@NotNull CfgParser.Pr_DefaultSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DefaultSection}. - * @param ctx the parse tree - */ - void exitPr_DefaultSection(@NotNull CfgParser.Pr_DefaultSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LogEventTypeSet}. - * @param ctx the parse tree - */ - void enterPr_LogEventTypeSet(@NotNull CfgParser.Pr_LogEventTypeSetContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LogEventTypeSet}. - * @param ctx the parse tree - */ - void exitPr_LogEventTypeSet(@NotNull CfgParser.Pr_LogEventTypeSetContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggerPluginEntry}. - * @param ctx the parse tree - */ - void enterPr_LoggerPluginEntry(@NotNull CfgParser.Pr_LoggerPluginEntryContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggerPluginEntry}. - * @param ctx the parse tree - */ - void exitPr_LoggerPluginEntry(@NotNull CfgParser.Pr_LoggerPluginEntryContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_deprecatedEventTypeSet}. - * @param ctx the parse tree - */ - void enterPr_deprecatedEventTypeSet(@NotNull CfgParser.Pr_deprecatedEventTypeSetContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_deprecatedEventTypeSet}. - * @param ctx the parse tree - */ - void exitPr_deprecatedEventTypeSet(@NotNull CfgParser.Pr_deprecatedEventTypeSetContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LengthBound}. - * @param ctx the parse tree - */ - void enterPr_LengthBound(@NotNull CfgParser.Pr_LengthBoundContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LengthBound}. - * @param ctx the parse tree - */ - void exitPr_LengthBound(@NotNull CfgParser.Pr_LengthBoundContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StatisticsFilter}. - * @param ctx the parse tree - */ - void enterPr_StatisticsFilter(@NotNull CfgParser.Pr_StatisticsFilterContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StatisticsFilter}. - * @param ctx the parse tree - */ - void exitPr_StatisticsFilter(@NotNull CfgParser.Pr_StatisticsFilterContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_DisableProfiler}. - * @param ctx the parse tree - */ - void enterPr_DisableProfiler(@NotNull CfgParser.Pr_DisableProfilerContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_DisableProfiler}. - * @param ctx the parse tree - */ - void exitPr_DisableProfiler(@NotNull CfgParser.Pr_DisableProfilerContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MacroAssignment}. - * @param ctx the parse tree - */ - void enterPr_MacroAssignment(@NotNull CfgParser.Pr_MacroAssignmentContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MacroAssignment}. - * @param ctx the parse tree - */ - void exitPr_MacroAssignment(@NotNull CfgParser.Pr_MacroAssignmentContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggingSection}. - * @param ctx the parse tree - */ - void enterPr_LoggingSection(@NotNull CfgParser.Pr_LoggingSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggingSection}. - * @param ctx the parse tree - */ - void exitPr_LoggingSection(@NotNull CfgParser.Pr_LoggingSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LogfileName}. - * @param ctx the parse tree - */ - void enterPr_LogfileName(@NotNull CfgParser.Pr_LogfileNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LogfileName}. - * @param ctx the parse tree - */ - void exitPr_LogfileName(@NotNull CfgParser.Pr_LogfileNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_TemplateItemList}. - * @param ctx the parse tree - */ - void enterPr_TemplateItemList(@NotNull CfgParser.Pr_TemplateItemListContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_TemplateItemList}. - * @param ctx the parse tree - */ - void exitPr_TemplateItemList(@NotNull CfgParser.Pr_TemplateItemListContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_StartAutomatically}. - * @param ctx the parse tree - */ - void enterPr_StartAutomatically(@NotNull CfgParser.Pr_StartAutomaticallyContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_StartAutomatically}. - * @param ctx the parse tree - */ - void exitPr_StartAutomatically(@NotNull CfgParser.Pr_StartAutomaticallyContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ComponentsSection}. - * @param ctx the parse tree - */ - void enterPr_ComponentsSection(@NotNull CfgParser.Pr_ComponentsSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ComponentsSection}. - * @param ctx the parse tree - */ - void exitPr_ComponentsSection(@NotNull CfgParser.Pr_ComponentsSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MainControllerItemNumHcs}. - * @param ctx the parse tree - */ - void enterPr_MainControllerItemNumHcs(@NotNull CfgParser.Pr_MainControllerItemNumHcsContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MainControllerItemNumHcs}. - * @param ctx the parse tree - */ - void exitPr_MainControllerItemNumHcs(@NotNull CfgParser.Pr_MainControllerItemNumHcsContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Quadruple}. - * @param ctx the parse tree - */ - void enterPr_Quadruple(@NotNull CfgParser.Pr_QuadrupleContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Quadruple}. - * @param ctx the parse tree - */ - void exitPr_Quadruple(@NotNull CfgParser.Pr_QuadrupleContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ProfilerSection}. - * @param ctx the parse tree - */ - void enterPr_ProfilerSection(@NotNull CfgParser.Pr_ProfilerSectionContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ProfilerSection}. - * @param ctx the parse tree - */ - void exitPr_ProfilerSection(@NotNull CfgParser.Pr_ProfilerSectionContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_HStringMatch}. - * @param ctx the parse tree - */ - void enterPr_HStringMatch(@NotNull CfgParser.Pr_HStringMatchContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_HStringMatch}. - * @param ctx the parse tree - */ - void exitPr_HStringMatch(@NotNull CfgParser.Pr_HStringMatchContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_MacroExpliciteCString}. - * @param ctx the parse tree - */ - void enterPr_MacroExpliciteCString(@NotNull CfgParser.Pr_MacroExpliciteCStringContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_MacroExpliciteCString}. - * @param ctx the parse tree - */ - void exitPr_MacroExpliciteCString(@NotNull CfgParser.Pr_MacroExpliciteCStringContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ComponentName}. - * @param ctx the parse tree - */ - void enterPr_ComponentName(@NotNull CfgParser.Pr_ComponentNameContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ComponentName}. - * @param ctx the parse tree - */ - void exitPr_ComponentName(@NotNull CfgParser.Pr_ComponentNameContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_OStringMatch}. - * @param ctx the parse tree - */ - void enterPr_OStringMatch(@NotNull CfgParser.Pr_OStringMatchContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_OStringMatch}. - * @param ctx the parse tree - */ - void exitPr_OStringMatch(@NotNull CfgParser.Pr_OStringMatchContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_GroupItem}. - * @param ctx the parse tree - */ - void enterPr_GroupItem(@NotNull CfgParser.Pr_GroupItemContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_GroupItem}. - * @param ctx the parse tree - */ - void exitPr_GroupItem(@NotNull CfgParser.Pr_GroupItemContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_LoggerPluginsPart}. - * @param ctx the parse tree - */ - void enterPr_LoggerPluginsPart(@NotNull CfgParser.Pr_LoggerPluginsPartContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_LoggerPluginsPart}. - * @param ctx the parse tree - */ - void exitPr_LoggerPluginsPart(@NotNull CfgParser.Pr_LoggerPluginsPartContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_ParameterValueOrNotUsedSymbol}. - * @param ctx the parse tree - */ - void enterPr_ParameterValueOrNotUsedSymbol(@NotNull CfgParser.Pr_ParameterValueOrNotUsedSymbolContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_ParameterValueOrNotUsedSymbol}. - * @param ctx the parse tree - */ - void exitPr_ParameterValueOrNotUsedSymbol(@NotNull CfgParser.Pr_ParameterValueOrNotUsedSymbolContext ctx); - - /** - * Enter a parse tree produced by {@link CfgParser#pr_Number}. - * @param ctx the parse tree - */ - void enterPr_Number(@NotNull CfgParser.Pr_NumberContext ctx); - /** - * Exit a parse tree produced by {@link CfgParser#pr_Number}. - * @param ctx the parse tree - */ - void exitPr_Number(@NotNull CfgParser.Pr_NumberContext ctx); -} \ No newline at end of file diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgResolverListener.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgResolverListener.java deleted file mode 100644 index f3e8562206..0000000000 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/CfgResolverListener.java +++ /dev/null @@ -1,503 +0,0 @@ -/****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB - * 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.titan.common.parsers.cfg; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.misc.NotNull; -import org.eclipse.core.resources.IMarker; -import org.eclipse.titan.common.parsers.TITANMarker; - -public class CfgResolverListener extends CfgParserBaseListener { - - private List<TITANMarker> mWarnings = new ArrayList<TITANMarker>(); - - private Map<String, CfgDefinitionInformation> mDefinitions = new HashMap<String, CfgDefinitionInformation>(); - private Map<String, String> mEnvVariables = new HashMap<String, String>(); - - private Integer mTcpPort = null; - private String mLocalAddress = null; - private Double mKillTimer = null; - private Integer mNumHcs = null; - private Boolean mUnixDomainSocket = null; - private Map<String, String> mComponents = new HashMap<String, String>(); - private Map<String, String[]> mGroups = new HashMap<String, String[]>(); - private List<String> mExecuteElements = new ArrayList<String>(); - - private int mLine = 1; - private int mOffset = 0; - - public void setDefinitions( Map<String,CfgDefinitionInformation> aDefs ) { - mDefinitions = aDefs; - } - - public void setEnvironmentalVariables( Map<String, String> aEnvVariables ) { - mEnvVariables = aEnvVariables; - } - - public Boolean getUnixDomainSocket() { - return mUnixDomainSocket; - } - - public Double getKillTimer() { - return mKillTimer; - } - - public String getLocalAddress() { - return mLocalAddress; - } - - public Integer getNumHcs() { - return mNumHcs; - } - - public Integer getTcpPort() { - return mTcpPort; - } - - public Map<String, String[]> getGroups() { - return mGroups; - } - - public Map<String, String> getComponents() { - return mComponents; - } - - public List<String> getExecuteElements() { - return mExecuteElements; - } - - /** - * Creates a marker. - * Locations of input tokens are not moved by offset and line yet, this function does this conversion. - * @param aMessage marker message - * @param aStartToken the 1st token, its line and start position will be used for the location - * NOTE: start position is the column index of the tokens 1st character. - * Column index starts with 0. - * @param aEndToken the last token, its end position will be used for the location. - * NOTE: end position is the column index after the token's last character. - * @param aSeverity severity (info/warning/error) - * @param aPriority priority (low/normal/high) - * @return new marker - */ - public TITANMarker createMarker( final String aMessage, final Token aStartToken, final Token aEndToken, final int aSeverity, final int aPriority ) { - TITANMarker marker = new TITANMarker( - aMessage, - (aStartToken != null) ? mLine - 1 + aStartToken.getLine() : -1, - (aStartToken != null) ? mOffset + aStartToken.getStartIndex() : -1, - (aEndToken != null) ? mOffset + aEndToken.getStopIndex() + 1 : -1, - aSeverity, aPriority ); - return marker; - } - - /** - * Adds an error marker. - * Locations of input tokens are not moved by offset and line yet, this function does this conversion. - * @param aMessage marker message - * @param aStartToken the 1st token, its line and start position will be used for the location - * NOTE: start position is the column index of the tokens 1st character. - * Column index starts with 0. - * @param aEndToken the last token, its end position will be used for the location. - * NOTE: end position is the column index after the token's last character. - */ - public void reportError( final String aMessage, final Token aStartToken, final Token aEndToken ) { - TITANMarker marker = createMarker( aMessage, aStartToken, aEndToken, IMarker.SEVERITY_ERROR, IMarker.PRIORITY_NORMAL ); - mWarnings.add(marker); - } - - /** - * Gets the value of a macro or an environment variable - * @param aDefinition macro or environment variable - * @return macro or environment variable value, or null if there is no such definition - */ - private String getDefinitionValue(String aDefinition){ - if ( mDefinitions != null && mDefinitions.containsKey( aDefinition ) ) { - return mDefinitions.get( aDefinition ).getValue(); - } else if ( mEnvVariables != null && mEnvVariables.containsKey( aDefinition ) ) { - return mEnvVariables.get( aDefinition ); - } else { - return null; - } - } - -//TODO: remove BEGIN -// already filled in parser - @Override - public void exitPr_ExecuteSectionItem(@NotNull CfgParser.Pr_ExecuteSectionItemContext ctx) { - mExecuteElements.add( ctx.t.getText() ); - } - - @Override - public void exitPr_MainControllerItemUnixDomainSocket(@NotNull CfgParser.Pr_MainControllerItemUnixDomainSocketContext ctx) { - mUnixDomainSocket = Boolean.parseBoolean( ctx.u.getText() ); - } - - @Override - public void exitPr_MainControllerItemKillTimer(@NotNull CfgParser.Pr_MainControllerItemKillTimerContext ctx) { - mKillTimer = Double.parseDouble( ctx.k.getText() ); - } - - @Override - public void exitPr_MainControllerItemLocalAddress(@NotNull CfgParser.Pr_MainControllerItemLocalAddressContext ctx) { - mLocalAddress = ctx.l.getText(); - } - - @Override - public void exitPr_MainControllerItemNumHcs(@NotNull CfgParser.Pr_MainControllerItemNumHcsContext ctx) { - mNumHcs = Integer.parseInt( ctx.n.getText() ); - } - - @Override - public void exitPr_MainControllerItemTcpPort(@NotNull CfgParser.Pr_MainControllerItemTcpPortContext ctx) { - mTcpPort = Integer.parseInt( ctx.t.getText() ); - } - - @Override - public void exitPr_ComponentItem(@NotNull CfgParser.Pr_ComponentItemContext ctx) { - if ( ctx.h != null ) { - mComponents.put( ctx.n.getText(), ctx.h.getText() ); - } - else if ( ctx.i != null ) { - mComponents.put( ctx.n.getText(), ctx.i.getText() ); - } - } -//TODO: remove END - - @Override - public void exitPr_CString(@NotNull CfgParser.Pr_CStringContext ctx) { - /* - if( ctx.macro1 != null ) { - int commaPosition = ctx.macro1.getText().indexOf(','); - String definition = ctx.macro1.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if ( value != null ) { - tempAST.initialize(STRING,"\""+value+"\""); - } else { - tempAST.initialize(STRING,"\"\""); - reportError( "Could not resolve definition: " + definition + " using \"\" as a replacement.", ctx.macro1.start, ctx.macro1.stop ); - } - } - else if( ctx.macro2 != null ) { - String definition = ctx.macro2.getText().substring(1, ctx.macro2.getText().length()); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if ( value != null ) { - tempAST.initialize(STRING,"\""+value+"\""); - } else { - tempAST.initialize(STRING,"\"\""); - reportError( "Could not resolve definition: " + definition + " using \"\" as a replacement.", ctx.macro2.start, ctx.macro2.stop ); - } - } - */ - //TODO: implement - } -/* - // nem jok a helyettesitesek !!! (kornyezeti valtozok kimaradtak) - pr_CString: - ( STRING - | !macro1:MACRO_EXPLICITE_CSTR - { - int commaPosition = macro1.getText().indexOf(','); - String definition = macro1.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(STRING,"\""+value+"\""); - ## = #(tempAST); - }else{ - tempAST.initialize(STRING,"\"\""); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"\" as a replacement."); - ex.column = macro1.getOffset(); - ex.line = macro1.getLine(); - throw ex; - } - } - | !macro2:MACRO_CSTR - { - String definition = macro2.getText().substring(1,macro2.getText().length()); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(STRING,"\""+value+"\""); - ## = #(tempAST); - }else{ - tempAST.initialize(STRING,"\"\""); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"\" as a replacement."); - ex.column = macro2.getOffset(); - ex.line = macro2.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_Boolean(@NotNull CfgParser.Pr_BooleanContext ctx) { - //TODO: implement - } - -/* - pr_Boolean: - ( TRUE - | FALSE - | !macro:MACRO_BOOL - { - int commaPosition =macro.getText().indexOf(','); - String definition =macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if (value == null) { - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"true\" as a replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - if("false".equals(value)){ - tempAST.initialize(FALSE,"false"); - }else{ - tempAST.initialize(TRUE,"true"); - } - ## = #(tempAST); - } - ); -*/ - - @Override public void exitPr_Identifier(@NotNull CfgParser.Pr_IdentifierContext ctx) { - //TODO: implement - } - -/* - pr_Identifier: - ( TTCN3IDENTIFIER - | !macro:MACRO_ID - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(TTCN3IDENTIFIER,value); - ## = #(tempAST); - }else{ - tempAST.initialize(TTCN3IDENTIFIER,""); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"\" as a replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - reportError(ex); - } - } - ) - ; -*/ - - @Override public void exitPr_BString(@NotNull CfgParser.Pr_BStringContext ctx) { - //TODO: implement - } - -/* - pr_BString: - ( BITSTRING - | !macro:MACRO_BSTR - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(BITSTRING,"'" + value + "'B"); - ## = #(tempAST); - }else{ - tempAST.initialize(BITSTRING,"''B"); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using ''B as a replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_HString(@NotNull CfgParser.Pr_HStringContext ctx) { - //TODO: implement - } - -/* - pr_HString: - ( HEXSTRING - | !macro:MACRO_HSTR - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(HEXSTRING,"'" + value + "'H"); - ## = #(tempAST); - }else{ - tempAST.initialize(HEXSTRING,"''H"); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using ''H as a replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_OString(@NotNull CfgParser.Pr_OStringContext ctx) { - //TODO: implement - } - -/* - pr_OString: - ( OCTETSTRING - | macro1:MACRO_OSTR! - { - int commaPosition = macro1.getText().indexOf(','); - String definition = macro1.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(OCTETSTRING,"'" + value + "'O"); - ## = #(tempAST); - }else{ - tempAST.initialize(OCTETSTRING,"''O"); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using ''O as a replacement."); - ex.column = macro1.getOffset(); - ex.line = macro1.getLine(); - throw ex; - } - } - | macro2:MACRO_BINARY! - { - int commaPosition = macro2.getText().indexOf(','); - String definition = macro2.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(OCTETSTRING,value); - ## = #(tempAST); - }else{ - tempAST.initialize(OCTETSTRING,""); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"\" as a replacement."); - ex.column = macro2.getOffset(); - ex.line = macro2.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_HostName(@NotNull CfgParser.Pr_HostNameContext ctx) { - //TODO: implement - } -/* - pr_HostName: - ( pr_DNSName - | TTCN3IDENTIFIER - | !macro:MACRO_HOSTNAME - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(TTCN3IDENTIFIER,value); - ## = #(tempAST); - }else{ - tempAST.initialize(TTCN3IDENTIFIER,""); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve definition: " + definition + " using \"\" as a replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_Number(@NotNull CfgParser.Pr_NumberContext ctx) { - //TODO: implement - } - -/* - pr_Number: - ( NUMBER - | !macro:MACRO_INT - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(NUMBER,value); - ## = #(tempAST); - }else{ - tempAST.initialize(NUMBER,"0"); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("Could not resolve integer definition: " + definition + " using 0 as replacement."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - } - ); -*/ - - @Override public void exitPr_Float(@NotNull CfgParser.Pr_FloatContext ctx) { - //TODO: implement - } - -/* - pr_Float: - ( FLOAT - | !macro:MACRO_FLOAT - { - int commaPosition = macro.getText().indexOf(','); - String definition = macro.getText().substring(2,commaPosition); - LocationAST tempAST = new LocationAST(); - String value = getDefinitionValue(definition); - if(value != null){ - tempAST.initialize(FLOAT,value); - ## = #(tempAST); - }else{ - tempAST.initialize(FLOAT,"0.0"); - ## = #(tempAST); - RecognitionException ex = - new RecognitionException("No macro or environmental variable defined " + - definition + " could be found, using 0.0 as a replacement value."); - ex.column = macro.getOffset(); - ex.line = macro.getLine(); - throw ex; - } - } - ); -*/ - -} diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigFileHandler.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigFileHandler.java index f6f3aea862..2b1e6c0597 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigFileHandler.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigFileHandler.java @@ -267,6 +267,7 @@ public final class ConfigFileHandler { if (analyzer.isLogFileNameDefined()) { logFileNameDefined = true; mLogFileName = analyzer.getLogFileName(); + localAddress = analyzer.getLocalAddress(); } LocationAST rootNode = new LocationAST( analyzer.getParseTreeRoot() ); if ( rootNode != null ) { diff --git a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigTreeNodeUtilities.java b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigTreeNodeUtilities.java index 2d052b8065..e72e006da9 100644 --- a/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigTreeNodeUtilities.java +++ b/org.eclipse.titan.common/src/org/eclipse/titan/common/parsers/cfg/ConfigTreeNodeUtilities.java @@ -7,8 +7,6 @@ ******************************************************************************/ package org.eclipse.titan.common.parsers.cfg; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.misc.Interval; import org.eclipse.titan.common.parsers.CommonHiddenStreamToken; import org.eclipse.titan.common.parsers.LocationAST; @@ -110,15 +108,6 @@ public final class ConfigTreeNodeUtilities { private static final StringBuilder print(final StringBuilder builder, final LocationAST root){ appendHiddenBefore(builder, root); - //TODO: remove - //* - ParserRuleContext rootRule = root.getRule(); - if ( rootRule != null ) { - int a = rootRule.start.getStartIndex(); - int b = rootRule.stop.getStopIndex(); - Interval interval = new Interval(a,b); - } - //*/ builder.append(root.getText()); appendChildren(builder, root); diff --git a/org.eclipse.titan.debug/META-INF/MANIFEST.MF b/org.eclipse.titan.debug/META-INF/MANIFEST.MF index 9bccc88b57..384c2326ea 100644 --- a/org.eclipse.titan.debug/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.debug/META-INF/MANIFEST.MF @@ -2,18 +2,17 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Titan_Debug Bundle-SymbolicName: org.eclipse.titan.debug;singleton:=true -Bundle-Version: 5.4.1.CRL_113_200_5_R4B_20151202-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titan.debug.Activator -Bundle-Vendor: ekrisza +Bundle-Vendor: Eclipse Titan Project Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.titan.common, org.eclipse.core.resources, org.eclipse.ui.console, - org.eclipse.titan.common;bundle-version="5.4.1", - org.eclipse.titan.designer;bundle-version="5.4.1", - org.eclipse.titan.designer -Bundle-RequiredExecutionEnvironment: J2SE-1.5 + org.eclipse.titan.common;bundle-version="5.4.3", + org.eclipse.titan.designer;bundle-version="5.4.3" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true Bundle-ClassPath: . diff --git a/org.eclipse.titan.debug/plugin.xml b/org.eclipse.titan.debug/plugin.xml index 2e3b2d9a18..1b47ffef12 100644 --- a/org.eclipse.titan.debug/plugin.xml +++ b/org.eclipse.titan.debug/plugin.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 diff --git a/org.eclipse.titan.designer/META-INF/MANIFEST.MF b/org.eclipse.titan.designer/META-INF/MANIFEST.MF index 60106f3456..85860c45fd 100644 --- a/org.eclipse.titan.designer/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.designer/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Created-By: 23.6-b04 (Oracle Corporation) Bundle-ManifestVersion: 2 Bundle-Name: TITAN_Designer Plug-in Bundle-SymbolicName: org.eclipse.titan.designer;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titan.designer.Activator Bundle-Vendor: Eclipse Titan Project Require-Bundle: org.eclipse.ui, @@ -22,7 +22,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.ui.navigator.resources, org.eclipse.core.filesystem, org.eclipse.debug.core, - org.eclipse.titan.common;bundle-version="5.4.1", + org.eclipse.titan.common;bundle-version="5.4.3", org.antlr.runtime;bundle-version="4.3.0" Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true diff --git a/org.eclipse.titan.designer/plugin.xml b/org.eclipse.titan.designer/plugin.xml index 3e6160fcb1..cbc6fd87da 100644 --- a/org.eclipse.titan.designer/plugin.xml +++ b/org.eclipse.titan.designer/plugin.xml @@ -9,206 +9,235 @@ --> <?eclipse version="4.4"?> <plugin> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.NatureConverter" - id="org.eclipse.titan.designer.actions.NatureConverter" - name="NatureConverter"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.RemoteBuilder" - id="org.eclipse.titan.designer.actions.RemoteBuilder" - name="RemoteBuilder"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.ExcludeFromBuild" - id="org.eclipse.titan.designer.actions.ExcludeFromBuild" - name="ExcludeFromBuild"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.GenerateBuilderInformation" - id="org.eclipse.titan.designer.actions.GenerateBuilderInformation" - name="GenerateBuilderInformation"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoringAction" - id="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoringAction" - name="Rename refactoring"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.FirstCharAction" - id="org.eclipse.titan.designer.editors.FirstCharAction" - name="Line Start"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.LastCharAction" - id="org.eclipse.titan.designer.editors.LastCharAction" - name="Line End"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoringAction" - id="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoringAction" - name="Rename refactoring"/></extension> - - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.configeditor.FirstCharAction" - id="org.eclipse.titan.designer.editors.configeditor.FirstCharAction" - name="Line Start"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.configeditor.LastCharAction" - id="org.eclipse.titan.designer.editors.configeditor.LastCharAction" - name="Line End"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" - id="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" - name="Rename refactoring"/></extension> - - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" - id="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" - name="Open Declaration"/> - </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" - id="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" - name="Find References"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" - id="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" - name="Open Declaration"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.FindReferences" - id="org.eclipse.titan.designer.editors.asn1editor.FindReferences" - name="Find References"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" - id="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoring" - name="Rename refactoring"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" - id="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" - name="Open Declaration"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" - id="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" - name="Open Declaration"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" - id="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" - name="Find References"/></extension> - - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" - id="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" - name="Convert XSD files to TTCN-3"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" - id="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" - name="Generate Test Port skeleton"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.CheckSemantic" - id="org.eclipse.titan.designer.actions.CheckSemantic" - name="Check syntax and semantics (no code generation)"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.CheckSyntax" - id="org.eclipse.titan.designer.actions.CheckSyntax" - name="Check syntax (no semantic check, no code generation)"/></extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.NatureConverter" + id="org.eclipse.titan.designer.actions.NatureConverter" name="NatureConverter" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.RemoteBuilder" + id="org.eclipse.titan.designer.actions.RemoteBuilder" name="RemoteBuilder" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.ExcludeFromBuild" + id="org.eclipse.titan.designer.actions.ExcludeFromBuild" name="ExcludeFromBuild" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.actions.GenerateBuilderInformation" + id="org.eclipse.titan.designer.actions.GenerateBuilderInformation" + name="GenerateBuilderInformation" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoringAction" + id="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoringAction" + name="Rename refactoring" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.editors.FirstCharAction" + id="org.eclipse.titan.designer.editors.FirstCharAction" name="Line Start" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.editors.LastCharAction" + id="org.eclipse.titan.designer.editors.LastCharAction" name="Line End" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoringAction" + id="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoringAction" + name="Rename refactoring" /> + </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckVersion" - id="org.eclipse.titan.designer.nativewin32actions.CheckVersion" - name="Check compiler version"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckSemantic" - id="org.eclipse.titan.designer.nativewin32actions.CheckSemantic" - name="Check syntax and semantics (no code generation, native Windows version)"/></extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.configeditor.FirstCharAction" + id="org.eclipse.titan.designer.editors.configeditor.FirstCharAction" + name="Line Start" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.configeditor.LastCharAction" + id="org.eclipse.titan.designer.editors.configeditor.LastCharAction" + name="Line End" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" + id="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" + name="Rename refactoring" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" + id="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" + name="Open Declaration" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" + id="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" + name="Find References" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" + id="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" + name="Open Declaration" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.FindReferences" + id="org.eclipse.titan.designer.editors.asn1editor.FindReferences" + name="Find References" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoringAction" + id="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoring" + name="Rename refactoring" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" + id="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" + name="Open Declaration" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" + id="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" + name="Open Declaration" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" + id="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" + name="Find References" /> + </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckSyntax" - id="org.eclipse.titan.designer.nativewin32actions.CheckSyntax" - name="Check syntax (no semantic check, no code generation, native Windows version)"/></extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" + id="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" name="Convert XSD files to TTCN-3" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" + id="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" + name="Generate Test Port skeleton" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.CheckSemantic" + id="org.eclipse.titan.designer.actions.CheckSemantic" name="Check syntax and semantics (no code generation)" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.CheckSyntax" + id="org.eclipse.titan.designer.actions.CheckSyntax" name="Check syntax (no semantic check, no code generation)" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckVersion" + id="org.eclipse.titan.designer.nativewin32actions.CheckVersion" + name="Check compiler version" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckSemantic" + id="org.eclipse.titan.designer.nativewin32actions.CheckSemantic" + name="Check syntax and semantics (no code generation, native Windows version)" /> + </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.actions.CheckVersion" - id="org.eclipse.titan.designer.actions.CheckVersion" - name="Check syntax (no semantic check, no code generation, native Windows version)"/></extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.nativewin32actions.CheckSyntax" + id="org.eclipse.titan.designer.nativewin32actions.CheckSyntax" + name="Check syntax (no semantic check, no code generation, native Windows version)" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command defaultHandler="org.eclipse.titan.designer.actions.CheckVersion" + id="org.eclipse.titan.designer.actions.CheckVersion" + name="Check syntax (no semantic check, no code generation, native Windows version)" /> + </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.IndentAction" - id="org.eclipse.titan.designer.editors.asn1editor.IndentAction" - name="IndentAction"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.configeditor.IndentAction" - id="org.eclipse.titan.designer.editors.configeditor.IndentAction" - name="IndentAction"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.IndentAction" - id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3IndentAction" - name="IndentAction"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" - id="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" - name="IndentAction"/></extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.IndentAction" + id="org.eclipse.titan.designer.editors.asn1editor.IndentAction" + name="IndentAction" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.configeditor.IndentAction" + id="org.eclipse.titan.designer.editors.configeditor.IndentAction" + name="IndentAction" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.IndentAction" + id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3IndentAction" + name="IndentAction" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" + id="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" + name="IndentAction" /> + </extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.GotoMatchingBracketAction" - id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3GotoMatchingBracketAction" - name="Go to Matching Bracket"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.GotoMatchingBracketAction" - id="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPGotoMatchingBracketAction" - name="Go to Matching Bracket"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.configeditor.GotoMatchingBracketAction" - id="org.eclipse.titan.designer.editors.configeditor.ConfigGotoMatchingBracketAction" - name="Go to Matching Bracket"/></extension> - <extension point="org.eclipse.ui.commands"><command - defaultHandler="org.eclipse.titan.designer.editors.asn1editor.GotoMatchingBracketAction" - id="org.eclipse.titan.designer.editors.asn1editor.ASN1GotoMatchingBracketAction" - name="Go to Matching Bracket"/> + <extension point="org.eclipse.ui.commands"> <command - defaultHandler="org.eclipse.titan.designer.actions.FindDefinitionAction" - id="org.eclipse.titan.designer.actions.FindDefinitionAction" - name="Find definition"/> + defaultHandler="org.eclipse.titan.designer.editors.ttcn3editor.GotoMatchingBracketAction" + id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3GotoMatchingBracketAction" + name="Go to Matching Bracket" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.ttcnppeditor.GotoMatchingBracketAction" + id="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPGotoMatchingBracketAction" + name="Go to Matching Bracket" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.configeditor.GotoMatchingBracketAction" + id="org.eclipse.titan.designer.editors.configeditor.ConfigGotoMatchingBracketAction" + name="Go to Matching Bracket" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.designer.editors.asn1editor.GotoMatchingBracketAction" + id="org.eclipse.titan.designer.editors.asn1editor.ASN1GotoMatchingBracketAction" + name="Go to Matching Bracket" /> + <command defaultHandler="org.eclipse.titan.designer.actions.FindDefinitionAction" + id="org.eclipse.titan.designer.actions.FindDefinitionAction" name="Find definition" /> </extension> - <extension - point="org.eclipse.ui.editors"> - <editor - name="TTCN-3 Editor" - extensions="ttcn, ttcn3" - icon="icons/ttcn.gif" + <extension point="org.eclipse.ui.editors"> + <editor name="TTCN-3 Editor" extensions="ttcn, ttcn3" icon="icons/ttcn.gif" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" class="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Editor" id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Editor"> </editor> - <editor - name="TTCNPP Editor" - extensions="ttcnpp" - icon="icons/ttcnpp.gif" + <editor name="TTCNPP Editor" extensions="ttcnpp" icon="icons/ttcnpp.gif" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" class="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPEditor" id="org.eclipse.titan.designer.editors.ttcn3ppeditor.TTCN3PPEditor"> </editor> - <editor - name="TTCNINC Editor" - extensions="ttcnin" - icon="icons/ttcninc.gif" + <editor name="TTCNINC Editor" extensions="ttcnin" icon="icons/ttcninc.gif" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" class="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPEditor" id="org.eclipse.titan.designer.editors.ttcn3ineditor.TTCN3INEditor"> </editor> - <editor - name="ASN1 Editor" - extensions="asn, asn1" - icon="icons/asn.gif" + <editor name="ASN1 Editor" extensions="asn, asn1" icon="icons/asn.gif" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" class="org.eclipse.titan.designer.editors.asn1editor.ASN1Editor" id="org.eclipse.titan.designer.editors.asn1editor.ASN1Editor"> </editor> - <editor - name="Configuration Editor" - extensions="cfg" - icon="icons/cfg.gif" - contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" + <editor name="Configuration Editor" extensions="cfg" + icon="icons/cfg.gif" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" class="org.eclipse.titan.designer.editors.configeditor.ConfigEditor" id="org.eclipse.titan.designer.editors.configeditor.ConfigEditor"> </editor> @@ -219,292 +248,231 @@ -<extension - id="TITANActions" - name="TITAN Actions" - point="org.eclipse.ui.menus"> + <extension id="TITANActions" name="TITAN Actions" point="org.eclipse.ui.menus"> <menuContribution - locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions"> - <toolbar + locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions"> + <toolbar id="org.eclipse.example.commands.toolbar.changeSetOperations" - label="ChangeSet Operations"> - <command - commandId="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" - icon="icons/xsd2ttcn.gif" - disabledIcon="icons/xsd2ttcn_d.gif" - label="Convert XSD files to TTCN-3" - tooltip="Convert XSD files to TTCN-3"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + label="ChangeSet Operations"> + <command commandId="org.eclipse.titan.designer.actions.ConvertXSD2TTCN" + icon="icons/xsd2ttcn.gif" disabledIcon="icons/xsd2ttcn_d.gif" + label="Convert XSD files to TTCN-3" tooltip="Convert XSD files to TTCN-3"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" - icon="icons/generate_testport.gif" - disabledIcon="icons/generate_testport_d.gif" - label="Generate Test Port skeleton" - tooltip="Generate Test Port skeleton"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.designer.actions.GenerateTestPortSkeleton" + icon="icons/generate_testport.gif" disabledIcon="icons/generate_testport_d.gif" + label="Generate Test Port skeleton" tooltip="Generate Test Port skeleton"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.CheckVersion" - icon="icons/check_version.gif" - disabledIcon="icons/check_version_d.gif" - label="Check compiler version" - tooltip="Check compiler version"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.designer.actions.CheckVersion" + icon="icons/check_version.gif" disabledIcon="icons/check_version_d.gif" + label="Check compiler version" tooltip="Check compiler version"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.CheckSemantic" - icon="icons/check_semantic.gif" - disabledIcon="icons/check_semantic_d.gif" - label="Check semantics" - tooltip="Check syntax and semantics (no code generation)"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.designer.actions.CheckSemantic" + icon="icons/check_semantic.gif" disabledIcon="icons/check_semantic_d.gif" + label="Check semantics" tooltip="Check syntax and semantics (no code generation)"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.CheckSyntax" - icon="icons/check_syntax.gif" - disabledIcon="icons/check_syntax_d.gif" - label="Check syntax" - tooltip="Check syntax (no semantic check, no code generation)"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.designer.actions.CheckSyntax" + icon="icons/check_syntax.gif" disabledIcon="icons/check_syntax_d.gif" + label="Check syntax" tooltip="Check syntax (no semantic check, no code generation)"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> - <command - id="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" - commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" - label="Toggle Comment" - tooltip="Toggle Comment"> - <visibleWhen> - <not> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> + </visibleWhen> + </command> + <command + id="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" + commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" + label="Toggle Comment" tooltip="Toggle Comment"> + <visibleWhen> + <not> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> </not> - </visibleWhen> - </command> + </visibleWhen> + </command> </toolbar> </menuContribution> <menuContribution - locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions"> - <toolbar + locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions"> + <toolbar id="org.eclipse.example.commands.toolbar.changeSetOperations" - label="ChangeSet Operations"> - <command - icon="icons/check_version_win.gif" - disabledIcon="icons/check_version_win_d.gif" - label="Check compiler version" - tooltip="Check compiler version (native Windows version)" - commandId="org.eclipse.titan.designer.nativewin32actions.CheckVersion"> - <visibleWhen> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> - </visibleWhen> - </command> - <command - id="org.eclipse.titan.designer.nativewin32CheckSemantic" - icon="icons/check_semantic_win.gif" - disabledIcon="icons/check_semantic_win_d.gif" - label="Check semantics" - tooltip="Check syntax and semantics (no code generation, native Windows version)" - commandId="org.eclipse.titan.designer.nativewin32actions.CheckSemantic"> - <visibleWhen> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> - </visibleWhen> - </command> - <command - id="org.eclipse.titan.designer.nativewin32CheckSyntax" - icon="icons/check_syntax_win.gif" - disabledIcon="icons/check_syntax_win_d.gif" - label="Check syntax" - tooltip="Check syntax (no semantic check, no code generation, native Windows version)" - commandId="org.eclipse.titan.designer.nativewin32actions.CheckSyntax"> - <visibleWhen> - <or> - <systemTest property="os.name" value="Windows 7"/> - <systemTest property="os.name" value="Windows Vista"/> - </or> - </visibleWhen> - </command> + label="ChangeSet Operations"> + <command icon="icons/check_version_win.gif" + disabledIcon="icons/check_version_win_d.gif" label="Check compiler version" + tooltip="Check compiler version (native Windows version)" + commandId="org.eclipse.titan.designer.nativewin32actions.CheckVersion"> + <visibleWhen> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> + </visibleWhen> + </command> + <command id="org.eclipse.titan.designer.nativewin32CheckSemantic" + icon="icons/check_semantic_win.gif" disabledIcon="icons/check_semantic_win_d.gif" + label="Check semantics" + tooltip="Check syntax and semantics (no code generation, native Windows version)" + commandId="org.eclipse.titan.designer.nativewin32actions.CheckSemantic"> + <visibleWhen> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> + </visibleWhen> + </command> + <command id="org.eclipse.titan.designer.nativewin32CheckSyntax" + icon="icons/check_syntax_win.gif" disabledIcon="icons/check_syntax_win_d.gif" + label="Check syntax" + tooltip="Check syntax (no semantic check, no code generation, native Windows version)" + commandId="org.eclipse.titan.designer.nativewin32actions.CheckSyntax"> + <visibleWhen> + <or> + <systemTest property="os.name" value="Windows 7" /> + <systemTest property="os.name" value="Windows Vista" /> + </or> + </visibleWhen> + </command> </toolbar> </menuContribution> </extension> - <extension - id="org.eclipse.titan.designer.core.TITANNature" - name="TITAN Nature" - point="org.eclipse.core.resources.natures"> + <extension id="org.eclipse.titan.designer.core.TITANNature" + name="TITAN Nature" point="org.eclipse.core.resources.natures"> <runtime> - <run class="org.eclipse.titan.designer.core.TITANNature"/> + <run class="org.eclipse.titan.designer.core.TITANNature" /> </runtime> - <builder id="org.eclipse.titan.designer.core.TITANBuilder"/> + <builder id="org.eclipse.titan.designer.core.TITANBuilder" /> </extension> - <extension - point="org.eclipse.ui.ide.projectNatureImages"> - <image - icon="icons/titan.gif" - id="org.eclipse.titan.designer.core.TITANNatureImage" - natureId="org.eclipse.titan.designer.core.TITANNature"/> + <extension point="org.eclipse.ui.ide.projectNatureImages"> + <image icon="icons/titan.gif" id="org.eclipse.titan.designer.core.TITANNatureImage" + natureId="org.eclipse.titan.designer.core.TITANNature" /> </extension> - <extension - id="org.eclipse.titan.designer.core.TITANBuilder" - name="TITANBuilder" - point="org.eclipse.core.resources.builders"> + <extension id="org.eclipse.titan.designer.core.TITANBuilder" + name="TITANBuilder" point="org.eclipse.core.resources.builders"> <builder hasNature="true"> - <run class="org.eclipse.titan.designer.core.TITANBuilder"/> + <run class="org.eclipse.titan.designer.core.TITANBuilder" /> </builder> </extension> - <extension - point="org.eclipse.ui.menus"> - <menuContribution - locationURI= - "popup:org.eclipse.ui.popup.any?after=additions"> - <menu label="Titan"> - <command - commandId="org.eclipse.titan.designer.actions.ExcludeFromBuild" - label="Toggle exclude from build state" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IResource"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.NatureConverter" - label="Toggle Titan project nature" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <separator - name="org.eclipse.titan.designer.separator1" - visible="true"> - </separator> - <command - commandId="org.eclipse.titan.designer.actions.GenerateBuilderInformation" - id="org.eclipse.titan.designer.actions.GenerateBuilderInformation" - label="Generate external builder information" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titan.designer.actions.RemoteBuilder" - id="org.eclipse.titan.designer.core.RemoteBuilder" - label="Build remotely"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - </menu> - </menuContribution> - + <extension point="org.eclipse.ui.menus"> + <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> + <menu + id="org.eclipse.titan.designer.TitanMenu" + label="Titan"> + <command commandId="org.eclipse.titan.designer.actions.ExcludeFromBuild" + label="Toggle exclude from build state" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IResource"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.designer.actions.NatureConverter" + label="Toggle Titan project nature" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <separator name="org.eclipse.titan.designer.separator1" + visible="true"> + </separator> + <command + commandId="org.eclipse.titan.designer.actions.GenerateBuilderInformation" + id="org.eclipse.titan.designer.actions.GenerateBuilderInformation" + label="Generate external builder information" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titan.designer.actions.RemoteBuilder" + id="org.eclipse.titan.designer.core.RemoteBuilder" label="Build remotely"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + </menu> + </menuContribution> <menuContribution - locationURI= - "popup:org.eclipse.titan.designer.editors.asn1editor.context?after=additions"> + locationURI="popup:org.eclipse.titan.designer.editors.asn1editor.context?after=additions"> <command - id="org.eclipse.titan.designer.editors.asn1editor.ASN1Indentation" - commandId="org.eclipse.titan.designer.editors.asn1editor.IndentAction" - label="Correct Indentation" - icon="icons/titan.gif"> + id="org.eclipse.titan.designer.editors.asn1editor.ASN1Indentation" + commandId="org.eclipse.titan.designer.editors.asn1editor.IndentAction" + label="Correct Indentation" icon="icons/titan.gif"> </command> <command id="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" commandId="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" - label="Open Declaration" - icon="icons/titan.gif"> + label="Open Declaration" icon="icons/titan.gif"> </command> <command id="org.eclipse.titan.designer.editors.asn1editor.FindReferences" commandId="org.eclipse.titan.designer.editors.asn1editor.FindReferences" - label="Find References" - icon="icons/titan.gif"> + label="Find References" icon="icons/titan.gif"> </command> <command commandId="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoring" @@ -514,37 +482,32 @@ </command> </menuContribution> - <menuContribution - locationURI= - "popup:org.eclipse.titan.designer.editors.configeditor.context?after=additions"> - <command + <menuContribution + locationURI="popup:org.eclipse.titan.designer.editors.configeditor.context?after=additions"> + <command id="org.eclipse.titan.designer.editors.configeditor.ConfigIndentation" commandId="org.eclipse.titan.designer.editors.configeditor.IndentAction" - label="Correct Indentation" - icon="icons/titan.gif"> + label="Correct Indentation" icon="icons/titan.gif"> </command> <command id="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" commandId="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" - label="Open Declaration" - icon="icons/titan.gif"> + label="Open Declaration" icon="icons/titan.gif"> </command> </menuContribution> - <menuContribution + <menuContribution locationURI="popup:org.eclipse.titan.designer.editors.ttcn3editor.context?after=additions"> <command id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Indentation" commandId="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3IndentAction" - label="Correct Indentation" - icon="icons/titan.gif"> + label="Correct Indentation" icon="icons/titan.gif"> </command> <command id="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" commandId="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" - label="Open Declaration" - icon="icons/titan.gif"> + label="Open Declaration" icon="icons/titan.gif"> </command> <command commandId="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" @@ -565,14 +528,12 @@ <command id="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPIndentation" commandId="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" - label="Correct Indentation" - icon="icons/titan.gif"> + label="Correct Indentation" icon="icons/titan.gif"> </command> <command id="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" commandId="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" - label="Open Declaration" - icon="icons/titan.gif"> + label="Open Declaration" icon="icons/titan.gif"> </command> <command commandId="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" @@ -589,653 +550,513 @@ </menuContribution> - </extension> + </extension> - <extension - point="org.eclipse.core.runtime.preferences"> - <initializer class="org.eclipse.titan.designer.preferences.PreferenceInitializer"/> + <extension point="org.eclipse.core.runtime.preferences"> + <initializer + class="org.eclipse.titan.designer.preferences.PreferenceInitializer" /> </extension> <extension point="org.eclipse.ui.preferencePages"> <page id="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" class="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" - name="TITAN Preferences"/> + name="TITAN Preferences" /> <page id="org.eclipse.titan.designer.preferences.pages.ContentAssistPage" class="org.eclipse.titan.designer.preferences.pages.ContentAssistPage" name="Content Assist" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page - id="org.eclipse.titan.designer.preferences.pages.FoldingPage" + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.FoldingPage" class="org.eclipse.titan.designer.preferences.pages.FoldingPage" name="Folding" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage" class="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage" name="On-the-fly checker" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.ErrorsWarningsPreferencePage" class="org.eclipse.titan.designer.preferences.pages.ErrorsWarningsPreferencePage" name="Errors/Warnings" - category="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.NamingConventionPreferencePage" class="org.eclipse.titan.designer.preferences.pages.NamingConventionPreferencePage" name="Naming conventions" - category="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.OnTheFlyCheckerPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.ExcludedResourcesPreferencePage" class="org.eclipse.titan.designer.preferences.pages.ExcludedResourcesPreferencePage" name="Excluded resources" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.SyntaxHighlightPage" class="org.eclipse.titan.designer.preferences.pages.SyntaxHighlightPage" name="Syntax Coloring" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.ShowMatchingBracketPage" class="org.eclipse.titan.designer.preferences.pages.ShowMatchingBracketPage" name="Highlight matching brackets" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> <page id="org.eclipse.titan.designer.preferences.pages.MarkOccurrencesPage" class="org.eclipse.titan.designer.preferences.pages.MarkOccurrencesPage" name="Mark occurrences" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page - id="org.eclipse.titan.designer.preferences.pages.IndentationPage" + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.IndentationPage" class="org.eclipse.titan.designer.preferences.pages.IndentationPage" name="Indentation" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page - id="org.eclipse.titan.designer.preferences.pages.TypingPage" + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.TypingPage" class="org.eclipse.titan.designer.preferences.pages.TypingPage" name="Typing" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page - id="org.eclipse.titan.designer.preferences.pages.TITANActionPage" + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.TITANActionPage" class="org.eclipse.titan.designer.preferences.pages.TITANActionPage" name="TITAN actions" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.DebugPreferencePage" class="org.eclipse.titan.designer.preferences.pages.DebugPreferencePage" name="Debug" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> - <page + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> + <page id="org.eclipse.titan.designer.preferences.pages.ExportOptionsPage" class="org.eclipse.titan.designer.preferences.pages.ExportOptionsPage" name="Export" - category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage"/> + category="org.eclipse.titan.designer.preferences.pages.TITANPreferencePage" /> </extension> - <extension - point="org.eclipse.ui.propertyPages"> - <page - name="TITAN Project Property" - nameFilter="*" + <extension point="org.eclipse.ui.propertyPages"> + <page name="TITAN Project Property" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.ProjectBuildPropertyPage" id="org.eclipse.titan.designer.properties.pages.ProjectBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> + <instanceof value="org.eclipse.core.resources.IProject"> </instanceof> </enabledWhen> </page> - <page - name="Naming convention" - nameFilter="*" + <page name="Naming convention" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.ProjectNamingConventionPropertyPage" id="org.eclipse.titan.designer.properties.pages.ProjectNamingConventionPropertyPage" category="org.eclipse.titan.designer.properties.pages.ProjectBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> + <instanceof value="org.eclipse.core.resources.IProject"> </instanceof> </enabledWhen> </page> - <page - name="Remote build" - nameFilter="*" + <page name="Remote build" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.ProjectRemoteBuildPropertyPage" id="org.eclipse.titan.designer.properties.pages.ProjectRemoteBuildPropertyPage" category="org.eclipse.titan.designer.properties.pages.ProjectBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> + <instanceof value="org.eclipse.core.resources.IProject"> </instanceof> </enabledWhen> </page> - <page - name="Project Configurations" - nameFilter="*" + <page name="Project Configurations" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.ProjectConfigurationsPropertyPage" id="org.eclipse.titan.designer.properties.pages.ProjectConfigurationsPropertyPage" category="org.eclipse.titan.designer.properties.pages.ProjectBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> + <instanceof value="org.eclipse.core.resources.IProject"> </instanceof> </enabledWhen> </page> - <page - name="TITAN Folder Property" - nameFilter="*" + <page name="TITAN Folder Property" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.FolderBuildPropertyPage" id="org.eclipse.titan.designer.properties.pages.FolderBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IFolder"> + <instanceof value="org.eclipse.core.resources.IFolder"> </instanceof> </enabledWhen> </page> - <page - name="Naming convention" - nameFilter="*" + <page name="Naming convention" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.FolderNamingConventionPropertyPage" id="org.eclipse.titan.designer.properties.pages.FolderNamingConventionPropertyPage" category="org.eclipse.titan.designer.properties.pages.FolderBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IFolder"> + <instanceof value="org.eclipse.core.resources.IFolder"> </instanceof> </enabledWhen> </page> - <page - name="TITAN File Property" - nameFilter="*" + <page name="TITAN File Property" nameFilter="*" class="org.eclipse.titan.designer.properties.pages.FileBuildPropertyPage" id="org.eclipse.titan.designer.properties.pages.FileBuildPropertyPage"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> </filter> <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IFile"> + <instanceof value="org.eclipse.core.resources.IFile"> </instanceof> </enabledWhen> </page> </extension> <extension point="org.eclipse.ui.decorators"> - <decorator - id="org.eclipse.titan.designer.decorators.TITANDecorator" - lightweight="false" - label="TITAN Decorator" - state="true" - class= "org.eclipse.titan.designer.decorators.TITANDecorator" + <decorator id="org.eclipse.titan.designer.decorators.TITANDecorator" + lightweight="false" label="TITAN Decorator" state="true" + class="org.eclipse.titan.designer.decorators.TITANDecorator" adaptable="false"> <description> - This decorator shows whether the Makefile is managed by TITAN or the user. + This decorator shows whether the Makefile is managed + by TITAN or the user. </description> <enablement> - <objectClass name="org.eclipse.core.resources.IResource"/> + <objectClass name="org.eclipse.core.resources.IResource" /> </enablement> </decorator> </extension> - <extension - id="org.eclipse.titan.designer.compilerErrorMarker" - name="Compiler's error markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="compilerproblems"/> + <extension id="org.eclipse.titan.designer.compilerErrorMarker" + name="Compiler's error markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="compilerproblems" /> </extension> - <extension - id="org.eclipse.titan.designer.compilerWarningMarker" - name="Compiler's warning markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="compilerproblems"/> - </extension> - <extension - id="org.eclipse.titan.designer.compilerInfoMarker" - name="Compiler's info markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="compilerproblems"/> + <extension id="org.eclipse.titan.designer.compilerWarningMarker" + name="Compiler's warning markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="compilerproblems" /> </extension> - <extension - id="org.eclipse.titan.designer.ontheflySyntacticMarker" - name="on-the-fly syntactic markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="ontheflyproblems"/> + <extension id="org.eclipse.titan.designer.compilerInfoMarker" + name="Compiler's info markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="compilerproblems" /> </extension> - <extension - id="org.eclipse.titan.designer.ontheflySemanticMarker" - name="on-the-fly semantic markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="ontheflyproblems"/> - </extension> - <extension - id="org.eclipse.titan.designer.ontheflyMixedMarker" - name="on-the-fly mixed markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="ontheflyproblems"/> + <extension id="org.eclipse.titan.designer.ontheflySyntacticMarker" + name="on-the-fly syntactic markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="ontheflyproblems" /> </extension> - <extension - id="org.eclipse.titan.designer.ontheflyTaskMarker" - name="on-the-fly task markers" - point="org.eclipse.core.resources.markers"> - <super type="org.eclipse.core.resources.taskmarker"/> - <attribute name="ontheflyproblems"/> + <extension id="org.eclipse.titan.designer.ontheflySemanticMarker" + name="on-the-fly semantic markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="ontheflyproblems" /> </extension> - <extension - point="org.eclipse.ui.ide.markerSupport"> + <extension id="org.eclipse.titan.designer.ontheflyMixedMarker" + name="on-the-fly mixed markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="ontheflyproblems" /> + </extension> + <extension id="org.eclipse.titan.designer.ontheflyTaskMarker" + name="on-the-fly task markers" point="org.eclipse.core.resources.markers"> + <super type="org.eclipse.core.resources.taskmarker" /> + <attribute name="ontheflyproblems" /> + </extension> + <extension point="org.eclipse.ui.ide.markerSupport"> <markerTypeCategory name="TITAN compiler problems"> - <markerTypeReference id="org.eclipse.titan.designer.compilerErrorMarker"/> - <markerTypeReference id="org.eclipse.titan.designer.compilerWarningMarker"/> - <markerTypeReference id="org.eclipse.titan.designer.compilerInfoMarker"/> + <markerTypeReference + id="org.eclipse.titan.designer.compilerErrorMarker" /> + <markerTypeReference + id="org.eclipse.titan.designer.compilerWarningMarker" /> + <markerTypeReference + id="org.eclipse.titan.designer.compilerInfoMarker" /> </markerTypeCategory> <markerTypeCategory name="TITAN on-the-fly syntactic problems"> - <markerTypeReference id="org.eclipse.titan.designer.ontheflySyntacticMarker"/> + <markerTypeReference + id="org.eclipse.titan.designer.ontheflySyntacticMarker" /> </markerTypeCategory> <markerTypeCategory name="TITAN on-the-fly semantic problems"> - <markerTypeReference id="org.eclipse.titan.designer.ontheflySemanticMarker"/> + <markerTypeReference + id="org.eclipse.titan.designer.ontheflySemanticMarker" /> </markerTypeCategory> - <markerTypeCategory name="TITAN on-the-fly mixed problems"> - <markerTypeReference id="org.eclipse.titan.designer.ontheflyMixedMarker"/> + <markerTypeCategory name="TITAN on-the-fly mixed problems"> + <markerTypeReference + id="org.eclipse.titan.designer.ontheflyMixedMarker" /> </markerTypeCategory> - <markerGrouping - id="org.eclipse.titan.designer.markerGrouping" - label="TITAN problems"/> - <markerGroupingEntry - id="org.eclipse.titan.designer.TITANProblemsGroup" - label="TITAN problems" - markerGrouping="org.eclipse.titan.designer.markerGrouping" - priority="994"/> - <markerAttributeGrouping - attribute="compilerproblems" + <markerGrouping id="org.eclipse.titan.designer.markerGrouping" + label="TITAN problems" /> + <markerGroupingEntry id="org.eclipse.titan.designer.TITANProblemsGroup" + label="TITAN problems" markerGrouping="org.eclipse.titan.designer.markerGrouping" + priority="994" /> + <markerAttributeGrouping attribute="compilerproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.compilerErrorMarker"/> - <markerAttributeGrouping - attribute="compilerproblems" + markerType="org.eclipse.titan.designer.compilerErrorMarker" /> + <markerAttributeGrouping attribute="compilerproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.compilerWarningMarker"/> - <markerAttributeGrouping - attribute="compilerproblems" + markerType="org.eclipse.titan.designer.compilerWarningMarker" /> + <markerAttributeGrouping attribute="compilerproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.compilerInfoMarker"/> - <markerAttributeGrouping - attribute="ontheflyproblems" + markerType="org.eclipse.titan.designer.compilerInfoMarker" /> + <markerAttributeGrouping attribute="ontheflyproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.ontheflySyntacticMarker"/> - <markerAttributeGrouping - attribute="ontheflyproblems" + markerType="org.eclipse.titan.designer.ontheflySyntacticMarker" /> + <markerAttributeGrouping attribute="ontheflyproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.ontheflySemanticMarker"/> - <markerAttributeGrouping - attribute="ontheflyproblems" + markerType="org.eclipse.titan.designer.ontheflySemanticMarker" /> + <markerAttributeGrouping attribute="ontheflyproblems" defaultGroupingEntry="org.eclipse.titan.designer.TITANProblemsGroup" - markerType="org.eclipse.titan.designer.ontheflyMixedMarker"/> + markerType="org.eclipse.titan.designer.ontheflyMixedMarker" /> </extension> <extension point="org.eclipse.ui.editors.annotationTypes"> - <type - name="org.eclipse.titan.designer.compilerErrorMarkerAnnotationType" - super="org.eclipse.ui.workbench.texteditor.error" - markerType="org.eclipse.titan.designer.compilerErrorMarker"> - </type> - <type - name="org.eclipse.titan.designer.compilerWarningMarkerAnnotationType" - super="org.eclipse.ui.workbench.texteditor.warning" - markerType="org.eclipse.titan.designer.compilerWarningMarker"> - </type> - <type - name="org.eclipse.titan.designer.compilerInfoMarkerAnnotationType" - super="org.eclipse.ui.workbench.texteditor.info" - markerType="org.eclipse.titan.designer.compilerInfoMarker"> - </type> - <type - name="org.eclipse.titan.occurrences"> - </type> - <type - name="org.eclipse.titan.inactive_code"> - </type> + <type name="org.eclipse.titan.designer.compilerErrorMarkerAnnotationType" + super="org.eclipse.ui.workbench.texteditor.error" markerType="org.eclipse.titan.designer.compilerErrorMarker"> + </type> + <type + name="org.eclipse.titan.designer.compilerWarningMarkerAnnotationType" + super="org.eclipse.ui.workbench.texteditor.warning" markerType="org.eclipse.titan.designer.compilerWarningMarker"> + </type> + <type name="org.eclipse.titan.designer.compilerInfoMarkerAnnotationType" + super="org.eclipse.ui.workbench.texteditor.info" markerType="org.eclipse.titan.designer.compilerInfoMarker"> + </type> + <type name="org.eclipse.titan.occurrences"> + </type> + <type name="org.eclipse.titan.inactive_code"> + </type> </extension> <extension point="org.eclipse.ui.editors.markerAnnotationSpecification"> <specification - annotationType = "org.eclipse.titan.designer.compilerErrorMarkerAnnotationType" - annotationImageProvider = "org.eclipse.titan.designer.editors.AnnotationImageProvider" - verticalRulerPreferenceValue="true" - overviewRulerPreferenceValue="true"> + annotationType="org.eclipse.titan.designer.compilerErrorMarkerAnnotationType" + annotationImageProvider="org.eclipse.titan.designer.editors.AnnotationImageProvider" + verticalRulerPreferenceValue="true" overviewRulerPreferenceValue="true"> </specification> <specification - annotationType = "org.eclipse.titan.designer.compilerWarningMarkerAnnotationType" - annotationImageProvider = "org.eclipse.titan.designer.editors.AnnotationImageProvider" - verticalRulerPreferenceValue="true" - overviewRulerPreferenceValue="true"> + annotationType="org.eclipse.titan.designer.compilerWarningMarkerAnnotationType" + annotationImageProvider="org.eclipse.titan.designer.editors.AnnotationImageProvider" + verticalRulerPreferenceValue="true" overviewRulerPreferenceValue="true"> </specification> <specification - annotationType = "org.eclipse.titan.designer.compilerInfoMarkerAnnotationType" - annotationImageProvider = "org.eclipse.titan.designer.editors.AnnotationImageProvider" - verticalRulerPreferenceValue="true" - overviewRulerPreferenceValue="true"> + annotationType="org.eclipse.titan.designer.compilerInfoMarkerAnnotationType" + annotationImageProvider="org.eclipse.titan.designer.editors.AnnotationImageProvider" + verticalRulerPreferenceValue="true" overviewRulerPreferenceValue="true"> </specification> - <specification - annotationType="org.eclipse.titan.occurrences" - label="Occurrences" - icon="icons/match.gif" - colorPreferenceKey="occurrenceMarkColor" - colorPreferenceValue="212,212,212" - overviewRulerPreferenceKey="occurrenceMarkOverviewRuler" + <specification annotationType="org.eclipse.titan.occurrences" + label="Occurrences" icon="icons/match.gif" colorPreferenceKey="occurrenceMarkColor" + colorPreferenceValue="212,212,212" overviewRulerPreferenceKey="occurrenceMarkOverviewRuler" verticalRulerPreferenceKey="occurrenceMarkVerticalRuler" - overviewRulerPreferenceValue="true" - verticalRulerPreferenceValue="false" - textPreferenceKey="occurrenceMark" - highlightPreferenceKey="occurrenceHighlighting" - highlightPreferenceValue="true" - presentationLayer="4" - textPreferenceValue="false" - contributesToHeader="false" + overviewRulerPreferenceValue="true" verticalRulerPreferenceValue="false" + textPreferenceKey="occurrenceMark" highlightPreferenceKey="occurrenceHighlighting" + highlightPreferenceValue="true" presentationLayer="4" + textPreferenceValue="false" contributesToHeader="false" showInNextPrevDropdownToolbarActionKey="occurrenceMarkInNextPrevDropdownToolbarAction" showInNextPrevDropdownToolbarAction="true"> </specification> - <specification - annotationType="org.eclipse.titan.inactive_code" - label="Inactive code" - icon="icons/match.gif" - colorPreferenceKey="inactiveCodeMarkColor" - colorPreferenceValue="212,212,212" - overviewRulerPreferenceKey="inactiveCodeMarkOverviewRuler" + <specification annotationType="org.eclipse.titan.inactive_code" + label="Inactive code" icon="icons/match.gif" colorPreferenceKey="inactiveCodeMarkColor" + colorPreferenceValue="212,212,212" overviewRulerPreferenceKey="inactiveCodeMarkOverviewRuler" verticalRulerPreferenceKey="inactiveCodeMarkVerticalRuler" - overviewRulerPreferenceValue="true" - verticalRulerPreferenceValue="false" - textPreferenceKey="inactiveCodeMark" - highlightPreferenceKey="inactiveCodeHighlighting" - highlightPreferenceValue="true" - presentationLayer="4" - textPreferenceValue="false" - contributesToHeader="false" + overviewRulerPreferenceValue="true" verticalRulerPreferenceValue="false" + textPreferenceKey="inactiveCodeMark" highlightPreferenceKey="inactiveCodeHighlighting" + highlightPreferenceValue="true" presentationLayer="4" + textPreferenceValue="false" contributesToHeader="false" showInNextPrevDropdownToolbarActionKey="inactiveCodeMarkInNextPrevDropdownToolbarAction" showInNextPrevDropdownToolbarAction="true"> </specification> - </extension > - <extension - point="org.eclipse.ui.newWizards"> + </extension> + <extension point="org.eclipse.ui.newWizards"> <wizard category="org.eclipse.titan.designer.wizards.NewTITANWizard" class="org.eclipse.titan.designer.wizards.NewTITANProjectWizard" - icon="icons/titan.gif" - id="org.eclipse.titan.designer.wizards.NewTITANProjectWizard" - name="TITAN Project" - finalPerspective = "org.eclipse.titan.designer.perspectives.EditingPerspective" - preferredPerspectives = "org.eclipse.titan.designer.perspectives.EditingPerspective" + icon="icons/titan.gif" id="org.eclipse.titan.designer.wizards.NewTITANProjectWizard" + name="TITAN Project" finalPerspective="org.eclipse.titan.designer.perspectives.EditingPerspective" + preferredPerspectives="org.eclipse.titan.designer.perspectives.EditingPerspective" project="true" /> <wizard category="org.eclipse.titan.designer.wizards.NewTITANWizard" class="org.eclipse.titan.designer.wizards.NewTTCN3ModuleWizard" - icon="icons/ttcn.gif" - id="org.eclipse.titan.designer.wizards.NewTTCN3ModuleWizard" - name="TTCN3 Module" - preferredPerspectives = "org.eclipse.titan.designer.perspectives.EditingPerspective" + icon="icons/ttcn.gif" id="org.eclipse.titan.designer.wizards.NewTTCN3ModuleWizard" + name="TTCN3 Module" preferredPerspectives="org.eclipse.titan.designer.perspectives.EditingPerspective" project="false" /> <wizard category="org.eclipse.titan.designer.wizards.NewTITANWizard" class="org.eclipse.titan.designer.wizards.NewASN1ModuleWizard" - icon="icons/asn.gif" - id="org.eclipse.titan.designer.wizards.NewASN1ModuleWizard" - name="ASN1 Module" - preferredPerspectives = "org.eclipse.titan.designer.perspectives.EditingPerspective" + icon="icons/asn.gif" id="org.eclipse.titan.designer.wizards.NewASN1ModuleWizard" + name="ASN1 Module" preferredPerspectives="org.eclipse.titan.designer.perspectives.EditingPerspective" project="false" /> - <wizard - category="org.eclipse.titan.designer.wizards.NewTITANWizard" + <wizard category="org.eclipse.titan.designer.wizards.NewTITANWizard" class="org.eclipse.titan.designer.wizards.NewConfigFileWizard" - icon="icons/cfg.gif" - id="org.eclipse.titan.designer.wizards.NewConfigFileWizard" - name="Configuration file" - preferredPerspectives="org.eclipse.titan.designer.perspectives.EditingPerspective" - project="false"/> - <category id="org.eclipse.titan.designer.wizards.NewTITANWizard" name="TITAN" /> + icon="icons/cfg.gif" id="org.eclipse.titan.designer.wizards.NewConfigFileWizard" + name="Configuration file" preferredPerspectives="org.eclipse.titan.designer.perspectives.EditingPerspective" + project="false" /> + <category id="org.eclipse.titan.designer.wizards.NewTITANWizard" + name="TITAN" /> </extension> - <extension - point="org.eclipse.ui.importWizards"> - <category - id="org.eclipse.titan.designer.wizards.TITANImportCategory" + <extension point="org.eclipse.ui.importWizards"> + <category id="org.eclipse.titan.designer.wizards.TITANImportCategory" name="TITAN"> </category> <wizard class="org.eclipse.titan.designer.wizards.TITANProjectImportWizard" - icon="icons/titan.gif" - id="org.eclipse.titan.designer.wizards.TITANProjectImportWizard" - name="Project from .prj file" - category="org.eclipse.titan.designer.wizards.TITANImportCategory"/> + icon="icons/titan.gif" id="org.eclipse.titan.designer.wizards.TITANProjectImportWizard" + name="Project from .prj file" category="org.eclipse.titan.designer.wizards.TITANImportCategory" /> <wizard class="org.eclipse.titan.designer.wizards.projectFormat.NewTITANProjectImportWizard" icon="icons/titan.gif" id="org.eclipse.titan.designer.wizards.NewTITANProjectImportWizard" - name="Project from .tpd file" - category="org.eclipse.titan.designer.wizards.TITANImportCategory"/> + name="Project from .tpd file" category="org.eclipse.titan.designer.wizards.TITANImportCategory" /> </extension> - <extension - point="org.eclipse.ui.exportWizards"> - <category - id="org.eclipse.titan.designer.wizards.TITANExportCategory" + <extension point="org.eclipse.ui.exportWizards"> + <category id="org.eclipse.titan.designer.wizards.TITANExportCategory" name="TITAN"> </category> <wizard class="org.eclipse.titan.designer.wizards.projectFormat.TITANProjectExportWizard" icon="icons/titan.gif" id="org.eclipse.titan.designer.wizards.NewTITANProjectExportWizard" - name="TITAN Project settings" - category="org.eclipse.titan.designer.wizards.TITANExportCategory"> - <description> - Exports TITAN Designer related project information - </description> + name="TITAN Project settings" category="org.eclipse.titan.designer.wizards.TITANExportCategory"> + <description> + Exports TITAN Designer related project information + </description> </wizard> </extension> - <extension - point="org.eclipse.ui.perspectives"> + <extension point="org.eclipse.ui.perspectives"> <perspective class="org.eclipse.titan.designer.perspectives.EditingPerspective" - icon="icons/titan.gif" - id="org.eclipse.titan.designer.perspectives.EditingPerspective" - name="TITAN Editing"/> + icon="icons/titan.gif" id="org.eclipse.titan.designer.perspectives.EditingPerspective" + name="TITAN Editing" /> </extension> <extension point="org.eclipse.help.toc"> - <toc file="toc.xml" primary="false"/> + <toc file="toc.xml" primary="false" /> </extension> - <extension - point="org.eclipse.ui.commands"> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" - description="Jumps to and back the first visible char" - id="org.eclipse.titan.designer.firstChar" - name="Line Start"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" - description="Jumps to and back the last visible char" - id="org.eclipse.titan.designer.lastChar" - name="Line End"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + <extension point="org.eclipse.ui.commands"> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" + description="Jumps to and back the first visible char" id="org.eclipse.titan.designer.firstChar" + name="Line Start" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" + description="Jumps to and back the last visible char" id="org.eclipse.titan.designer.lastChar" + name="Line End" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Opens a declaration" id="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" - name="Open Declaration"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" - description="Finds references to a declaration/assignment" - id="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" - name="Find References"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Open Declaration" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" + description="Finds references to a declaration/assignment" + id="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" + name="Find References" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Rename refactoring" id="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoring" - name="Rename refactoring"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Rename refactoring" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Toggle Comment" id="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" - name="Toggle Comment"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Toggle Comment" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Corrects the indentation" id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Indentation" - name="Correct Indentation"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Correct Indentation" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Go to Matching Bracket" id="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3GotoMatchingBracket" - name="Go to Matching Bracket"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Go to Matching Bracket" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Opens a declaration" id="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" - name="Open Declaration"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" - description="Finds references to a declaration/assignment" - id="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" - name="Find References"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Open Declaration" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" + description="Finds references to a declaration/assignment" + id="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" + name="Find References" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Rename refactoring" id="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoring" - name="Rename refactoring"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Rename refactoring" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Corrects the indentation" id="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPIndentation" - name="Correct Indentation"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Correct Indentation" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Go to Matching Bracket" id="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPGotoMatchingBracket" - name="Go to Matching Bracket"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Go to Matching Bracket" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Toggle Comment" id="org.eclipse.titan.designer.editors.ttcnppeditor.ToggleComment" - name="Toggle Comment"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Toggle Comment" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Opens a declaration" id="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" - name="Open Declaration"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Open Declaration" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Finds references to a declaration/assignment" id="org.eclipse.titan.designer.editors.asn1editor.FindReferences" - name="Find References"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Find References" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Rename refactoring" id="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoring" - name="Rename refactoring"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Rename refactoring" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Corrects the indentation" id="org.eclipse.titan.designer.editors.asn1editor.ASN1Indentation" - name="Correct Indentation"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Correct Indentation" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Go to Matching Bracket" id="org.eclipse.titan.designer.editors.asn1editor.ASN1GotoMatchingBracket" - name="Go to Matching Bracket"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Go to Matching Bracket" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Opens a declaration" id="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" - name="Open Declaration"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Open Declaration" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Corrects the indentation" id="org.eclipse.titan.designer.editors.configeditor.ConfigIndentation" - name="Correct Indentation"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Correct Indentation" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Go to Matching Bracket" id="org.eclipse.titan.designer.editors.configeditor.ConfigGotoMatchingBracket" - name="Go to Matching Bracket"/> - <command - categoryId="org.eclipse.titan.designer.editors.TITANCommands" + name="Go to Matching Bracket" /> + <command categoryId="org.eclipse.titan.designer.editors.TITANCommands" description="Toggle Comment" id="org.eclipse.titan.designer.editors.configeditor.ToggleComment" - name="Toggle Comment"/> - <category - id="org.eclipse.titan.designer.editors.TITANCommands" - name="TITAN Commands"/> + name="Toggle Comment" /> + <category id="org.eclipse.titan.designer.editors.TITANCommands" + name="TITAN Commands" /> </extension> - <extension - point="org.eclipse.ui.bindings"> - <key - commandId="org.eclipse.titan.designer.firstChar" + <extension point="org.eclipse.ui.bindings"> + <key commandId="org.eclipse.titan.designer.firstChar" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="HOME"/> - <key - commandId="org.eclipse.titan.designer.lastChar" + sequence="HOME" /> + <key commandId="org.eclipse.titan.designer.lastChar" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="END"/> + sequence="END" /> <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.OpenDeclaration" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F3"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" + sequence="F3" /> + <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.FindReferences" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F4"/> + sequence="F4" /> <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.RenameRefactoringAction" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+F4"/> + sequence="CTRL+F4" /> <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3IndentAction" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+I"/> + sequence="CTRL+I" /> <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.TTCN3GotoMatchingBracketAction" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+P"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" + sequence="CTRL+SHIFT+P" /> + <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+/"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" + sequence="CTRL+/" /> + <key commandId="org.eclipse.titan.designer.editors.ttcn3editor.ToggleComment" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+Numpad_divide"/> - <key - commandId="org.eclipse.titan.designer.firstChar" + sequence="CTRL+Numpad_divide" /> + <key commandId="org.eclipse.titan.designer.firstChar" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="HOME"> </key> - <key - commandId="org.eclipse.titan.designer.lastChar" + <key commandId="org.eclipse.titan.designer.lastChar" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="END"> @@ -1244,45 +1065,40 @@ commandId="org.eclipse.titan.designer.editors.ttcnppeditor.OpenDeclaration" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F3"/> + sequence="F3" /> <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.FindReferences" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F4"/> + sequence="F4" /> <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.RenameRefactoring" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+F4"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" + sequence="CTRL+F4" /> + <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.IndentAction" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+I"/> - <key + sequence="CTRL+I" /> + <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPGotoMatchingBracket" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+P"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcnppeditor.ToggleComment" + sequence="CTRL+SHIFT+P" /> + <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.ToggleComment" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+/"/> - <key - commandId="org.eclipse.titan.designer.editors.ttcnppeditor.ToggleComment" + sequence="CTRL+/" /> + <key commandId="org.eclipse.titan.designer.editors.ttcnppeditor.ToggleComment" contextId="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+Numpad_divide"/> - <key - commandId="org.eclipse.titan.designer.firstChar" + sequence="CTRL+Numpad_divide" /> + <key commandId="org.eclipse.titan.designer.firstChar" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="HOME"> </key> - <key - commandId="org.eclipse.titan.designer.lastChar" + <key commandId="org.eclipse.titan.designer.lastChar" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="END"> @@ -1291,222 +1107,195 @@ commandId="org.eclipse.titan.designer.editors.configeditor.OpenDeclaration" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F3"/> - <key - commandId="org.eclipse.titan.designer.editors.configeditor.IndentAction" + sequence="F3" /> + <key commandId="org.eclipse.titan.designer.editors.configeditor.IndentAction" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+I"/> - <key + sequence="CTRL+I" /> + <key commandId="org.eclipse.titan.designer.editors.configeditor.ConfigGotoMatchingBracket" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+P"/> - <key - commandId="org.eclipse.titan.designer.editors.configeditor.ToggleComment" + sequence="CTRL+SHIFT+P" /> + <key commandId="org.eclipse.titan.designer.editors.configeditor.ToggleComment" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+/"/> - <key - commandId="org.eclipse.titan.designer.editors.configeditor.ToggleComment" + sequence="CTRL+/" /> + <key commandId="org.eclipse.titan.designer.editors.configeditor.ToggleComment" contextId="org.eclipse.titan.designer.editors.ConfigEditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+Numpad_divide"/> - <key - commandId="org.eclipse.titan.designer.firstChar" + sequence="CTRL+Numpad_divide" /> + <key commandId="org.eclipse.titan.designer.firstChar" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="HOME"> </key> - <key - commandId="org.eclipse.titan.designer.lastChar" + <key commandId="org.eclipse.titan.designer.lastChar" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="END"> </key> - <key - commandId="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" + <key commandId="org.eclipse.titan.designer.editors.asn1editor.OpenDeclaration" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F3"/> - <key - commandId="org.eclipse.titan.designer.editors.asn1editor.FindReferences" + sequence="F3" /> + <key commandId="org.eclipse.titan.designer.editors.asn1editor.FindReferences" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="F4"/> + sequence="F4" /> <key commandId="org.eclipse.titan.designer.editors.asn1editor.RenameRefactoring" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+F4"/> - <key - commandId="org.eclipse.titan.designer.editors.asn1editor.IndentAction" + sequence="CTRL+F4" /> + <key commandId="org.eclipse.titan.designer.editors.asn1editor.IndentAction" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+I"/> - <key + sequence="CTRL+I" /> + <key commandId="org.eclipse.titan.designer.editors.asn1editor.ASN1GotoMatchingBracket" contextId="org.eclipse.titan.designer.editors.ASN1EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+P"/> - <key - commandId="org.eclipse.titan.designer.actions.FindDefinitionAction" + sequence="CTRL+SHIFT+P" /> + <key commandId="org.eclipse.titan.designer.actions.FindDefinitionAction" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+T"/> + sequence="CTRL+SHIFT+T" /> </extension> - <extension - point="org.eclipse.ui.contexts"> - <context - description="%context.editingText.description.testtest" - id="org.eclipse.titan.designer.editors.TTCN3EditorScope" - name="Editing TTCN-3 Source" - parentId="org.eclipse.ui.textEditorScope"/> - <context - description="%context.editingText.description.testtest" - id="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" - name="Editing TTCNPP Source" + <extension point="org.eclipse.ui.contexts"> + <context description="%context.editingText.description.testtest" + id="org.eclipse.titan.designer.editors.TTCN3EditorScope" name="Editing TTCN-3 Source" + parentId="org.eclipse.ui.textEditorScope" /> + <context description="%context.editingText.description.testtest" + id="org.eclipse.titan.designer.editors.TTCN3PPEditorScope" name="Editing TTCNPP Source" parentId="org.eclipse.ui.textEditorScope"> </context> - <context - description="%context.editingText.description.testtest" - id="org.eclipse.titan.designer.editors.ConfigEditorScope" - name="TITAN Config File" + <context description="%context.editingText.description.testtest" + id="org.eclipse.titan.designer.editors.ConfigEditorScope" name="TITAN Config File" parentId="org.eclipse.ui.textEditorScope"> </context> - <context - description="%context.editingText.description.testtest" - id="org.eclipse.titan.designer.editors.ASN1EditorScope" - name="Editing ASN.1 Source" + <context description="%context.editingText.description.testtest" + id="org.eclipse.titan.designer.editors.ASN1EditorScope" name="Editing ASN.1 Source" parentId="org.eclipse.ui.textEditorScope"> </context> </extension> - <extension - point="org.eclipse.ui.navigator.navigatorContent"> - <commonWizard type = "new" wizardId="org.eclipse.titan.designer.wizards.NewTITANProjectWizard" menuGroupId ="TITAN extension"> - <enablement> - <or> - <adapt type="org.eclipse.core.resources.IProject"/> - <adapt type="org.eclipse.core.resources.IWorkspaceRoot"/> - </or> - </enablement> - </commonWizard> - <commonWizard type = "new" wizardId="org.eclipse.titan.designer.wizards.NewTTCN3ModuleWizard" menuGroupId ="TITAN extension"> - <enablement> - <and> - <or> - <adapt type="org.eclipse.core.resources.IFolder"/> - <adapt type="org.eclipse.core.resources.IProject"/> - <adapt type="org.eclipse.core.resources.IWorkspaceRoot"/> - </or> - <test property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature" /> - </and> - </enablement> - </commonWizard> - <commonWizard type = "new" wizardId="org.eclipse.titan.designer.wizards.NewASN1ModuleWizard" menuGroupId ="TITAN extension"> - <enablement> - <and> - <or> - <adapt type="org.eclipse.core.resources.IFolder"/> - <adapt type="org.eclipse.core.resources.IProject"/> - <adapt type="org.eclipse.core.resources.IWorkspaceRoot"/> - </or> - <test property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature" /> - </and> - </enablement> - </commonWizard> - <commonWizard type = "new" wizardId="org.eclipse.titan.designer.wizards.NewConfigFileWizard" menuGroupId ="TITAN extension"> - <enablement> - <and> - <or> - <adapt type="org.eclipse.core.resources.IFolder"/> - <adapt type="org.eclipse.core.resources.IProject"/> - <adapt type="org.eclipse.core.resources.IWorkspaceRoot"/> - </or> - <test property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature" /> - </and> - </enablement> - </commonWizard> + <extension point="org.eclipse.ui.navigator.navigatorContent"> + <commonWizard type="new" + wizardId="org.eclipse.titan.designer.wizards.NewTITANProjectWizard" + menuGroupId="TITAN extension"> + <enablement> + <or> + <adapt type="org.eclipse.core.resources.IProject" /> + <adapt type="org.eclipse.core.resources.IWorkspaceRoot" /> + </or> + </enablement> + </commonWizard> + <commonWizard type="new" + wizardId="org.eclipse.titan.designer.wizards.NewTTCN3ModuleWizard" + menuGroupId="TITAN extension"> + <enablement> + <and> + <or> + <adapt type="org.eclipse.core.resources.IFolder" /> + <adapt type="org.eclipse.core.resources.IProject" /> + <adapt type="org.eclipse.core.resources.IWorkspaceRoot" /> + </or> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + </and> + </enablement> + </commonWizard> + <commonWizard type="new" + wizardId="org.eclipse.titan.designer.wizards.NewASN1ModuleWizard" + menuGroupId="TITAN extension"> + <enablement> + <and> + <or> + <adapt type="org.eclipse.core.resources.IFolder" /> + <adapt type="org.eclipse.core.resources.IProject" /> + <adapt type="org.eclipse.core.resources.IWorkspaceRoot" /> + </or> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + </and> + </enablement> + </commonWizard> + <commonWizard type="new" + wizardId="org.eclipse.titan.designer.wizards.NewConfigFileWizard" + menuGroupId="TITAN extension"> + <enablement> + <and> + <or> + <adapt type="org.eclipse.core.resources.IFolder" /> + <adapt type="org.eclipse.core.resources.IProject" /> + <adapt type="org.eclipse.core.resources.IWorkspaceRoot" /> + </or> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + </and> + </enablement> + </commonWizard> </extension> - <extension - point="org.eclipse.ui.navigator.navigatorContent"> - <commonFilter - activeByDefault="true" - class="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter" - description="Hides the working directories of projects that have the TITAN nature too." - id="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter" - name="TITAN working directory"> - </commonFilter> - <commonFilter - activeByDefault="false" - class="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter" - description="Hides the excluded resources of projects that have the TITAN nature too." - id="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter" - name="TITAN excluded resources"> - </commonFilter> + <extension point="org.eclipse.ui.navigator.navigatorContent"> + <commonFilter activeByDefault="true" + class="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter" + description="Hides the working directories of projects that have the TITAN nature too." + id="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter" + name="TITAN working directory"> + </commonFilter> + <commonFilter activeByDefault="false" + class="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter" + description="Hides the excluded resources of projects that have the TITAN nature too." + id="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter" + name="TITAN excluded resources"> + </commonFilter> </extension> - <extension - point="org.eclipse.ui.navigator.viewer"> - <viewerContentBinding - viewerId="org.eclipse.ui.navigator.ProjectExplorer"> - <includes> - <contentExtension - pattern="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter"> - </contentExtension> - <contentExtension - pattern="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter"> - </contentExtension> - </includes> - </viewerContentBinding> + <extension point="org.eclipse.ui.navigator.viewer"> + <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> + <includes> + <contentExtension + pattern="org.eclipse.titan.designer.commonFilters.WorkingDirectoryFilter"> + </contentExtension> + <contentExtension + pattern="org.eclipse.titan.designer.commonFilters.ExcludedResourceFilter"> + </contentExtension> + </includes> + </viewerContentBinding> </extension> - <extension - id="org.eclipse.titan.designer.application.InvokeBuild" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titan.designer.application.InvokeBuild"> - </run> - </application> - </extension> - <extension - id="org.eclipse.titan.designer.application.LoadFromTpd" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titan.designer.application.LoadFromTpd"> - </run> - </application> + <extension id="org.eclipse.titan.designer.application.InvokeBuild" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titan.designer.application.InvokeBuild"> + </run> + </application> + </extension> + <extension id="org.eclipse.titan.designer.application.LoadFromTpd" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titan.designer.application.LoadFromTpd"> + </run> + </application> </extension> <extension - id="org.eclipse.titan.designer.editors.ttcn3editor.referenceSearch.ReferenceSearchResultView" - point="org.eclipse.search.searchResultViewPages"> - <viewPage - id="org.eclipse.titan.designer.editors.ttcn3editor.referenceSearch.ReferenceSearchResultView" - searchResultClass="org.eclipse.titan.designer.editors.referenceSearch.ReferenceSearchResult" - class="org.eclipse.titan.designer.editors.referenceSearch.ReferenceSearchResultView"> - </viewPage> - </extension> + id="org.eclipse.titan.designer.editors.ttcn3editor.referenceSearch.ReferenceSearchResultView" + point="org.eclipse.search.searchResultViewPages"> + <viewPage + id="org.eclipse.titan.designer.editors.ttcn3editor.referenceSearch.ReferenceSearchResultView" + searchResultClass="org.eclipse.titan.designer.editors.referenceSearch.ReferenceSearchResult" + class="org.eclipse.titan.designer.editors.referenceSearch.ReferenceSearchResultView"> + </viewPage> + </extension> <extension point="org.eclipse.ui.activities"> - <activity id="org.eclipse.titan.designer.activities.debug" - description="Makes the debug preference page visible" - name="Titan debug activity" /> - <activityPatternBinding - activityId="org.eclipse.titan.designer.activities.debug" - isEqualityPattern="true" - pattern="org.eclipse.titan.designer/org.eclipse.titan.designer.preferences.pages.DebugPreferencePage" /> - </extension> - <extension-point - id="org.eclipse.titan.designer.extensions.post_analyze" - name="Post-analyze" - schema="schema/post_analyze.exsd"/> + <activity id="org.eclipse.titan.designer.activities.debug" + description="Makes the debug preference page visible" name="Titan debug activity" /> + <activityPatternBinding + activityId="org.eclipse.titan.designer.activities.debug" + isEqualityPattern="true" + pattern="org.eclipse.titan.designer/org.eclipse.titan.designer.preferences.pages.DebugPreferencePage" /> + </extension> + <extension-point id="org.eclipse.titan.designer.extensions.post_analyze" + name="Post-analyze" schema="schema/post_analyze.exsd" /> </plugin> diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignment.java index 7327fad9a8..e1891a2f25 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignment.java @@ -15,6 +15,7 @@ import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.titan.designer.Activator; +import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.Identifier; @@ -39,7 +40,7 @@ public abstract class ASN1Assignment extends Assignment { private static boolean markOccurrences; - protected final Ass_pard ass_pard; + protected final Ass_pard assPard; static { final IPreferencesService prefService = Platform.getPreferencesService(); @@ -61,14 +62,14 @@ public abstract class ASN1Assignment extends Assignment { } } - protected ASN1Assignment(final Identifier id, final Ass_pard ass_pard) { + protected ASN1Assignment(final Identifier id, final Ass_pard assPard) { super(id); - this.ass_pard = ass_pard; + this.assPard = assPard; } /** @return the parameterizes assignment related to the assignment */ public final Ass_pard getAssPard() { - return ass_pard; + return assPard; } /** @@ -101,7 +102,7 @@ public abstract class ASN1Assignment extends Assignment { * @return the assignment created. * */ public final ASN1Assignment newInstance(final Module module) { - if (null == ass_pard) { + if (null == assPard) { if (null != location) { location.reportSemanticError(MessageFormat.format(NOTPARAMETERIZEDASSIGNMENT, getFullName())); } @@ -110,7 +111,7 @@ public abstract class ASN1Assignment extends Assignment { } String newName = getIdentifier().getAsnName() + "." + module.getIdentifier().getAsnName() + ".inst"; - newName += ass_pard.newInstanceNumber(module); + newName += assPard.newInstanceNumber(module); return internalNewInstance(new Identifier(Identifier_type.ID_ASN, newName)); } @@ -133,8 +134,8 @@ public abstract class ASN1Assignment extends Assignment { @Override public void check(final CompilationTimeStamp timestamp) { - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); lastTimeChecked = timestamp; } } @@ -144,7 +145,7 @@ public abstract class ASN1Assignment extends Assignment { * * @param timestamp * the timestamp of the actual semantic check cycle. - * @param assignment_type + * @param assignmentType * the type to check against. * @param referenceChain * the reference chain to detect circular references @@ -152,9 +153,9 @@ public abstract class ASN1Assignment extends Assignment { * @return true if the assignment is of the specified type, false * otherwise * */ - public boolean isAssignmentType(final CompilationTimeStamp timestamp, final Assignment_type assignment_type, + public boolean isAssignmentType(final CompilationTimeStamp timestamp, final Assignment_type assignmentType, final IReferenceChain referenceChain) { - return getAssignmentType().equals(assignment_type); + return getAssignmentType().equals(assignmentType); } // TODO: remove when location is fixed @@ -164,15 +165,27 @@ public abstract class ASN1Assignment extends Assignment { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (ass_pard == null) { + if (assPard == null) { return; } - ass_pard.findReferences(referenceFinder, foundIdentifiers); + assPard.findReferences(referenceFinder, foundIdentifiers); } @Override public boolean shouldMarkOccurrences() { return markOccurrences; } + + @Override + protected boolean memberAccept(ASTVisitor v) { + if (identifier != null && !identifier.accept(v)) { + return false; + } + if (assPard != null && !assPard.accept(v)) { + return false; + } + + return true; + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignments.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignments.java index 4c6ed684f1..06fca47a2e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignments.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ASN1Assignments.java @@ -64,9 +64,9 @@ public final class ASN1Assignments extends Assignments implements ILocateableNod * @param right_scope * the scope to be set. * */ - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { for (ASN1Assignment assignment : assignments) { - assignment.setRightScope(right_scope); + assignment.setRightScope(rightScope); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/InformationFromObj.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/InformationFromObj.java index e064659af4..25a133f30e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/InformationFromObj.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/InformationFromObj.java @@ -168,12 +168,12 @@ public final class InformationFromObj extends Reference { return new Error_Setting(); } - final int nof_fields = fieldName.getNofFields(); + final int nofFields = fieldName.getNofFields(); /* the middle part */ Identifier currentFieldName; FieldSpecification currentFieldSpecification; - for (int i = 0; i < nof_fields - 1; i++) { + for (int i = 0; i < nofFields - 1; i++) { currentFieldName = fieldName.getFieldByIndex(i); currentFieldSpecification = objectClass.getFieldSpecifications().getFieldSpecificationByIdentifier(currentFieldName) .getLast(); @@ -313,7 +313,7 @@ public final class InformationFromObj extends Reference { } /* and the last part... */ - currentFieldName = fieldName.getFieldByIndex(nof_fields - 1); + currentFieldName = fieldName.getFieldByIndex(nofFields - 1); currentFieldSpecification = objectClass.getFieldSpecifications().getFieldSpecificationByIdentifier(currentFieldName).getLast(); temporalSetting = null; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Builder.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Builder.java index a9291d6e40..bd5b6f1c89 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Builder.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Builder.java @@ -10,6 +10,7 @@ package org.eclipse.titan.designer.AST.ASN1.Object; import java.util.ArrayList; import java.util.List; +import org.antlr.v4.runtime.CommonToken; import org.antlr.v4.runtime.Token; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -45,12 +46,12 @@ public final class ObjectClassSyntax_Builder extends ObjectClassSyntax_Visitor { token = aBlock.getTokenList().get(i); if (token.getType() == Asn1Lexer.LEFTVERSIONBRACKETS) { - org.antlr.v4.runtime.CommonToken token2 = ((TokenWithIndexAndSubTokens) token).copy(); + CommonToken token2 = ((TokenWithIndexAndSubTokens) token).copy(); token2.setType(Asn1Lexer.SQUAREOPEN); internalTokens.add(token2); internalTokens.add(token2); } else if (token.getType() == Asn1Lexer.RIGHTVERSIONBRACKETS) { - org.antlr.v4.runtime.CommonToken token2 = ((TokenWithIndexAndSubTokens) token).copy(); + CommonToken token2 = ((TokenWithIndexAndSubTokens) token).copy(); token2.setType(Asn1Lexer.SQUARECLOSE); internalTokens.add(token2); internalTokens.add(token2); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Node.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Node.java index 0af22f15ea..efa2b28d46 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Node.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Node.java @@ -46,8 +46,8 @@ public abstract class ObjectClassSyntax_Node implements ILocateableNode { return isBuilded; } - public final void setIsBuilded(final boolean is_builded) { - this.isBuilded = is_builded; + public final void setIsBuilded(final boolean isBuilded) { + this.isBuilded = isBuilded; } public abstract String getDisplayName(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Parser.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Parser.java index 5eb1a83b72..8f7182290b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Parser.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/ObjectClassSyntax_Parser.java @@ -11,6 +11,7 @@ package org.eclipse.titan.designer.AST.ASN1.Object; import java.util.ArrayList; import java.util.List; +import org.antlr.v4.runtime.Token; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.titan.common.parsers.SyntacticErrorStorage; @@ -48,12 +49,12 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { public ObjectClassSyntax_Parser(final Block aBlock, final Object_Definition myObject) { this.myObject = myObject; - final List<org.antlr.v4.runtime.Token> tempTokens = aBlock.getTokenList(); - final List<org.antlr.v4.runtime.Token> temp = new ArrayList<org.antlr.v4.runtime.Token>(tempTokens.size()); + final List<Token> tempTokens = aBlock.getTokenList(); + final List<Token> temp = new ArrayList<Token>(tempTokens.size()); for (int i = 0; i < tempTokens.size(); i++) { temp.add(tempTokens.get(i)); } - temp.add(new TokenWithIndexAndSubTokens(org.antlr.v4.runtime.Token.EOF)); + temp.add(new TokenWithIndexAndSubTokens(Token.EOF)); this.mBlock = new Block(temp, aBlock.getLocation()); this.mBlock.setFullNameParent(aBlock); @@ -69,14 +70,14 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { final ASN1Type type = parseType(); if (null != type) { fieldSetting = new FieldSetting_Type(parameter.getIdentifier().newInstance(), type); - fieldSetting.setLocation(type.getLocation()); + fieldSetting.setLocation(mBlock.getLocation()); } break; case S_V: final boolean parseSuccess = parseValue(); if (parseSuccess) { fieldSetting = new FieldSetting_Value(parameter.getIdentifier().newInstance()); - fieldSetting.setLocation(parameter.getIdentifier().getLocation()); + fieldSetting.setLocation(mBlock.getLocation()); } break; case S_VS: @@ -86,14 +87,14 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { final ASN1Object object = parseObject(); if (null != object) { fieldSetting = new FieldSetting_Object(parameter.getIdentifier().newInstance(), object); - fieldSetting.setLocation(object.getLocation()); + fieldSetting.setLocation(mBlock.getLocation()); } break; case S_OS: final ObjectSet objectSet = parseObjectSet(); if (null != objectSet) { fieldSetting = new FieldSetting_ObjectSet(parameter.getIdentifier().newInstance(), objectSet); - fieldSetting.setLocation(objectSet.getLocation()); + fieldSetting.setLocation(mBlock.getLocation()); } break; case S_UNDEF: @@ -118,9 +119,9 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { previousSuccess = false; parameter.getSequence().accept(this); if (null != mBlock) { - if (success && internalIndex < mBlock.getTokenList().size() && mBlock.getTokenList().get(internalIndex).getType() != org.antlr.v4.runtime.Token.EOF) { + if (success && internalIndex < mBlock.getTokenList().size() && mBlock.getTokenList().get(internalIndex).getType() != Token.EOF) { success = false; - final org.antlr.v4.runtime.Token token = mBlock.getTokenList().get(internalIndex); + final Token token = mBlock.getTokenList().get(internalIndex); myObject.getLocation().reportSemanticError("Unexpected `" + token.getText() + "', it is a superfluous part"); } } @@ -141,7 +142,7 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { } if (null != mBlock) { - final org.antlr.v4.runtime.Token token = mBlock.getTokenList().get(internalIndex); + final Token token = mBlock.getTokenList().get(internalIndex); if (null == token.getText()) { // reached the end of the block return; @@ -167,7 +168,7 @@ public final class ObjectClassSyntax_Parser extends ObjectClassSyntax_Visitor { int i; if (null != mBlock) { - org.antlr.v4.runtime.Token token = mBlock.getTokenList().get(internalIndex); + Token token = mBlock.getTokenList().get(internalIndex); if (parameter.getOptionalFirstComma() && myObject.getNofFieldSettings() > 0) { if (token.getType() == Asn1Lexer.COMMA) { if (internalIndex < mBlock.getTokenList().size() - 1) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/Object_Definition.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/Object_Definition.java index 52e5a8812c..f62035adb8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/Object_Definition.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object/Object_Definition.java @@ -124,7 +124,6 @@ public final class Object_Definition extends ASN1Object { } } - fieldSettings.clear(); fieldSettings.trimToSize(); if (null != myGovernor) { @@ -295,6 +294,8 @@ public final class Object_Definition extends ASN1Object { ObjectClassSyntax_Parser parser = null; parser = new ObjectClassSyntax_Parser(mBlock, this); final ObjectClassSyntax_root root = myGovernor.getObjectClassSyntax(timestamp); + fieldSettings.clear(); + if (null != root) { root.accept(parser); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectClass_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectClass_Assignment.java index 33ca95e6a3..1ca37d22ff 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectClass_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectClass_Assignment.java @@ -33,8 +33,8 @@ public final class ObjectClass_Assignment extends ASN1Assignment { /** right. */ private final ObjectClass objectClass; - public ObjectClass_Assignment(final Identifier id, final Ass_pard ass_pard, final ObjectClass objectClass) { - super(id, ass_pard); + public ObjectClass_Assignment(final Identifier id, final Ass_pard assPard, final ObjectClass objectClass) { + super(id, assPard); this.objectClass = objectClass; if (null != objectClass) { @@ -53,9 +53,9 @@ public final class ObjectClass_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { if (null != objectClass) { - objectClass.setMyScope(right_scope); + objectClass.setMyScope(rightScope); } } @@ -76,7 +76,7 @@ public final class ObjectClass_Assignment extends ASN1Assignment { * @return the ObjectClass of this ObjectClass assignment */ public ObjectClass getObjectClass(final CompilationTimeStamp timestamp) { - if (null != ass_pard) { + if (null != assPard) { location.reportSemanticError(MessageFormat.format(PARAMETERISEDOBJECTCLASS, getFullName())); return null; } @@ -99,8 +99,8 @@ public final class ObjectClass_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); // lastTimeChecked = timestamp; return; } @@ -156,10 +156,7 @@ public final class ObjectClass_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (objectClass != null && !objectClass.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectSet_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectSet_Assignment.java index 9fbea2cd82..3521d573a8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectSet_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ObjectSet_Assignment.java @@ -35,8 +35,8 @@ public final class ObjectSet_Assignment extends ASN1Assignment { /** right. */ private final ObjectSet objectSet; - public ObjectSet_Assignment(final Identifier id, final Ass_pard ass_pard, final ObjectClass objectClass, final ObjectSet objectSet) { - super(id, ass_pard); + public ObjectSet_Assignment(final Identifier id, final Ass_pard assPard, final ObjectClass objectClass, final ObjectSet objectSet) { + super(id, assPard); this.objectClass = objectClass; this.objectSet = objectSet; @@ -59,9 +59,9 @@ public final class ObjectSet_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { if (null != objectSet) { - objectSet.setMyScope(right_scope); + objectSet.setMyScope(rightScope); } } @@ -85,7 +85,7 @@ public final class ObjectSet_Assignment extends ASN1Assignment { * @return the object set of this object set assignment, * */ public ObjectSet getObjectSet(final CompilationTimeStamp timestamp) { - if (null != ass_pard) { + if (null != assPard) { location.reportSemanticError(MessageFormat.format(PARAMETERISEDOBJECTSET, getFullName())); return null; } @@ -108,8 +108,8 @@ public final class ObjectSet_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); // lastTimeChecked = timestamp;; return; } @@ -172,10 +172,7 @@ public final class ObjectSet_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (objectClass != null && !objectClass.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object_Assignment.java index be5ce16d90..a6bdba8c31 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Object_Assignment.java @@ -35,8 +35,8 @@ public final class Object_Assignment extends ASN1Assignment { private final ObjectClass objectClass; private final ASN1Object object; - public Object_Assignment(final Identifier id, final Ass_pard ass_pard, final ObjectClass objectClass, final ASN1Object object) { - super(id, ass_pard); + public Object_Assignment(final Identifier id, final Ass_pard assPard, final ObjectClass objectClass, final ASN1Object object) { + super(id, assPard); this.objectClass = objectClass; this.object = object; @@ -59,9 +59,9 @@ public final class Object_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { if (null != object) { - object.setMyScope(right_scope); + object.setMyScope(rightScope); } } @@ -84,7 +84,7 @@ public final class Object_Assignment extends ASN1Assignment { * @return the object if this object assignment. * */ public ASN1Object getObject(final CompilationTimeStamp timestamp) { - if (null != ass_pard) { + if (null != assPard) { location.reportSemanticError(MessageFormat.format(PARAMETERISEDOBJECT, getFullName())); return null; } @@ -107,8 +107,8 @@ public final class Object_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); // lastTimeChecked = timestamp; return; } @@ -170,10 +170,7 @@ public final class Object_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (objectClass != null && !objectClass.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Type_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Type_Assignment.java index 8b0e3bd647..bcfd5efe77 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Type_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Type_Assignment.java @@ -7,7 +7,6 @@ ******************************************************************************/ package org.eclipse.titan.designer.AST.ASN1; -import java.text.MessageFormat; import java.util.List; import org.eclipse.titan.designer.AST.ASTVisitor; @@ -38,8 +37,8 @@ public final class Type_Assignment extends ASN1Assignment { /** right. */ private final IASN1Type type; - public Type_Assignment(final Identifier id, final Ass_pard ass_pard, final IASN1Type type) { - super(id, ass_pard); + public Type_Assignment(final Identifier id, final Ass_pard assPard, final IASN1Type type) { + super(id, assPard); this.type = type; if (null != type) { @@ -58,9 +57,9 @@ public final class Type_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { if (null != type) { - type.setMyScope(right_scope); + type.setMyScope(rightScope); } } @@ -74,7 +73,7 @@ public final class Type_Assignment extends ASN1Assignment { @Override public IASN1Type getType(final CompilationTimeStamp timestamp) { - if (null != ass_pard) { + if (null != assPard) { //FIXME: This is commented out because Mark Occurences gives a faulty error marker //It has more types... //location.reportSemanticError(MessageFormat.format(PARAMETERISEDTYPE, getFullName())); @@ -99,8 +98,8 @@ public final class Type_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); return; } @@ -191,10 +190,7 @@ public final class Type_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (type != null && !type.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment.java index c21ce167d2..d0e4f64171 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment.java @@ -37,8 +37,8 @@ public abstract class Undefined_Assignment extends ASN1Assignment { /** the classified assignment. */ protected ASN1Assignment realAssignment; - public Undefined_Assignment(final Identifier id, final Ass_pard ass_pard) { - super(id, ass_pard); + public Undefined_Assignment(final Identifier id, final Ass_pard assPard) { + super(id, assPard); } @Override @@ -66,11 +66,11 @@ public abstract class Undefined_Assignment extends ASN1Assignment { } @Override - public final void setRightScope(final Scope right_scope) { + public final void setRightScope(final Scope rightScope) { if (null != realAssignment) { - realAssignment.setRightScope(right_scope); + realAssignment.setRightScope(rightScope); } - this.rightScope = right_scope; + this.rightScope = rightScope; } @Override @@ -122,8 +122,8 @@ public abstract class Undefined_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); return; } @@ -134,7 +134,7 @@ public abstract class Undefined_Assignment extends ASN1Assignment { } @Override - public final boolean isAssignmentType(final CompilationTimeStamp timestamp, final Assignment_type assignment_type, + public final boolean isAssignmentType(final CompilationTimeStamp timestamp, final Assignment_type assignmentType, final IReferenceChain referenceChain) { check(timestamp); @@ -142,7 +142,7 @@ public abstract class Undefined_Assignment extends ASN1Assignment { return false; } - return getIsErroneous() ? false : realAssignment.isAssignmentType(timestamp, assignment_type, referenceChain); + return getIsErroneous() ? false : realAssignment.isAssignmentType(timestamp, assignmentType, referenceChain); } /** @@ -207,10 +207,7 @@ public abstract class Undefined_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (realAssignment != null && !realAssignment.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_OS_or_VS.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_OS_or_VS.java index 7f3f33db2d..99dd91c8e1 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_OS_or_VS.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_OS_or_VS.java @@ -7,6 +7,7 @@ ******************************************************************************/ package org.eclipse.titan.designer.AST.ASN1; +import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Reference; @@ -31,8 +32,8 @@ public final class Undefined_Assignment_OS_or_VS extends Undefined_Assignment { protected final Reference reference; private final Block mBlock; - public Undefined_Assignment_OS_or_VS(final Identifier id, final Ass_pard ass_pard, final Reference reference, final Block aBlock) { - super(id, ass_pard); + public Undefined_Assignment_OS_or_VS(final Identifier id, final Ass_pard assPard, final Reference reference, final Block aBlock) { + super(id, assPard); this.reference = reference; this.mBlock = aBlock; @@ -58,9 +59,9 @@ public final class Undefined_Assignment_OS_or_VS extends Undefined_Assignment { @Override protected void classifyAssignment(final CompilationTimeStamp timestamp, final IReferenceChain referenceChain) { - final boolean new_chain = null == referenceChain; + final boolean newChain = null == referenceChain; IReferenceChain temporalReferenceChain; - if (new_chain) { + if (newChain) { temporalReferenceChain = ReferenceChain.getInstance(CIRCULARASSIGNMENTCHAIN, true); } else { temporalReferenceChain = referenceChain; @@ -75,9 +76,9 @@ public final class Undefined_Assignment_OS_or_VS extends Undefined_Assignment { if (!reference.refersToSettingType(timestamp, Setting_type.S_ERROR, temporalReferenceChain)) { if (identifier.isvalidAsnObjectSetReference() && reference.refersToSettingType(timestamp, Setting_type.S_OC, temporalReferenceChain)) { - realAssignment = new ObjectSet_Assignment(identifier, ass_pard, new ObjectClass_refd(reference), + realAssignment = new ObjectSet_Assignment(identifier, assPard, new ObjectClass_refd(reference), newObjectSetDefinitionInstance()); - // ass_pard = null; + // assPard = null; // left = null; // right = null; // asstype = A_OS; @@ -104,7 +105,7 @@ public final class Undefined_Assignment_OS_or_VS extends Undefined_Assignment { realAssignment.setFullNameParent(this); } - if (new_chain) { + if (newChain) { temporalReferenceChain.release(); } else { temporalReferenceChain.previousState(); @@ -116,6 +117,17 @@ public final class Undefined_Assignment_OS_or_VS extends Undefined_Assignment { } private ValueSet_Assignment newValueSetAssignmentInstance( final Referenced_Type aType ) { - return new ValueSet_Assignment(identifier, ass_pard, aType, mBlock); + return new ValueSet_Assignment(identifier, assPard, aType, mBlock); + } + + @Override + protected boolean memberAccept(ASTVisitor v) { + if (!super.memberAccept(v)) { + return false; + } + if (reference != null && !reference.accept(v)) { + return false; + } + return true; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_O_or_V.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_O_or_V.java index 3b2f20d903..a6eb3897f9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_O_or_V.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_O_or_V.java @@ -7,6 +7,7 @@ ******************************************************************************/ package org.eclipse.titan.designer.AST.ASN1; +import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Reference; @@ -35,8 +36,8 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { private final Block mBlock; private final Reference objectReference; - public Undefined_Assignment_O_or_V(final Identifier id, final Ass_pard ass_pard, final Reference reference, final Block aBlock) { - super(id, ass_pard); + public Undefined_Assignment_O_or_V(final Identifier id, final Ass_pard assPard, final Reference reference, final Block aBlock) { + super(id, assPard); this.reference = reference; this.mBlock = aBlock; objectReference = null; @@ -49,8 +50,8 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { } } - public Undefined_Assignment_O_or_V(final Identifier id, final Ass_pard ass_pard, final Reference reference, final Reference reference2) { - super(id, ass_pard); + public Undefined_Assignment_O_or_V(final Identifier id, final Ass_pard assPard, final Reference reference, final Reference reference2) { + super(id, assPard); this.reference = reference; mBlock = null; objectReference = reference2; @@ -76,9 +77,9 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { @Override protected void classifyAssignment(final CompilationTimeStamp timestamp, final IReferenceChain referenceChain) { - final boolean new_chain = null == referenceChain; + final boolean newChain = null == referenceChain; IReferenceChain temporalReferenceChain; - if (new_chain) { + if (newChain) { temporalReferenceChain = ReferenceChain.getInstance(CIRCULARASSIGNMENTCHAIN, true); } else { temporalReferenceChain = referenceChain; @@ -101,11 +102,11 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { if (null != mBlock) { final Object_Definition obj = new Object_Definition(mBlock); // obj.setLocation(right1); - realAssignment = new Object_Assignment(identifier, ass_pard, oc, obj); + realAssignment = new Object_Assignment(identifier, assPard, oc, obj); } else if (null != objectReference) { final ReferencedObject obj = new ReferencedObject(objectReference); obj.setLocation(objectReference.getLocation()); - realAssignment = new Object_Assignment(identifier, ass_pard, oc, obj); + realAssignment = new Object_Assignment(identifier, assPard, oc, obj); } } else if (identifier.isvalidAsnValueReference() && (reference.refersToSettingType(timestamp, Setting_type.S_T, temporalReferenceChain) || reference @@ -114,11 +115,11 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { if (null != mBlock) { final Value value = new Undefined_Block_Value(mBlock); value.setLocation(mBlock.getLocation()); - realAssignment = new Value_Assignment(identifier, ass_pard, type, value); + realAssignment = new Value_Assignment(identifier, assPard, type, value); } else if (null != objectReference) { final Value value = new Undefined_LowerIdentifier_Value(objectReference.getId().newInstance()); value.setLocation(objectReference.getLocation()); - realAssignment = new Value_Assignment(identifier, ass_pard, type, value); + realAssignment = new Value_Assignment(identifier, assPard, type, value); } } } @@ -133,7 +134,7 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { realAssignment.setFullNameParent(this); } - if (new_chain) { + if (newChain) { temporalReferenceChain.release(); } else { temporalReferenceChain.previousState(); @@ -148,4 +149,18 @@ public final class Undefined_Assignment_O_or_V extends Undefined_Assignment { return new Undefined_Assignment_O_or_V(identifier, null, reference.newInstance(), objectReference.newInstance()); } + + @Override + protected boolean memberAccept(ASTVisitor v) { + if (!super.memberAccept(v)) { + return false; + } + if (reference != null && !reference.accept(v)) { + return false; + } + if (objectReference != null && !objectReference.accept(v)) { + return false; + } + return true; + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_T_or_OC.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_T_or_OC.java index b34a276432..f14ef8e124 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_T_or_OC.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Undefined_Assignment_T_or_OC.java @@ -7,6 +7,7 @@ ******************************************************************************/ package org.eclipse.titan.designer.AST.ASN1; +import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Reference; @@ -62,8 +63,8 @@ public final class Undefined_Assignment_T_or_OC extends Undefined_Assignment { reference.setMyScope(rightScope); if (identifier.isvalidAsnObjectClassReference() && reference.refersToSettingType(timestamp, Setting_type.S_OC, temporalReferenceChain)) { - realAssignment = new ObjectClass_Assignment(identifier, ass_pard, new ObjectClass_refd(reference)); - // ass_pard = null; + realAssignment = new ObjectClass_Assignment(identifier, assPard, new ObjectClass_refd(reference)); + // assPard = null; // asstype = Assignment.A_OC; } else if (identifier.isvalidAsnTyperef() && (reference.refersToSettingType(timestamp, Setting_type.S_T, temporalReferenceChain) || reference @@ -71,8 +72,8 @@ public final class Undefined_Assignment_T_or_OC extends Undefined_Assignment { final Referenced_Type type = new Referenced_Type(reference); type.setLocation(reference.getLocation()); - realAssignment = new Type_Assignment(identifier, ass_pard, type); - // ass_pard = null; + realAssignment = new Type_Assignment(identifier, assPard, type); + // assPard = null; // asstype = A_TYPE; } } @@ -97,4 +98,15 @@ public final class Undefined_Assignment_T_or_OC extends Undefined_Assignment { protected ASN1Assignment internalNewInstance(final Identifier identifier) { return new Undefined_Assignment_T_or_OC(identifier, null, reference.newInstance()); } + + @Override + protected boolean memberAccept(ASTVisitor v) { + if (!super.memberAccept(v)) { + return false; + } + if (reference != null && !reference.accept(v)) { + return false; + } + return true; + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ValueSet_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ValueSet_Assignment.java index 40219411b6..36c9ef3ad5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ValueSet_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/ValueSet_Assignment.java @@ -33,8 +33,8 @@ public final class ValueSet_Assignment extends ASN1Assignment { /** right */ private final Block mBlock; - public ValueSet_Assignment(final Identifier id, final Ass_pard ass_pard, final IASN1Type type, final Block aBlock) { - super(id, ass_pard); + public ValueSet_Assignment(final Identifier id, final Ass_pard assPard, final IASN1Type type, final Block aBlock) { + super(id, assPard); this.type = type; this.mBlock = aBlock; @@ -58,7 +58,7 @@ public final class ValueSet_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { } @@ -117,10 +117,7 @@ public final class ValueSet_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (type != null && !type.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Value_Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Value_Assignment.java index e4a1cd3510..02a4ea6d29 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Value_Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/Value_Assignment.java @@ -44,8 +44,8 @@ public final class Value_Assignment extends ASN1Assignment { /** right. */ private final Value value; - public Value_Assignment(final Identifier id, final Ass_pard ass_pard, final IASN1Type type, final Value value) { - super(id, ass_pard); + public Value_Assignment(final Identifier id, final Ass_pard assPard, final IASN1Type type, final Value value) { + super(id, assPard); this.type = type; this.value = value; @@ -82,9 +82,9 @@ public final class Value_Assignment extends ASN1Assignment { } @Override - public void setRightScope(final Scope right_scope) { + public void setRightScope(final Scope rightScope) { if (null != value) { - value.setMyScope(right_scope); + value.setMyScope(rightScope); } } @@ -107,7 +107,7 @@ public final class Value_Assignment extends ASN1Assignment { } public IValue getValue() { - if (null != ass_pard) { + if (null != assPard) { location.reportSemanticError(MessageFormat.format("`{0}'' is a parameterized value assignment", getFullName())); return null; } @@ -127,8 +127,8 @@ public final class Value_Assignment extends ASN1Assignment { lastTimeChecked = timestamp; - if (null != ass_pard) { - ass_pard.check(timestamp); + if (null != assPard) { + assPard.check(timestamp); return; } @@ -144,12 +144,12 @@ public final class Value_Assignment extends ASN1Assignment { } value.setMyGovernor(type); - final IValue temp_value = type.checkThisValueRef(timestamp, value); - type.checkThisValue(timestamp, temp_value, new ValueCheckingOptions(Expected_Value_type.EXPECTED_CONSTANT, false, false, true, true, + final IValue tempValue = type.checkThisValueRef(timestamp, value); + type.checkThisValue(timestamp, tempValue, new ValueCheckingOptions(Expected_Value_type.EXPECTED_CONSTANT, false, false, true, true, false)); final IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true); - temp_value.checkRecursions(timestamp, chain); + tempValue.checkRecursions(timestamp, chain); chain.release(); } @@ -173,8 +173,8 @@ public final class Value_Assignment extends ASN1Assignment { } if (subrefs.size() == i + 1 && identifier.getName().toLowerCase().startsWith(subrefs.get(i).getId().getName().toLowerCase())) { - final String proposal_kind = UNKNOWNASSIGNMENT; - propCollector.addProposal(identifier, " - " + proposal_kind, ImageCache.getImage(getOutlineIcon()), proposal_kind); + final String proposalKind = UNKNOWNASSIGNMENT; + propCollector.addProposal(identifier, " - " + proposalKind, ImageCache.getImage(getOutlineIcon()), proposalKind); } else if (subrefs.size() > i + 1 && null != type && identifier.getName().equals(subrefs.get(i).getId().getName())) { // perfect match type.addProposal(propCollector, i + 1); @@ -214,10 +214,7 @@ public final class Value_Assignment extends ASN1Assignment { @Override protected boolean memberAccept(ASTVisitor v) { - if (identifier != null && !identifier.accept(v)) { - return false; - } - if (ass_pard != null && !ass_pard.accept(v)) { + if (!super.memberAccept(v)) { return false; } if (type != null && !type.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ASN1Module.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ASN1Module.java index 27c0e2fb9f..49ad74376a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ASN1Module.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ASN1Module.java @@ -54,7 +54,7 @@ public final class ASN1Module extends Module { /** default tagging. */ private final Tag_types tagdef; - private final boolean extensibility_implied; + private final boolean extensibilityImplied; /** exported stuff. */ private Exports exports; /** imported stuff. */ @@ -62,10 +62,10 @@ public final class ASN1Module extends Module { private ASN1Assignments assignments; - public ASN1Module(final Identifier identifier, final IProject project, final Tag_types tagdef, final boolean extensibility_implied) { + public ASN1Module(final Identifier identifier, final IProject project, final Tag_types tagdef, final boolean extensibilityImplied) { super(identifier, project); this.tagdef = tagdef; - this.extensibility_implied = extensibility_implied; + this.extensibilityImplied = extensibilityImplied; exports = new Exports(false); exports.setMyModule(this); exports.setFullNameParent(this); @@ -293,16 +293,16 @@ public final class ASN1Module extends Module { module = parser.getModuleByName(moduleId.getName()); } - final List<ISubReference> new_subreferences = new ArrayList<ISubReference>(); - new_subreferences.add(new FieldSubReference(id)); - final Defined_Reference final_reference = new Defined_Reference(null, new_subreferences); + final List<ISubReference> newSubreferences = new ArrayList<ISubReference>(); + newSubreferences.add(new FieldSubReference(id)); + final Defined_Reference finalSeference = new Defined_Reference(null, newSubreferences); if (this == module || null == module) { return null; } // FIXME add semantic check guard on project level. - return module.getAssBySRef(timestamp, final_reference); + return module.getAssBySRef(timestamp, finalSeference); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Exports.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Exports.java index 4026ae0efa..290a871401 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Exports.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Exports.java @@ -35,7 +35,7 @@ public final class Exports extends ASTNode implements ILocateableNode { * exports all (true if the module of this export list exports all of * its assignments). */ - private final boolean export_all; + private final boolean exportAll; /** * The location of the whole export list. This location encloses the @@ -49,9 +49,9 @@ public final class Exports extends ASTNode implements ILocateableNode { */ private CompilationTimeStamp lastCompilationTimeStamp; - public Exports(final boolean export_all) { - this.export_all = export_all; - if (export_all) { + public Exports(final boolean exportAll) { + this.exportAll = exportAll; + if (exportAll) { symbols = null; } else { symbols = new Symbols(); @@ -59,7 +59,7 @@ public final class Exports extends ASTNode implements ILocateableNode { } public Exports(final Symbols symbols) { - export_all = false; + exportAll = false; this.symbols = symbols; } @@ -86,7 +86,7 @@ public final class Exports extends ASTNode implements ILocateableNode { public boolean exportsSymbol(final CompilationTimeStamp timestamp, final Identifier id) { check(timestamp); - if (export_all) { + if (exportAll) { return true; } @@ -105,7 +105,7 @@ public final class Exports extends ASTNode implements ILocateableNode { return; } - if (export_all) { + if (exportAll) { lastCompilationTimeStamp = timestamp; return; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ImportModule.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ImportModule.java index 82e99e18c1..5b5fe85cda 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ImportModule.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/ImportModule.java @@ -196,12 +196,12 @@ public final class ImportModule extends ModuleImportation { propCollector.addProposal(identifier, ImageCache.getImage(getOutlineIcon()), KIND); } - final Module savedReferedModule = referredModule; - if (savedReferedModule != null) { - Assignments assignments = savedReferedModule.getAssignments(); + final Module savedReferredModule = referredModule; + if (savedReferredModule != null) { + Assignments assignments = savedReferredModule.getAssignments(); for (int i = 0, size = assignments.getNofAssignments(); i < size; i++) { Assignment temporalAssignment = assignments.getAssignmentByIndex(i); - if (savedReferedModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { + if (savedReferredModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { temporalAssignment.addProposal(propCollector, 0); } } @@ -220,19 +220,19 @@ public final class ImportModule extends ModuleImportation { * */ @Override public void addDeclaration(final DeclarationCollector declarationCollector, final Identifier targetModuleId) { - final Module savedReferedModule = referredModule; - if (savedReferedModule != null) { - Assignments assignments = savedReferedModule.getAssignments(); + final Module savedReferredModule = referredModule; + if (savedReferredModule != null) { + Assignments assignments = savedReferredModule.getAssignments(); for (int i = 0; i < assignments.getNofAssignments(); i++) { Assignment temporalAssignment = assignments.getAssignmentByIndex(i); - if (savedReferedModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { + if (savedReferredModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { temporalAssignment.addDeclaration(declarationCollector, 0); } } Identifier moduleId = declarationCollector.getReference().getModuleIdentifier(); List<ISubReference> subrefs = declarationCollector.getReference().getSubreferences(); if (moduleId == null && subrefs.size() == 1 && identifier.getName().equals(subrefs.get(0).getId().getName())) { - declarationCollector.addDeclaration(savedReferedModule.getIdentifier().getDisplayName(), savedReferedModule + declarationCollector.addDeclaration(savedReferredModule.getIdentifier().getDisplayName(), savedReferredModule .getIdentifier().getLocation(), (Scope) null); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Imports.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Imports.java index da951726b0..6ff18d5211 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Imports.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/Imports.java @@ -26,7 +26,6 @@ import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.ModuleImportationChain; import org.eclipse.titan.designer.AST.NULL_Location; import org.eclipse.titan.designer.AST.Reference; -import org.eclipse.titan.designer.AST.TTCN3.definitions.TTCN3Module; import org.eclipse.titan.designer.core.LoadBalancingUtilities; import org.eclipse.titan.designer.editors.DeclarationCollector; import org.eclipse.titan.designer.editors.ProposalCollector; @@ -41,6 +40,8 @@ import org.eclipse.titan.designer.parsers.ProjectStructureDataCollector; * @author Kristof Szabados */ public final class Imports extends ASTNode implements IOutlineElement, ILocateableNode { + private static final String DUPLICATEIMPORTFIRST = "Duplicate import from module `{0}'' was first declared here"; + private static final String DUPLICATEIMPORTREPEATED = "Duplicate import from module `{0}'' was declared here again"; private static final String TTCN3IMPORT = "An ASN.1 module cannot import from a TTCN-3 module"; private static final String SELFIMPORT = "A module cannot import from itself"; @@ -77,7 +78,7 @@ public final class Imports extends ASTNode implements IOutlineElement, ILocateab if (null != importedModule && null != importedModule.getIdentifier() && null != importedModule.getIdentifier().getName()) { importedModule.setProject(project); importedModules_v.add(importedModule); - } + } } /** @@ -192,18 +193,13 @@ public final class Imports extends ASTNode implements IOutlineElement, ILocateab continue; } - // check the imports recursively - referenceChain.markState(); - importModule.checkImports(timestamp, referenceChain, moduleStack); - referenceChain.previousState(); - String name = identifier.getName(); if (importedModules_map.containsKey(name)) { final Location importedLocation = importedModules_map.get(name).getIdentifier().getLocation(); - importedLocation.reportSingularSemanticError(MessageFormat.format(TTCN3Module.DUPLICATEIMPORTFIRST, + importedLocation.reportSingularSemanticError(MessageFormat.format(DUPLICATEIMPORTFIRST, identifier.getDisplayName())); identifier.getLocation().reportSemanticError( - MessageFormat.format(TTCN3Module.DUPLICATEIMPORTREPEATED, identifier.getDisplayName())); + MessageFormat.format(DUPLICATEIMPORTREPEATED, identifier.getDisplayName())); } else { importedModules_map.put(name, importModule); } @@ -227,6 +223,14 @@ public final class Imports extends ASTNode implements IOutlineElement, ILocateab importModule.setUnhandledChange(false); LoadBalancingUtilities.astNodeChecked(); } + + for (ImportModule importModule : importedModules_v) { + // check the imports recursively + referenceChain.markState(); + importModule.checkImports(timestamp, referenceChain, moduleStack); + referenceChain.previousState(); + + } } /** diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/SpecialASN1Module.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/SpecialASN1Module.java index 3db25595de..8fb90eb1a6 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/SpecialASN1Module.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/definitions/SpecialASN1Module.java @@ -210,16 +210,16 @@ public final class SpecialASN1Module { * Parses the special internal assignments to build their semantic * representation. * - * @param input_code + * @param inputCode * the code to parse. * @param identifier * the identifier for the assignment to be created. * * @return the parsed assignment. */ - public static ASN1Assignment parseSpecialInternalAssignment(final String input_code, final Identifier identifier) { + public static ASN1Assignment parseSpecialInternalAssignment(final String inputCode, final Identifier identifier) { ASN1Assignment assignment = null; - StringReader reader = new StringReader(input_code); + StringReader reader = new StringReader(inputCode); CharStream charStream = new UnbufferedCharStream(reader); Asn1Lexer lexer = new Asn1Lexer(charStream); lexer.setTokenFactory(new TokenWithIndexAndSubTokensFactory(true)); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ASN1_Sequence_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ASN1_Sequence_Type.java index d2298382e2..212d6f7dc4 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ASN1_Sequence_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ASN1_Sequence_Type.java @@ -800,18 +800,18 @@ public final class ASN1_Sequence_Type extends ASN1_Set_Seq_Choice_BaseType { /** Parses the block as if it were the block of a sequence. */ private void parseBlockSequence() { - Asn1Parser parserV4 = null; + Asn1Parser parser = null; if (null != mBlock) { - parserV4 = BlockLevelTokenStreamTracker.getASN1ParserForBlock(mBlock); + parser = BlockLevelTokenStreamTracker.getASN1ParserForBlock(mBlock); } - if (null == parserV4) { + if (null == parser) { return; } components = null; if (null != mBlock) { - components = parserV4.pr_special_ComponentTypeLists().list; - List<SyntacticErrorStorage> errors = parserV4.getErrorStorage(); + components = parser.pr_special_ComponentTypeLists().list; + List<SyntacticErrorStorage> errors = parser.getErrorStorage(); if (null != errors && !errors.isEmpty()) { //isErroneous = true; components = null; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ComponentsOfComponentType.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ComponentsOfComponentType.java index d2f8604e6a..4bacd5d568 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ComponentsOfComponentType.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/ComponentsOfComponentType.java @@ -173,7 +173,9 @@ public final class ComponentsOfComponentType extends ComponentType { for (int i = 0; i < tempCtss.getNofRootComps(); i++) { CompField compfield = tempCtss.getRootCompByIndex(i).newInstance(); compfield.setLocation(location); - componentTypes.addComponentType(new RegularComponentType(compfield)); + RegularComponentType componentType = new RegularComponentType(compfield); + componentType.setLocation(location); + componentTypes.addComponentType(componentType); } componentTypes.setMyScope(componentsOfType.getMyScope()); componentTypes.setFullNameParent(this); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/PrintableString_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/PrintableString_Type.java index 34686d5f76..b074485ffb 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/PrintableString_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/PrintableString_Type.java @@ -134,15 +134,15 @@ public final class PrintableString_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - CharString_Type.checkThisTemplateString(timestamp, this, template, is_modified); + CharString_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RegularComponentType.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RegularComponentType.java index e14aaa34e9..bab7b3c985 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RegularComponentType.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RegularComponentType.java @@ -77,7 +77,7 @@ public final class RegularComponentType extends ComponentType { } @Override - public void trCompsof(final CompilationTimeStamp timestamp, final IReferenceChain referenceChain, final boolean is_set) { + public void trCompsof(final CompilationTimeStamp timestamp, final IReferenceChain referenceChain, final boolean isSet) { } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RelativeObjectIdentifier_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RelativeObjectIdentifier_Type.java index 62ab2cc8d9..37fa3dd254 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RelativeObjectIdentifier_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/RelativeObjectIdentifier_Type.java @@ -139,7 +139,7 @@ public final class RelativeObjectIdentifier_Type extends ASN1Type { @Override public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, - final boolean implicit_omit) { + final boolean implicitOmit) { registerUsage(template); template.setMyGovernor(this); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/Selection_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/Selection_Type.java index 899a66e453..a013cf3f7f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/Selection_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/Selection_Type.java @@ -174,8 +174,8 @@ public final class Selection_Type extends ASN1Type implements IReferencingType { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); if (getIsErroneous(timestamp)) { @@ -184,7 +184,7 @@ public final class Selection_Type extends ASN1Type implements IReferencingType { final IType tempType = getTypeRefdLast(timestamp); if (tempType != this) { - tempType.checkThisTemplate(timestamp, template, is_modified, implicit_omit); + tempType.checkThisTemplate(timestamp, template, isModified, implicitOmit); } } @@ -251,18 +251,18 @@ public final class Selection_Type extends ASN1Type implements IReferencingType { @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { if (null == lastTimeChecked) { check(CompilationTimeStamp.getBaseTimestamp()); } if (null != referencedLast && this != referencedLast) { final Expected_Value_type internalExpectation = - (expected_index == Expected_Value_type.EXPECTED_TEMPLATE) ? Expected_Value_type.EXPECTED_DYNAMIC_VALUE - : expected_index; + (expectedIndex == Expected_Value_type.EXPECTED_TEMPLATE) ? Expected_Value_type.EXPECTED_DYNAMIC_VALUE + : expectedIndex; return referencedLast.getFieldType(timestamp, reference, actualSubReference, internalExpectation, refChain, - interrupt_if_optional); + interruptIfOptional); } return null; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/TeletexString_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/TeletexString_Type.java index 08f7a36e89..bb92100fe7 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/TeletexString_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/TeletexString_Type.java @@ -146,15 +146,15 @@ public final class TeletexString_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - CharString_Type.checkThisTemplateString(timestamp, this, template, is_modified); + CharString_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTCTime_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTCTime_Type.java index 92f8d567fb..90057c38cf 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTCTime_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTCTime_Type.java @@ -138,15 +138,15 @@ public final class UTCTime_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - CharString_Type.checkThisTemplateString(timestamp, this, template, is_modified); + CharString_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTF8String_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTF8String_Type.java index 4dc5e92bcd..863dfc2daa 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTF8String_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UTF8String_Type.java @@ -148,15 +148,15 @@ public final class UTF8String_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - UniversalCharstring_Type.checkThisTemplateString(timestamp, this, template, is_modified); + UniversalCharstring_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UnrestrictedString_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UnrestrictedString_Type.java index cc473cc3dc..ed1a3331b9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UnrestrictedString_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/UnrestrictedString_Type.java @@ -108,8 +108,8 @@ public final class UnrestrictedString_Type extends ASN1Type implements IReferenc } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); template.setMyGovernor(this); @@ -122,7 +122,7 @@ public final class UnrestrictedString_Type extends ASN1Type implements IReferenc @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VideotexString_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VideotexString_Type.java index dd313871a6..9321de0a99 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VideotexString_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VideotexString_Type.java @@ -146,15 +146,15 @@ public final class VideotexString_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - CharString_Type.checkThisTemplateString(timestamp, this, template, is_modified); + CharString_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VisibleString_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VisibleString_Type.java index e6f87039a4..56a73a9f6b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VisibleString_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/types/VisibleString_Type.java @@ -138,15 +138,15 @@ public final class VisibleString_Type extends ASN1Type { } @Override - public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean is_modified, - final boolean implicit_omit) { + public void checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, + final boolean implicitOmit) { registerUsage(template); - CharString_Type.checkThisTemplateString(timestamp, this, template, is_modified); + CharString_Type.checkThisTemplateString(timestamp, this, template, isModified); } @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final IReferenceChain refChain, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final IReferenceChain refChain, final boolean interruptIfOptional) { final List<ISubReference> subreferences = reference.getSubreferences(); if (subreferences.size() <= actualSubReference) { return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ASN1_Null_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ASN1_Null_Value.java index c9036359aa..2e1913f75d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ASN1_Null_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ASN1_Null_Value.java @@ -38,7 +38,7 @@ public final class ASN1_Null_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { return Type_type.TYPE_NULL; } @@ -78,7 +78,7 @@ public final class ASN1_Null_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { return true; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Charsymbols_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Charsymbols_Value.java index 2018d58906..96abc74ef7 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Charsymbols_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Charsymbols_Value.java @@ -44,7 +44,7 @@ public final class Charsymbols_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { return null; } @@ -79,7 +79,7 @@ public final class Charsymbols_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ISO2022String_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ISO2022String_Value.java index 9a1d7a969d..6bfb385d0f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ISO2022String_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/ISO2022String_Value.java @@ -54,7 +54,7 @@ public final class ISO2022String_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { return Type_type.TYPE_GENERALSTRING; } @@ -79,15 +79,15 @@ public final class ISO2022String_Value extends Value { final ISubReference subreference = subreferences.get(actualSubReference); switch (subreference.getReferenceType()) { case arraySubReference: - final Value array_index = ((ArraySubReference) subreference).getValue(); - final IValue value_index = array_index.getValueRefdLast(timestamp, refChain); - if (!value_index.isUnfoldable(timestamp)) { - if (Value_type.INTEGER_VALUE.equals(value_index.getValuetype())) { - final int index = ((Integer_Value) value_index).intValue(); - return getStringElement(index, array_index.getLocation()); + final Value arrayIndex = ((ArraySubReference) subreference).getValue(); + final IValue valueIndex = arrayIndex.getValueRefdLast(timestamp, refChain); + if (!valueIndex.isUnfoldable(timestamp)) { + if (Value_type.INTEGER_VALUE.equals(valueIndex.getValuetype())) { + final int index = ((Integer_Value) valueIndex).intValue(); + return getStringElement(index, arrayIndex.getLocation()); } - array_index.getLocation().reportSemanticError(ArraySubReference.INTEGERINDEXEXPECTED); + arrayIndex.getLocation().reportSemanticError(ArraySubReference.INTEGERINDEXEXPECTED); return null; } return null; @@ -106,7 +106,7 @@ public final class ISO2022String_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Bits.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Bits.java index 9dc16d9f32..6e86f36095 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Bits.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Bits.java @@ -59,7 +59,7 @@ public final class Named_Bits extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (null == lastTimeChecked || lastTimeChecked.isLess(timestamp)) { return Type_type.TYPE_UNDEFINED; } @@ -68,7 +68,7 @@ public final class Named_Bits extends Value { return Type_type.TYPE_UNDEFINED; } - return realValue.getExpressionReturntype(timestamp, expected_value); + return realValue.getExpressionReturntype(timestamp, expectedValue); } public int getNofIds() { @@ -92,8 +92,8 @@ public final class Named_Bits extends Value { return identifierMap.containsKey(id.getName()); } - public void setRealValue(final Bitstring_Value real_value) { - this.realValue = real_value; + public void setRealValue(final Bitstring_Value realValue) { + this.realValue = realValue; } @Override @@ -139,23 +139,23 @@ public final class Named_Bits extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { if (null == realValue || realValue.getIsErroneous(timestamp)) { return true; } - return realValue.isUnfoldable(timestamp, expected_value, referenceChain); + return realValue.isUnfoldable(timestamp, expectedValue, referenceChain); } @Override - public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { if (null == realValue || realValue.getIsErroneous(timestamp)) { return this; } - return realValue.getValueRefdLast(timestamp, expected_value, referenceChain); + return realValue.getValueRefdLast(timestamp, expectedValue, referenceChain); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Integer_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Integer_Value.java index a7768849ad..b8d62e00d3 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Integer_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Named_Integer_Value.java @@ -62,7 +62,7 @@ public final class Named_Integer_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { // actually this should never be called return Type_type.TYPE_INTEGER; } @@ -100,7 +100,7 @@ public final class Named_Integer_Value extends Value { } @Override - public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { if (null != calculatedValue) { return calculatedValue; @@ -110,7 +110,7 @@ public final class Named_Integer_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { return true; } @@ -128,9 +128,9 @@ public final class Named_Integer_Value extends Value { } @Override - public Value setValuetype(final CompilationTimeStamp timestamp, final Value_type new_type) { + public Value setValuetype(final CompilationTimeStamp timestamp, final Value_type newType) { // the conversion is done in ASN1_Integer_Type#check_this_value - return super.setValuetype(timestamp, new_type); + return super.setValuetype(timestamp, newType); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/RelativeObjectIdentifier_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/RelativeObjectIdentifier_Value.java index e62d09a0a9..c84869d9c0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/RelativeObjectIdentifier_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/RelativeObjectIdentifier_Value.java @@ -67,7 +67,7 @@ public final class RelativeObjectIdentifier_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { return Type_type.TYPE_ROID; } @@ -136,7 +136,7 @@ public final class RelativeObjectIdentifier_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { return true; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Undefined_Block_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Undefined_Block_Value.java index 2762327654..d495c249dd 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Undefined_Block_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASN1/values/Undefined_Block_Value.java @@ -74,7 +74,7 @@ public final class Undefined_Block_Value extends Value { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (null == lastTimeChecked || lastTimeChecked.isLess(timestamp)) { return Type_type.TYPE_UNDEFINED; } @@ -83,7 +83,7 @@ public final class Undefined_Block_Value extends Value { return Type_type.TYPE_UNDEFINED; } - return realValue.getExpressionReturntype(timestamp, expected_value); + return realValue.getExpressionReturntype(timestamp, expectedValue); } @Override @@ -125,7 +125,7 @@ public final class Undefined_Block_Value extends Value { } @Override - public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { if (null == lastTimeChecked || lastTimeChecked.isLess(timestamp)) { return true; @@ -135,11 +135,11 @@ public final class Undefined_Block_Value extends Value { return true; } - return realValue.isUnfoldable(timestamp, expected_value, referenceChain); + return realValue.isUnfoldable(timestamp, expectedValue, referenceChain); } @Override - public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, + public IValue getValueRefdLast(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { if (null == lastTimeChecked || lastTimeChecked.isLess(timestamp)) { return this; @@ -149,15 +149,15 @@ public final class Undefined_Block_Value extends Value { return this; } - return realValue.getValueRefdLast(timestamp, expected_value, referenceChain); + return realValue.getValueRefdLast(timestamp, expectedValue, referenceChain); } // FIXME can be converted to: charsyms @Override - public Value setValuetype(final CompilationTimeStamp timestamp, final Value_type new_type) { + public Value setValuetype(final CompilationTimeStamp timestamp, final Value_type newType) { lastTimeChecked = timestamp; - switch (new_type) { + switch (newType) { case NAMED_BITS: { Named_Bits namedBits = parseBlockNamedBits(); if (null == namedBits) { @@ -239,7 +239,7 @@ public final class Undefined_Block_Value extends Value { break; } default: - realValue = super.setValuetype(timestamp, new_type); + realValue = super.setValuetype(timestamp, newType); } return realValue; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASTNode.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASTNode.java index 9791dbca3e..8be1bd7e20 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASTNode.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ASTNode.java @@ -63,8 +63,8 @@ public abstract class ASTNode implements IASTNode, IIdentifierContainer, IVisita return null; } - final T3Doc parent_t3doc = assignment.getT3Doc(location); - if (parent_t3doc != null) { + final T3Doc parentT3doc = assignment.getT3Doc(location); + if (parentT3doc != null) { // if it is a type assignment/definition then detect if we are in a field if (assignment.getAssignmentType() == Assignment_type.A_TYPE) { IType type = assignment.getType(CompilationTimeStamp.getBaseTimestamp()); @@ -86,8 +86,8 @@ public abstract class ASTNode implements IASTNode, IIdentifierContainer, IVisita } //Get member information if available - if (parent_t3doc.getMembers() != null) { - final String desc = parent_t3doc.getMembers().get(st); + if (parentT3doc.getMembers() != null) { + final String desc = parentT3doc.getMembers().get(st); if (desc != null) { return new T3Doc(desc); } @@ -97,12 +97,12 @@ public abstract class ASTNode implements IASTNode, IIdentifierContainer, IVisita String st = st1.substring(st1.lastIndexOf(".") + 1); String desc = null; - if (parent_t3doc.getMembers() != null) { - desc = parent_t3doc.getMembers().get(st); + if (parentT3doc.getMembers() != null) { + desc = parentT3doc.getMembers().get(st); } - if (parent_t3doc.getParams() != null) { - desc = parent_t3doc.getParams().get(st); + if (parentT3doc.getParams() != null) { + desc = parentT3doc.getParams().get(st); } if (desc != null) { @@ -118,8 +118,8 @@ public abstract class ASTNode implements IASTNode, IIdentifierContainer, IVisita String st1 = this.getFullName().toString(); String st = st1.substring(st1.lastIndexOf(".") + 1); - if (parent_t3doc.getParams() != null) { - final String desc = parent_t3doc.getParams().get(st); + if (parentT3doc.getParams() != null) { + final String desc = parentT3doc.getParams().get(st); if (desc != null) { return new T3Doc(desc); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Assignment.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Assignment.java index 17852c4c3f..87ff48c9e3 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Assignment.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Assignment.java @@ -12,6 +12,7 @@ import java.text.MessageFormat; import org.eclipse.core.runtime.Platform; import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.AST.TTCN3.definitions.Group; +import org.eclipse.titan.designer.declarationsearch.Declaration; import org.eclipse.titan.designer.editors.DeclarationCollector; import org.eclipse.titan.designer.editors.ProposalCollector; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -25,7 +26,7 @@ import org.eclipse.titan.designer.productUtilities.ProductConstants; * * @author Kristof Szabados * */ -public abstract class Assignment extends ASTNode implements IOutlineElement, ILocateableNode, IReferenceChainElement { +public abstract class Assignment extends ASTNode implements IOutlineElement, ILocateableNode, IReferenceChainElement, IReferencingElement { protected static final String GLOBALLY_UNUSED = "The {0} seems to be never used globally"; protected static final String LOCALLY_UNUSED = "The {0} seems to be never used locally"; @@ -97,6 +98,13 @@ public abstract class Assignment extends ASTNode implements IOutlineElement, ILo return lastTimeChecked; } + /** + * Resets the last time when this assignment was checked. + * */ + public final void resetLastTimeChecked() { + lastTimeChecked = null; + } + public final boolean getIsErroneous() { return isErroneous; } @@ -263,4 +271,9 @@ public abstract class Assignment extends ASTNode implements IOutlineElement, ILo * @return true if the highlighting of this assignment is turned on */ public abstract boolean shouldMarkOccurrences(); + + @Override + public Declaration getDeclaration() { + return Declaration.createInstance(this); + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ISetting.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ISetting.java index ae08ca1795..30abab73df 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ISetting.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ISetting.java @@ -36,9 +36,9 @@ public interface ISetting extends IASTNode, ILocateableNode { /** * Sets the erroneousness of the setting. * - * @param is_erroneous the value to set. + * @param isErroneous the value to set. * */ - void setIsErroneous(final boolean is_erroneous); + void setIsErroneous(final boolean isErroneous); /** * @return the internal type of the setting diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IType.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IType.java index 815b3cb7d7..9d7ddfb3af 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IType.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IType.java @@ -10,14 +10,13 @@ package org.eclipse.titan.designer.AST; import java.util.List; import java.util.Set; +import org.eclipse.titan.designer.AST.Type.CompatibilityLevel; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.attributes.MultipleWithAttributes; import org.eclipse.titan.designer.AST.TTCN3.attributes.WithAttributesPath; -import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template; import org.eclipse.titan.designer.AST.TTCN3.types.subtypes.ParsedSubType; import org.eclipse.titan.designer.AST.TTCN3.types.subtypes.SubType; -import org.eclipse.titan.designer.AST.Type.CompatibilityLevel; import org.eclipse.titan.designer.editors.DeclarationCollector; import org.eclipse.titan.designer.editors.ProposalCollector; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -198,14 +197,14 @@ public interface IType extends IGovernor, IIdentifierContainer, IVisitableNode, /** true if the value to be checked is an element of a string */ public final boolean str_elem; - public ValueCheckingOptions(final Expected_Value_type expected_value, final boolean incomplete_allowed, final boolean omit_allowed, - final boolean sub_check, final boolean implicit_omit, final boolean str_elem) { - this.expected_value = expected_value; - this.incomplete_allowed = incomplete_allowed; - this.omit_allowed = omit_allowed; - this.sub_check = sub_check; - this.implicit_omit = implicit_omit; - this.str_elem = str_elem; + public ValueCheckingOptions(final Expected_Value_type expectedValue, final boolean incompleteAllowed, final boolean omitAllowed, + final boolean subCheck, final boolean implicitOmit, final boolean strElem) { + this.expected_value = expectedValue; + this.incomplete_allowed = incompleteAllowed; + this.omit_allowed = omitAllowed; + this.sub_check = subCheck; + this.implicit_omit = implicitOmit; + this.str_elem = strElem; } } @@ -336,7 +335,7 @@ public interface IType extends IGovernor, IIdentifierContainer, IVisitableNode, /** * Calculates the list of field types traversed, in type_array and their - * local indices in subrefs_array parameters. Must be used only after + * local indices in subrefsArray parameters. Must be used only after * getFieldType() was already successfully invoked.. It can be used only * when all array indexes are foldable, otherwise it returns false. * @@ -617,8 +616,6 @@ public interface IType extends IGovernor, IIdentifierContainer, IVisitableNode, Assignment getDefiningAssignment(); - Definition getDefiningDefinition(); - // TODO declaration and proposal collecting should not belong here /** * Searches and adds a declaration proposal to the provided collector if diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IValue.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IValue.java index 62cff01988..82cdecc5f5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IValue.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/IValue.java @@ -191,14 +191,14 @@ public interface IValue extends IGovernedSimple, IIdentifierContainer, IVisitabl * * @param timestamp * the time stamp of the actual semantic check cycle. - * @param expected_value + * @param expectedValue * the kind of the value to be expected. * @param referenceChain * the reference chain to detect circular references. * * @return true if the value is unfoldable, false if it is foldable * */ - boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value, final IReferenceChain referenceChain); + boolean isUnfoldable(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain); /** * Returns the referenced field value for structured values, or itself @@ -226,13 +226,13 @@ public interface IValue extends IGovernedSimple, IIdentifierContainer, IVisitabl * * @param timestamp * the time stamp of the actual semantic check cycle. - * @param new_type + * @param newType * the new value_type the new value should belong to. * * @return the new value of the provided kind if the conversion is * possible, or this value otherwise. * */ - IValue setValuetype(final CompilationTimeStamp timestamp, final Value_type new_type); + IValue setValuetype(final CompilationTimeStamp timestamp, final Value_type newType); /** * Checks whether this value is defining itself in a recursive way. This diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Identifier.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Identifier.java index bd7d05fc67..1ba9a542c2 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Identifier.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Identifier.java @@ -544,18 +544,18 @@ public class Identifier implements ILocateableNode, IVisitableNode { } - public Identifier(final Identifier_type id_type, final String name) { - this(id_type, name, NULL_Location.INSTANCE, false); + public Identifier(final Identifier_type idType, final String name) { + this(idType, name, NULL_Location.INSTANCE, false); } - public Identifier(final Identifier_type id_type, final String name, final Location location) { - this(id_type, name, location, false); + public Identifier(final Identifier_type idType, final String name, final Location location) { + this(idType, name, location, false); } - public Identifier(final Identifier_type id_type, final String name, final Location location, final boolean dontregister) { - this.type = id_type; + public Identifier(final Identifier_type idType, final String name, final Location location, final boolean dontregister) { + this.type = idType; this.location = location; - switch(id_type) { + switch(idType) { case ID_ASN: if (ID_MAP_ASN.containsKey(name)) { idData = ID_MAP_ASN.get(name); @@ -680,12 +680,12 @@ public class Identifier implements ILocateableNode, IVisitableNode { } /** - * @param id_type the type of identifier to be checked for. + * @param idType the type of identifier to be checked for. * * @return whether this identifier is valid in a context * */ - public final boolean getHasValid(final Identifier_type id_type) { - switch(id_type) { + public final boolean getHasValid(final Identifier_type idType) { + switch(idType) { case ID_NAME: return !Identifier_Internal_Data.INVALID_STRING.equals(getName()); case ID_TTCN: diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/KeywordLessIdentifier.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/KeywordLessIdentifier.java index da21077e47..81bfac9012 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/KeywordLessIdentifier.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/KeywordLessIdentifier.java @@ -12,21 +12,21 @@ package org.eclipse.titan.designer.AST; * */ public final class KeywordLessIdentifier extends Identifier { - public KeywordLessIdentifier(final Identifier_type id_type, final String name) { - this(id_type, name, NULL_Location.INSTANCE); + public KeywordLessIdentifier(final Identifier_type idType, final String name) { + this(idType, name, NULL_Location.INSTANCE); } - public KeywordLessIdentifier(final Identifier_type id_type, final String name, final Location location) { - this(id_type, name, location, true); + public KeywordLessIdentifier(final Identifier_type idType, final String name, final Location location) { + this(idType, name, location, true); } - protected KeywordLessIdentifier(final Identifier_type id_type, final String name, + protected KeywordLessIdentifier(final Identifier_type idType, final String name, final Location location, final boolean dontregister) { - type = id_type; + type = idType; this.location = location; String realName; - switch(id_type) { + switch(idType) { case ID_ASN: if (name.length() > 0 && name.charAt(0) == '&') { realName = Identifier_Internal_Data.asnToName(name.substring(1)); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/MarkerHandler.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/MarkerHandler.java index 4d63c35dcd..c2f8362ed9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/MarkerHandler.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/MarkerHandler.java @@ -682,7 +682,7 @@ public final class MarkerHandler { resources.add(file); } } catch (CoreException e) { - ErrorReporter.logExceptionStackTrace(MARKER_HANDLING_ERROR, e); + //be silent, perhaps it already has been removed } } @@ -710,7 +710,7 @@ public final class MarkerHandler { resources.add(file); } } catch (CoreException e) { - ErrorReporter.logExceptionStackTrace(MARKER_HANDLING_ERROR, e); + //be silent, perhaps it already has been removed } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ModuleImportation.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ModuleImportation.java index 1de0d130b5..32d52091f5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ModuleImportation.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ModuleImportation.java @@ -72,7 +72,7 @@ public abstract class ModuleImportation implements IReferenceChainElement, IOutl } /** - * Sets whether the module refered to by this importation has changed to + * Sets whether the module referred to by this importation has changed to * an other one since the last importation check. * * @param value diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/PortReference.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/PortReference.java new file mode 100644 index 0000000000..3dcf1f9cb7 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/PortReference.java @@ -0,0 +1,78 @@ +package org.eclipse.titan.designer.AST; + +import java.text.MessageFormat; + +import org.eclipse.titan.common.logging.ErrorReporter; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; +import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeBody; +import org.eclipse.titan.designer.AST.TTCN3.types.Component_Type; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; + +/** + * Special reference type used by map, unmap, connect, disconnect statements. + * + * This reference is never part of the scope hierarchy, + * but only references a port within a component type. + * + * */ +public class PortReference extends Reference { + private static final String NOPORTWITHNAME = "Component type `{0}'' does not have a port with name `{1}''"; + + private Component_Type componentType; + + public PortReference(final Reference reference) { + super(null, reference.getSubreferences()); + } + + public void setComponent(final Component_Type componentType) { + this.componentType = componentType; + } + + /** @return a new instance of this reference */ + public Reference newInstance() { + ErrorReporter.INTERNAL_ERROR("Port referencies should not be cloned"); + return null; + } + + @Override + public Assignment getRefdAssignment(CompilationTimeStamp timestamp, boolean checkParameterList) { + if(myScope == null || componentType == null) { + return null; + } + + if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { + return referredAssignment; + } + + Identifier portIdentifier = getId(); + ComponentTypeBody componentBody = componentType.getComponentBody(); + if (!componentBody.hasLocalAssignmentWithId(portIdentifier)) { + getLocation().reportSemanticError( + MessageFormat.format(NOPORTWITHNAME, componentType.getTypename(), portIdentifier.getDisplayName())); + + referredAssignment = null; + lastTimeChecked = timestamp; + return null; + } + + referredAssignment = componentBody.getLocalAssignmentById(portIdentifier); + + if (referredAssignment != null) { + referredAssignment.check(timestamp); + referredAssignment.setUsed(); + + if (referredAssignment instanceof Definition) { + String referingModuleName = getMyScope().getModuleScope().getName(); + if (!((Definition) referredAssignment).referingHere.contains(referingModuleName)) { + ((Definition) referredAssignment).referingHere.add(referingModuleName); + } + } + } + + lastTimeChecked = timestamp; + + return referredAssignment; + } + + +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java index 6d24a15a12..b9a9a12a37 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java @@ -78,8 +78,8 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall /** * The assignment referred to by this reference. * */ - private Assignment referedAssignment; - private CompilationTimeStamp lastTimeChecked; + protected Assignment referredAssignment; + protected CompilationTimeStamp lastTimeChecked; /** * Stores whether this reference is used on the left hand side of an @@ -120,7 +120,7 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall * Might be outdated information. * */ public Assignment getAssOld() { - return referedAssignment; + return referredAssignment; } /** @@ -202,11 +202,11 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall /** * Sets the erroneousness of the setting. * - * @param is_erroneous + * @param isErroneous * set the erroneousness property of the references. * */ - public void setIsErroneous(final boolean is_erroneous) { - isErroneous = is_erroneous; + public void setIsErroneous(final boolean isErroneous) { + this.isErroneous = isErroneous; } /** @@ -355,7 +355,7 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall * Clears the cache of this reference. **/ public void clear() { - referedAssignment = null; + referredAssignment = null; lastTimeChecked = null; } @@ -437,43 +437,43 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall } if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp) && !checkParameterList) { - return referedAssignment; + return referredAssignment; } detectedModuleId = false; detectModid(); - referedAssignment = myScope.getAssBySRef(timestamp, this); + referredAssignment = myScope.getAssBySRef(timestamp, this); - if (referedAssignment != null) { - referedAssignment.check(timestamp); - referedAssignment.setUsed(); + if (referredAssignment != null) { + referredAssignment.check(timestamp); + referredAssignment.setUsed(); - if (referedAssignment instanceof Definition) { + if (referredAssignment instanceof Definition) { String referingModuleName = getMyScope().getModuleScope().getName(); - if (!((Definition) referedAssignment).referingHere.contains(referingModuleName)) { - ((Definition) referedAssignment).referingHere.add(referingModuleName); + if (!((Definition) referredAssignment).referingHere.contains(referingModuleName)) { + ((Definition) referredAssignment).referingHere.add(referingModuleName); } } } - if (referedAssignment != null && checkParameterList) { + if (referredAssignment != null && checkParameterList) { FormalParameterList formalParameterList = null; - if (referedAssignment instanceof IParameterisedAssignment) { - formalParameterList = ((IParameterisedAssignment) referedAssignment).getFormalParameterList(); + if (referredAssignment instanceof IParameterisedAssignment) { + formalParameterList = ((IParameterisedAssignment) referredAssignment).getFormalParameterList(); } if (formalParameterList == null) { if (!subReferences.isEmpty() && subReferences.get(0) instanceof ParameterisedSubReference) { final String message = MessageFormat.format("The referenced {0} cannot have actual parameters", - referedAssignment.getDescription()); + referredAssignment.getDescription()); getLocation().reportSemanticError(message); } } else { if (!subReferences.isEmpty()) { ISubReference firstSubReference = subReferences.get(0); if (firstSubReference instanceof ParameterisedSubReference) { - formalParameterList.check(timestamp, referedAssignment.getAssignmentType()); + formalParameterList.check(timestamp, referredAssignment.getAssignmentType()); isErroneous = ((ParameterisedSubReference) firstSubReference).checkParameters(timestamp, formalParameterList); } else { @@ -482,11 +482,11 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall // to a template having formal // parameters, where each has // default values - if (!Assignment.Assignment_type.A_TEMPLATE.equals(referedAssignment.getAssignmentType()) + if (!Assignment.Assignment_type.A_TEMPLATE.equals(referredAssignment.getAssignmentType()) || !formalParameterList.hasOnlyDefaultValues()) { final String message = MessageFormat.format( "Reference to parameterized definition `{0}'' without actual parameter list", - referedAssignment.getIdentifier().getDisplayName()); + referredAssignment.getIdentifier().getDisplayName()); getLocation().reportSemanticError(message); } } @@ -496,7 +496,7 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall lastTimeChecked = timestamp; - return referedAssignment; + return referredAssignment; } /** @@ -787,18 +787,18 @@ public class Reference extends ASTNode implements ILocateableNode, IIncrementall for (ISubReference sr : subReferences) { sr.findReferences(referenceFinder, foundIdentifiers); } - if (referedAssignment == null) { + if (referredAssignment == null) { return; } if (referenceFinder.fieldId == null) { // we are searching for the assignment itself - if (referenceFinder.assignment != referedAssignment) { + if (referenceFinder.assignment != referredAssignment) { return; } foundIdentifiers.add(new Hit(getId(), this)); } else { // we are searching for a field of a type - IType t = referedAssignment.getType(CompilationTimeStamp.getBaseTimestamp()); + IType t = referredAssignment.getType(CompilationTimeStamp.getBaseTimestamp()); if (t == null) { return; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ReferenceFinder.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ReferenceFinder.java index 54ef645f06..e46212e5ae 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ReferenceFinder.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/ReferenceFinder.java @@ -201,6 +201,7 @@ public final class ReferenceFinder { // runs on that component or a compatible or self // treat it as global definition if (localScope instanceof ComponentTypeBody) { + //FIXME this still does not make them global, that is something completely different. localScope = module; } else // search for actual named parameters everywhere @@ -215,7 +216,7 @@ public final class ReferenceFinder { return localScope; } - + //FIXME should check all modules that might transitively import the definition public Map<Module, List<Hit>> findAllReferences(final Module module, final ProjectSourceParser projectSourceParser, final IProgressMonitor pMonitor, final boolean reportDebugInformation) { final IProgressMonitor monitor = pMonitor == null ? new NullProgressMonitor() : pMonitor; @@ -223,13 +224,15 @@ public final class ReferenceFinder { monitor.beginTask("Searching references.", projectSourceParser.getKnownModuleNames().size()); Map<Module, List<Hit>> foundIdsMap = new HashMap<Module, List<Hit>>(); // in this scope + //TODO this is efficient but only for local variables ... and if are not followed up by other searches List<Hit> foundIds = new ArrayList<Hit>(); scope.findReferences(this, foundIds); if (!foundIds.isEmpty()) { - foundIdsMap.put(module, foundIds); + foundIdsMap.put(scope.getModuleScope(), foundIds); } // in other modules that import this module, if the assignment // is global + //FIXME but if component variable ... we might have to search all related modules in all related projects. if (scope instanceof Module) { for (String moduleName2 : projectSourceParser.getKnownModuleNames()) { if (monitor.isCanceled()) { @@ -241,7 +244,7 @@ public final class ReferenceFinder { continue; } for (Module m : module2.getImportedModules()) { - if (m == module) { + if (m == scope) { if (reportDebugInformation) { TITANDebugConsole.println("found importing module: " + module2.getName()); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Setting.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Setting.java index ade3b97f98..d3098967cb 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Setting.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Setting.java @@ -41,8 +41,8 @@ public abstract class Setting extends ASTNode implements ISetting { } @Override - public final void setIsErroneous(final boolean is_erroneous) { - isErroneous = is_erroneous; + public final void setIsErroneous(final boolean isErroneous) { + this.isErroneous = isErroneous; } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/TemplateRestriction.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/TemplateRestriction.java index 8c78aaa3b8..846f1a7d62 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/TemplateRestriction.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/TemplateRestriction.java @@ -84,23 +84,23 @@ public final class TemplateRestriction { } /** - * Checks if needed_tr is satisfied by refd_tr. + * Checks if neededTemplateRestriction is satisfied by refd_tr. * - * @param needed_tr the restriction that should be satisfied. - * @param refd_tr the restriction that should be satisfying. + * @param neededTemplateRestriction the restriction that should be satisfied. + * @param refdTemplateRestriction the restriction that should be satisfying. * - * @return true if needed_tr is satisfied by refd_tr, false otherwise. + * @return true if neededTemplateRestriction is satisfied by refd_tr, false otherwise. * */ - public static boolean isLessRestrictive(final Restriction_type needed_tr, final Restriction_type refd_tr) { - switch (needed_tr) { + public static boolean isLessRestrictive(final Restriction_type neededTemplateRestriction, final Restriction_type refdTemplateRestriction) { + switch (neededTemplateRestriction) { case TR_NONE: return false; case TR_VALUE: - return refd_tr != Restriction_type.TR_VALUE; + return refdTemplateRestriction != Restriction_type.TR_VALUE; case TR_OMIT: - return refd_tr != Restriction_type.TR_VALUE && refd_tr != Restriction_type.TR_OMIT; + return refdTemplateRestriction != Restriction_type.TR_VALUE && refdTemplateRestriction != Restriction_type.TR_OMIT; case TR_PRESENT: - return refd_tr != Restriction_type.TR_VALUE && refd_tr != Restriction_type.TR_PRESENT; + return refdTemplateRestriction != Restriction_type.TR_VALUE && refdTemplateRestriction != Restriction_type.TR_PRESENT; default: return true; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/DecodeTypeMappingTarget.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/DecodeTypeMappingTarget.java index 7c531c7472..0c21d65ff8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/DecodeTypeMappingTarget.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/DecodeTypeMappingTarget.java @@ -25,13 +25,13 @@ import org.eclipse.titan.designer.parsers.CompilationTimeStamp; * */ public final class DecodeTypeMappingTarget extends TypeMappingTarget { - private final Type target_type; + private final Type targetType; private final DecodeAttribute decodeAttribute; private final ErrorBehaviorAttribute errorBehaviorAttribute; - public DecodeTypeMappingTarget(final Type target_type, final ExtensionAttribute decodeAttribute, + public DecodeTypeMappingTarget(final Type targetType, final ExtensionAttribute decodeAttribute, final ErrorBehaviorAttribute errorBehaviorAttribute) { - this.target_type = target_type; + this.targetType = targetType; if (decodeAttribute instanceof DecodeAttribute) { this.decodeAttribute = (DecodeAttribute) decodeAttribute; } else { @@ -52,7 +52,7 @@ public final class DecodeTypeMappingTarget extends TypeMappingTarget { @Override public Type getTargetType() { - return target_type; + return targetType; } public Encoding_type getCodingType() { @@ -87,7 +87,7 @@ public final class DecodeTypeMappingTarget extends TypeMappingTarget { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (target_type == child) { + if (targetType == child) { return builder.append(".<target_type>"); } else if (errorBehaviorAttribute == child) { return builder.append(".<errorbehavior>"); @@ -99,8 +99,8 @@ public final class DecodeTypeMappingTarget extends TypeMappingTarget { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (target_type != null) { - target_type.setMyScope(scope); + if (targetType != null) { + targetType.setMyScope(scope); } } @@ -112,8 +112,8 @@ public final class DecodeTypeMappingTarget extends TypeMappingTarget { lastTimeChecked = timestamp; - if (target_type != null) { - target_type.check(timestamp); + if (targetType != null) { + targetType.check(timestamp); } // FIXME implement once has_encoding is available. if (errorBehaviorAttribute != null) { @@ -123,14 +123,14 @@ public final class DecodeTypeMappingTarget extends TypeMappingTarget { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (target_type != null) { - target_type.findReferences(referenceFinder, foundIdentifiers); + if (targetType != null) { + targetType.findReferences(referenceFinder, foundIdentifiers); } } @Override protected boolean memberAccept(ASTVisitor v) { - if (target_type != null && !target_type.accept(v)) { + if (targetType != null && !targetType.accept(v)) { return false; } if (decodeAttribute != null && !decodeAttribute.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/EncodeTypeMappingTarget.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/EncodeTypeMappingTarget.java index 995bf4be99..5e5dffb894 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/EncodeTypeMappingTarget.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/EncodeTypeMappingTarget.java @@ -27,13 +27,13 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { private static final String FULLNAMEPART1 = ".<target_type>"; private static final String FULLNAMEPART2 = ".<errorbehavior>"; - private final Type target_type; + private final Type targetType; private final EncodeAttribute encodeAttribute; private final ErrorBehaviorAttribute errorBehaviorAttribute; - public EncodeTypeMappingTarget(final Type target_type, final ExtensionAttribute encodeAttribute, + public EncodeTypeMappingTarget(final Type targetType, final ExtensionAttribute encodeAttribute, final ErrorBehaviorAttribute errorBehaviorAttribute) { - this.target_type = target_type; + this.targetType = targetType; if (encodeAttribute instanceof EncodeAttribute) { this.encodeAttribute = (EncodeAttribute) encodeAttribute; } else { @@ -54,7 +54,7 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { @Override public Type getTargetType() { - return target_type; + return targetType; } public Encoding_type getCodingType() { @@ -89,7 +89,7 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (target_type == child) { + if (targetType == child) { return builder.append(FULLNAMEPART1); } else if (errorBehaviorAttribute == child) { return builder.append(FULLNAMEPART2); @@ -101,8 +101,8 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (target_type != null) { - target_type.setMyScope(scope); + if (targetType != null) { + targetType.setMyScope(scope); } } @@ -114,8 +114,8 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { lastTimeChecked = timestamp; - if (target_type != null) { - target_type.check(timestamp); + if (targetType != null) { + targetType.check(timestamp); } // FIXME implement once has_encoding is available. if (errorBehaviorAttribute != null) { @@ -125,14 +125,14 @@ public final class EncodeTypeMappingTarget extends TypeMappingTarget { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (target_type != null) { - target_type.findReferences(referenceFinder, foundIdentifiers); + if (targetType != null) { + targetType.findReferences(referenceFinder, foundIdentifiers); } } @Override protected boolean memberAccept(ASTVisitor v) { - if (target_type != null && !target_type.accept(v)) { + if (targetType != null && !targetType.accept(v)) { return false; } if (encodeAttribute != null && !encodeAttribute.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributeSpecification.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributeSpecification.java index 7bd2c1b425..2313f5ec74 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributeSpecification.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributeSpecification.java @@ -59,11 +59,11 @@ public final class ErroneousAttributeSpecification implements ILocateableNode, I // set by check() or null if tmpl_inst is invalid or omit private IValue value = null; - public ErroneousAttributeSpecification(final Indicator_Type indicator, final boolean isRaw, final TemplateInstance tmpl_inst, + public ErroneousAttributeSpecification(final Indicator_Type indicator, final boolean isRaw, final TemplateInstance templateInst, final boolean hasAllKeyword) { this.indicator = indicator; this.isRaw = isRaw; - this.templateInst = tmpl_inst; + this.templateInst = templateInst; this.hasAllKeyword = hasAllKeyword; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributes.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributes.java index 1d46c4d640..03e8b0aa75 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributes.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErroneousAttributes.java @@ -34,16 +34,16 @@ import org.eclipse.titan.designer.parsers.CompilationTimeStamp; */ class FieldErr_Type { public Qualifier qualifier; - public ErroneousAttributeSpecification errAttr; + public ErroneousAttributeSpecification errAttrSpec; public List<Integer> subrefsArray; public List<IType> typeArray; - FieldErr_Type(final Qualifier qualifier, final ErroneousAttributeSpecification err_attr_spec, final List<Integer> subrefs_array, - final List<IType> type_array) { + FieldErr_Type(final Qualifier qualifier, final ErroneousAttributeSpecification errAttrSpec, final List<Integer> subrefsArray, + final List<IType> typeArray) { this.qualifier = qualifier; - this.errAttr = err_attr_spec; - this.subrefsArray = subrefs_array; - this.typeArray = type_array; + this.errAttrSpec = errAttrSpec; + this.subrefsArray = subrefsArray; + this.typeArray = typeArray; } } @@ -120,8 +120,8 @@ public class ErroneousAttributes implements IIdentifierContainer, IVisitableNode Qualifier omitAfterQualifier = null; Map<Integer, List<FieldErr_Type>> embeddedFieldArrayMap = new HashMap<Integer, List<FieldErr_Type>>(); for (FieldErr_Type actualFieldErr : fldArray) { - Indicator_Type actIndicator = actualFieldErr.errAttr.getIndicator(); - boolean isOmit = actualFieldErr.errAttr.isOmit(); + Indicator_Type actIndicator = actualFieldErr.errAttrSpec.getIndicator(); + boolean isOmit = actualFieldErr.errAttrSpec.isOmit(); if (actualFieldErr.subrefsArray.size() <= level) { ErrorReporter.INTERNAL_ERROR(); return erroneousDescr; @@ -309,13 +309,13 @@ public class ErroneousAttributes implements IIdentifierContainer, IVisitableNode actualFieldErr.qualifier.getDisplayName()); switch (actIndicator) { case Before_Indicator: - evs.before = actualFieldErr.errAttr; + evs.before = actualFieldErr.errAttrSpec; break; case Value_Indicator: - evs.value = actualFieldErr.errAttr; + evs.value = actualFieldErr.errAttrSpec; break; case After_Indicator: - evs.after = actualFieldErr.errAttr; + evs.after = actualFieldErr.errAttrSpec; break; default: ErrorReporter.INTERNAL_ERROR(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErrorBehaviorList.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErrorBehaviorList.java index 5c63ee92fb..810b241069 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErrorBehaviorList.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/ErrorBehaviorList.java @@ -87,15 +87,15 @@ public final class ErrorBehaviorList extends ASTNode implements ILocateableNode return settings.get(index); } - public boolean hasSetting(final CompilationTimeStamp timestamp, final String error_type) { + public boolean hasSetting(final CompilationTimeStamp timestamp, final String errorType) { check(timestamp); - return settingAll != null || settingMap.containsKey(error_type); + return settingAll != null || settingMap.containsKey(errorType); } - public String getHandling(final CompilationTimeStamp timestamp, final String error_type) { + public String getHandling(final CompilationTimeStamp timestamp, final String errorType) { check(timestamp); - if (settingMap.containsKey(error_type)) { - return settingMap.get(error_type).getErrorHandling(); + if (settingMap.containsKey(errorType)) { + return settingMap.get(errorType).getErrorHandling(); } else if (settingAll != null) { return settingAll.getErrorHandling(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/FunctionTypeMappingTarget.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/FunctionTypeMappingTarget.java index 24ec01d864..d4dbcff571 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/FunctionTypeMappingTarget.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/FunctionTypeMappingTarget.java @@ -37,9 +37,9 @@ public final class FunctionTypeMappingTarget extends TypeMappingTarget { private Def_Function functionReferenced; private Def_Extfunction extfunctionReferenced; - public FunctionTypeMappingTarget(final Type target_type, final Reference function_reference) { - this.targetType = target_type; - this.functionReference = function_reference; + public FunctionTypeMappingTarget(final Type targetType, final Reference functionReference) { + this.targetType = targetType; + this.functionReference = functionReference; } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/SimpleTypeMappingTarget.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/SimpleTypeMappingTarget.java index 8a28051427..44515e8c18 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/SimpleTypeMappingTarget.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/SimpleTypeMappingTarget.java @@ -23,10 +23,10 @@ import org.eclipse.titan.designer.parsers.CompilationTimeStamp; * */ public final class SimpleTypeMappingTarget extends TypeMappingTarget { - private final Type target_type; + private final Type targetType; - public SimpleTypeMappingTarget(final Type target_type) { - this.target_type = target_type; + public SimpleTypeMappingTarget(final Type targetType) { + this.targetType = targetType; } @Override @@ -41,7 +41,7 @@ public final class SimpleTypeMappingTarget extends TypeMappingTarget { @Override public Type getTargetType() { - return target_type; + return targetType; } @Override @@ -52,23 +52,23 @@ public final class SimpleTypeMappingTarget extends TypeMappingTarget { lastTimeChecked = timestamp; - if (source != null && !source.isIdentical(timestamp, target_type)) { - target_type.getLocation().reportSemanticError( + if (source != null && !source.isIdentical(timestamp, targetType)) { + targetType.getLocation().reportSemanticError( MessageFormat.format("The source and target types must be the same: `{0}'' was expected instead of `{1}''", - source.getTypename(), target_type.getTypename())); + source.getTypename(), targetType.getTypename())); } } @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (target_type != null) { - target_type.findReferences(referenceFinder, foundIdentifiers); + if (targetType != null) { + targetType.findReferences(referenceFinder, foundIdentifiers); } } @Override protected boolean memberAccept(ASTVisitor v) { - if (target_type != null && !target_type.accept(v)) { + if (targetType != null && !targetType.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/TypeMappings.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/TypeMappings.java index de67ba1702..f9a29cfeba 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/TypeMappings.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/TypeMappings.java @@ -104,16 +104,16 @@ public final class TypeMappings extends ASTNode implements ILocateableNode { /** * Copy over the mappings from the provided mapping list. * - * @param other_mappings + * @param otherMappings * the other list of mappings. * */ - public void copyMappings(final TypeMappings other_mappings) { - for (int i = 0, size = other_mappings.getNofMappings(); i < size; i++) { - mappings.add(other_mappings.getMappingByIndex(i)); + public void copyMappings(final TypeMappings otherMappings) { + for (int i = 0, size = otherMappings.getNofMappings(); i < size; i++) { + mappings.add(otherMappings.getMappingByIndex(i)); } // join the locations - getLocation().setEndOffset(other_mappings.getLocation().getEndOffset()); + getLocation().setEndOffset(otherMappings.getLocation().getEndOffset()); } /** diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/WithAttributesPath.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/WithAttributesPath.java index d12192033e..decefd3287 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/WithAttributesPath.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/attributes/WithAttributesPath.java @@ -122,7 +122,7 @@ public final class WithAttributesPath implements ILocateableNode, IIncrementally * @param timestamp * the timestamp of the actual semantic check cycle. */ - public void checkGlobalAttributes(final CompilationTimeStamp timestamp, final boolean erroneous_allowed) { + public void checkGlobalAttributes(final CompilationTimeStamp timestamp, final boolean erroneousAllowed) { if (lastTimeGlobalChecked != null && !lastTimeGlobalChecked.isLess(timestamp)) { return; } @@ -134,7 +134,7 @@ public final class WithAttributesPath implements ILocateableNode, IIncrementally } SingleWithAttribute tempAttribute; - if (!erroneous_allowed) { + if (!erroneousAllowed) { for (int i = 0, size = attributes.getNofElements(); i < size; i++) { tempAttribute = attributes.getAttribute(i); if (tempAttribute.getAttributeType() == Attribute_Type.Erroneous_Attribute) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Altstep.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Altstep.java index cb029c2d1e..239b9fd65e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Altstep.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Altstep.java @@ -62,17 +62,17 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig } private final FormalParameterList formalParList; - private final Reference runs_on_ref; + private final Reference runsOnRef; private Component_Type runsOnType = null; private final StatementBlock block; private final AltGuards altGuards; private NamedBridgeScope bridgeScope = null; - public Def_Altstep(final Identifier identifier, final FormalParameterList formalParameters, final Reference runs_on_ref, + public Def_Altstep(final Identifier identifier, final FormalParameterList formalParameters, final Reference runsOnRef, final StatementBlock block, final AltGuards altGuards) { super(identifier); this.formalParList = formalParameters; - this.runs_on_ref = runs_on_ref; + this.runsOnRef = runsOnRef; this.block = block; this.altGuards = altGuards; @@ -80,8 +80,8 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig formalParList.setMyDefinition(this); formalParList.setFullNameParent(this); } - if (runs_on_ref != null) { - runs_on_ref.setFullNameParent(this); + if (runsOnRef != null) { + runsOnRef.setFullNameParent(this); } if (block != null) { block.setMyDefinition(this); @@ -106,7 +106,7 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig if (formalParList == child) { return builder.append(FULLNAMEPART1); - } else if (runs_on_ref == child) { + } else if (runsOnRef == child) { return builder.append(FULLNAMEPART2); } else if (block == child) { return builder.append(FULLNAMEPART3); @@ -158,8 +158,8 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig bridgeScope.setScopeMacroName(identifier.getDisplayName()); super.setMyScope(bridgeScope); - if (runs_on_ref != null) { - runs_on_ref.setMyScope(bridgeScope); + if (runsOnRef != null) { + runsOnRef.setMyScope(bridgeScope); } formalParList.setMyScope(bridgeScope); if (block != null) { @@ -198,8 +198,8 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig T3Doc.check(this.getCommentLocation(), KIND); - if (runs_on_ref != null) { - runsOnType = runs_on_ref.chkComponentypeReference(timestamp); + if (runsOnRef != null) { + runsOnType = runsOnRef.chkComponentypeReference(timestamp); if (runsOnType != null) { Scope formalParlistPreviosScope = formalParList.getParentScope(); if (formalParlistPreviosScope instanceof RunsOnScope @@ -359,12 +359,10 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); @@ -372,7 +370,6 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig // damage handled if (result == 0) { enveloped = true; - reparser.moduleToBeReanalysed.addAll(referingHere); } else { removeBridge(); throw new ReParseException(result); @@ -388,7 +385,6 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig formalParList.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(formalParList.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -396,16 +392,15 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig } } - if (runs_on_ref != null) { + if (runsOnRef != null) { if (enveloped) { - runs_on_ref.updateSyntax(reparser, false); - reparser.updateLocation(runs_on_ref.getLocation()); - } else if (reparser.envelopsDamage(runs_on_ref.getLocation())) { + runsOnRef.updateSyntax(reparser, false); + reparser.updateLocation(runsOnRef.getLocation()); + } else if (reparser.envelopsDamage(runsOnRef.getLocation())) { try { - runs_on_ref.updateSyntax(reparser, true); + runsOnRef.updateSyntax(reparser, true); enveloped = true; - reparser.updateLocation(runs_on_ref.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); + reparser.updateLocation(runsOnRef.getLocation()); } catch (ReParseException e) { removeBridge(); throw e; @@ -454,7 +449,6 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig withAttributesPath.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(withAttributesPath.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -477,9 +471,9 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig reparser.updateLocation(formalParList.getLocation()); } - if (runs_on_ref != null) { - runs_on_ref.updateSyntax(reparser, false); - reparser.updateLocation(runs_on_ref.getLocation()); + if (runsOnRef != null) { + runsOnRef.updateSyntax(reparser, false); + reparser.updateLocation(runsOnRef.getLocation()); } if (block != null) { @@ -514,8 +508,8 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig if (formalParList != null) { formalParList.findReferences(referenceFinder, foundIdentifiers); } - if (runs_on_ref != null) { - runs_on_ref.findReferences(referenceFinder, foundIdentifiers); + if (runsOnRef != null) { + runsOnRef.findReferences(referenceFinder, foundIdentifiers); } if (block != null) { block.findReferences(referenceFinder, foundIdentifiers); @@ -533,7 +527,7 @@ public final class Def_Altstep extends Definition implements IParameterisedAssig if (formalParList != null && !formalParList.accept(v)) { return false; } - if (runs_on_ref != null && !runs_on_ref.accept(v)) { + if (runsOnRef != null && !runsOnRef.accept(v)) { return false; } if (block != null && !block.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Const.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Const.java index a9c00aa522..764674f74e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Const.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Const.java @@ -294,14 +294,10 @@ public final class Def_Const extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ExternalConst.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ExternalConst.java index bbb11b3d6f..8a8f4dc6e0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ExternalConst.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ExternalConst.java @@ -173,14 +173,10 @@ public final class Def_ExternalConst extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java index c7c09550c0..3a922169af 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java @@ -73,11 +73,11 @@ public final class Def_Extfunction extends Definition implements IParameterisedA private static final String KIND = "external function"; - private final Assignment_type assignment_type; + private final Assignment_type assignmentType; private final FormalParameterList formalParList; private final Type returnType; private final boolean returnsTemplate; - private final TemplateRestriction.Restriction_type template_restriction; + private final TemplateRestriction.Restriction_type templateRestriction; private EncodingPrototype_type prototype; private Type inputType; private Type outputType; @@ -88,15 +88,15 @@ public final class Def_Extfunction extends Definition implements IParameterisedA private PrintingType printingType; public Def_Extfunction(final Identifier identifier, final FormalParameterList formalParameters, final Type returnType, - final boolean returnsTemplate, final TemplateRestriction.Restriction_type template_restriction) { + final boolean returnsTemplate, final TemplateRestriction.Restriction_type templateRestriction) { super(identifier); - assignment_type = (returnType == null) ? Assignment_type.A_EXT_FUNCTION : (returnsTemplate ? Assignment_type.A_EXT_FUNCTION_RTEMP + assignmentType = (returnType == null) ? Assignment_type.A_EXT_FUNCTION : (returnsTemplate ? Assignment_type.A_EXT_FUNCTION_RTEMP : Assignment_type.A_EXT_FUNCTION_RVAL); formalParList = formalParameters; formalParList.setMyDefinition(this); this.returnType = returnType; this.returnsTemplate = returnsTemplate; - this.template_restriction = template_restriction; + this.templateRestriction = templateRestriction; prototype = EncodingPrototype_type.NONE; functionEncodingType = ExternalFunctionEncodingType_type.MANUAL; encodingType = Encoding_type.UNDEFINED; @@ -112,7 +112,7 @@ public final class Def_Extfunction extends Definition implements IParameterisedA @Override public Assignment_type getAssignmentType() { - return assignment_type; + return assignmentType; } @Override @@ -442,7 +442,7 @@ public final class Def_Extfunction extends Definition implements IParameterisedA location.reportSemanticError(MessageFormat.format( "The external function must have a return type for attribute `prototype({0})''", prototype.getName())); } else { - if (Assignment_type.A_FUNCTION_RTEMP.equals(assignment_type)) { + if (Assignment_type.A_FUNCTION_RTEMP.equals(assignmentType)) { returnType.getLocation() .reportSemanticError( MessageFormat.format( @@ -610,20 +610,16 @@ public final class Def_Extfunction extends Definition implements IParameterisedA @Override public TemplateRestriction.Restriction_type getTemplateRestriction() { - return template_restriction; + return templateRestriction; } @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java_ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java_ deleted file mode 100644 index 60709a3a6e..0000000000 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Extfunction.java_ +++ /dev/null @@ -1,720 +0,0 @@ -/****************************************************************************** - * Copyright (c) 2000-2014 Ericsson Telecom AB - * 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.titan.designer.AST.TTCN3.definitions; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.text.templates.Template; -import org.eclipse.titan.designer.AST.ASTVisitor; -import org.eclipse.titan.designer.AST.INamedNode; -import org.eclipse.titan.designer.AST.ISubReference; -import org.eclipse.titan.designer.AST.IType; -import org.eclipse.titan.designer.AST.Identifier; -import org.eclipse.titan.designer.AST.Location; -import org.eclipse.titan.designer.AST.NamingConventionHelper; -import org.eclipse.titan.designer.AST.ReferenceFinder; -import org.eclipse.titan.designer.AST.Scope; -import org.eclipse.titan.designer.AST.Type; -import org.eclipse.titan.designer.AST.ISubReference.Subreference_type; -import org.eclipse.titan.designer.AST.IType.Encoding_type; -import org.eclipse.titan.designer.AST.IType.Type_type; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; -import org.eclipse.titan.designer.AST.TTCN3.TemplateRestriction; -import org.eclipse.titan.designer.AST.TTCN3.attributes.AttributeSpecification; -import org.eclipse.titan.designer.AST.TTCN3.attributes.DecodeAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.EncodeAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.ErrorBehaviorAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.ErrorBehaviorList; -import org.eclipse.titan.designer.AST.TTCN3.attributes.ExtensionAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.PrintingAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.PrintingType; -import org.eclipse.titan.designer.AST.TTCN3.attributes.PrototypeAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.Qualifiers; -import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute; -import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute.Attribute_Type; -import org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Function.EncodingPrototype_type; -import org.eclipse.titan.designer.editors.DeclarationCollector; -import org.eclipse.titan.designer.editors.ProposalCollector; -import org.eclipse.titan.designer.editors.ttcn3editor.TTCN3CodeSkeletons; -import org.eclipse.titan.designer.parsers.CompilationTimeStamp; -import org.eclipse.titan.designer.parsers.ParserFactory; -import org.eclipse.titan.designer.parsers.extensionattributeparser.ExtensionAttributeAnalyzer; -import org.eclipse.titan.designer.parsers.ttcn3parser.IIdentifierReparser; -import org.eclipse.titan.designer.parsers.ttcn3parser.ReParseException; -import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; -import org.eclipse.titan.designer.preferences.PreferenceConstants; - -/** - * The Def_ExtFunction class represents TTCN3 external function definitions. - * - * @author Kristof Szabados - * */ -public final class Def_Extfunction extends Definition implements IParameterisedAssignment { - public enum ExternalFunctionEncodingType_type { - /** manual encoding. */ - MANUAL, - /** generated encoder function. */ - ENCODE, - /** generated decoder function. */ - DECODE - } - - private static final String FULLNAMEPART1 = ".<formal_parameter_list>"; - private static final String FULLNAMEPART2 = ".<type>"; - private static final String FULLNAMEPART3 = ".<errorbehavior_list>"; - public static final String PORTRETURNNOTALLOWED = "External functions can not return ports"; - - private static final String KIND = "external function"; - - private final Assignment_type assignment_type; - private final FormalParameterList formalParList; - private final Type returnType; - private final boolean returnsTemplate; - private final TemplateRestriction.Restriction_type template_restriction; - private EncodingPrototype_type prototype; - private Type inputType; - private Type outputType; - private ExternalFunctionEncodingType_type functionEncodingType; - private Encoding_type encodingType; - private String encodingOptions; - private ErrorBehaviorList errorBehaviorList; - private PrintingType printingType; - - public Def_Extfunction(final Identifier identifier, final FormalParameterList formalParameters, final Type returnType, - final boolean returnsTemplate, final TemplateRestriction.Restriction_type template_restriction) { - super(identifier); - assignment_type = (returnType == null) ? Assignment_type.A_EXT_FUNCTION : (returnsTemplate ? Assignment_type.A_EXT_FUNCTION_RTEMP - : Assignment_type.A_EXT_FUNCTION_RVAL); - formalParList = formalParameters; - formalParList.setMyDefinition(this); - this.returnType = returnType; - this.returnsTemplate = returnsTemplate; - this.template_restriction = template_restriction; - prototype = EncodingPrototype_type.NONE; - functionEncodingType = ExternalFunctionEncodingType_type.MANUAL; - encodingType = Encoding_type.UNDEFINED; - encodingOptions = null; - errorBehaviorList = null; - printingType = null; - - formalParList.setFullNameParent(this); - if (returnType != null) { - returnType.setFullNameParent(this); - } - } - - @Override - public Assignment_type getAssignmentType() { - return assignment_type; - } - - @Override - public StringBuilder getFullName(final INamedNode child) { - StringBuilder builder = super.getFullName(child); - - if (formalParList == child) { - return builder.append(FULLNAMEPART1); - } else if (returnType == child) { - return builder.append(FULLNAMEPART2); - } else if (errorBehaviorList == child) { - return builder.append(FULLNAMEPART3); - } - - return builder; - } - - @Override - public FormalParameterList getFormalParameterList() { - return formalParList; - } - - public EncodingPrototype_type getPrototype() { - return prototype; - } - - public Type getInputType() { - return inputType; - } - - public Type getOutputType() { - return outputType; - } - - @Override - public String getProposalKind() { - return KIND; - } - - @Override - public String getAssignmentName() { - return "external function"; - } - - @Override - public String getOutlineIcon() { - if (returnType == null) { - return "function_external.gif"; - } - - return "function_external_return.gif"; - } - - @Override - public void setMyScope(final Scope scope) { - super.setMyScope(scope); - - formalParList.setMyScope(scope); - if (returnType != null) { - returnType.setMyScope(scope); - } - scope.addSubScope(formalParList.getLocation(), formalParList); - } - - @Override - public Type getType(final CompilationTimeStamp timestamp) { - check(timestamp); - - return returnType; - } - - @Override - public void check(final CompilationTimeStamp timestamp) { - if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { - return; - } - - isUsed = false; - prototype = EncodingPrototype_type.NONE; - functionEncodingType = ExternalFunctionEncodingType_type.MANUAL; - encodingType = Encoding_type.UNDEFINED; - encodingOptions = null; - errorBehaviorList = null; - printingType = null; - lastTimeChecked = timestamp; - - NamingConventionHelper.checkConvention(PreferenceConstants.REPORTNAMINGCONVENTION_EXTERNALFUNCTION, identifier, this); - NamingConventionHelper.checkNameContents(identifier, getMyScope().getModuleScope().getIdentifier(), getDescription()); - - if (returnType != null) { - returnType.check(timestamp); - IType returnedType = returnType.getTypeRefdLast(timestamp); - if (returnedType != null && Type_type.TYPE_PORT.equals(returnedType.getTypetype()) && returnType.getLocation() != null) { - returnType.getLocation().reportSemanticError(PORTRETURNNOTALLOWED); - } - } - - formalParList.reset(); - formalParList.check(timestamp, getAssignmentType()); - - if (withAttributesPath != null) { - withAttributesPath.checkGlobalAttributes(timestamp, false); - withAttributesPath.checkAttributes(timestamp); - analyzeExtensionAttributes(timestamp); - checkPrototype(timestamp); - checkFunctionType(timestamp); - } - } - - @Override - public void postCheck() { - super.postCheck(); - postCheckPrivateness(); - } - - /** - * Convert and check the encoding attributes applied to this external - * function. - * - * @param timestamp - * the timestamp of the actual build cycle. - * */ - public void analyzeExtensionAttributes(final CompilationTimeStamp timestamp) { - List<SingleWithAttribute> realAttributes = withAttributesPath.getRealAttributes(timestamp); - - SingleWithAttribute attribute; - List<AttributeSpecification> specifications = null; - for (int i = 0, size = realAttributes.size(); i < size; i++) { - attribute = realAttributes.get(i); - if (Attribute_Type.Extension_Attribute.equals(attribute.getAttributeType())) { - Qualifiers qualifiers = attribute.getQualifiers(); - if (qualifiers == null || qualifiers.getNofQualifiers() == 0) { - if (specifications == null) { - specifications = new ArrayList<AttributeSpecification>(); - } - specifications.add(attribute.getAttributeSpecification()); - } - } - } - - if (specifications == null) { - return; - } - - List<ExtensionAttribute> attributes = new ArrayList<ExtensionAttribute>(); - AttributeSpecification specification; - for (int i = 0, size = specifications.size(); i < size; i++) { - specification = specifications.get(i); - ExtensionAttributeAnalyzer analyzer = new ExtensionAttributeAnalyzer(); - analyzer.parse(specification); - List<ExtensionAttribute> temp = analyzer.getAttributes(); - if (temp != null) { - attributes.addAll(temp); - } - } - - ExtensionAttribute extensionAttribute; - for (int i = 0, size = attributes.size(); i < size; i++) { - extensionAttribute = attributes.get(i); - - switch (extensionAttribute.getAttributeType()) { - case PROTOTYPE: - if (EncodingPrototype_type.NONE.equals(prototype)) { - prototype = ((PrototypeAttribute) extensionAttribute).getPrototypeType(); - } else { - location.reportSemanticError("duplicate attribute `prototype'."); - } - break; - case ENCODE: - switch (functionEncodingType) { - case MANUAL: - break; - case ENCODE: - location.reportSemanticError("duplicate attribute `encode'."); - break; - case DECODE: - location.reportSemanticError("`decode' and `encode' attributes cannot be used at the same time."); - break; - default: - break; - } - encodingType = ((EncodeAttribute) extensionAttribute).getEncodingType(); - encodingOptions = ((EncodeAttribute) extensionAttribute).getOptions(); - functionEncodingType = ExternalFunctionEncodingType_type.ENCODE; - break; - case DECODE: - switch (functionEncodingType) { - case MANUAL: - break; - case ENCODE: - location.reportSemanticError("`decode' and `encode' attributes cannot be used at the same time."); - break; - case DECODE: - location.reportSemanticError("duplicate attribute `decode'."); - break; - default: - break; - } - encodingType = ((DecodeAttribute) extensionAttribute).getEncodingType(); - encodingOptions = ((DecodeAttribute) extensionAttribute).getOptions(); - functionEncodingType = ExternalFunctionEncodingType_type.DECODE; - break; - case ERRORBEHAVIOR: - if (errorBehaviorList == null) { - errorBehaviorList = ((ErrorBehaviorAttribute) extensionAttribute).getErrrorBehaviorList(); - } else { - errorBehaviorList.addAllBehaviors(((ErrorBehaviorAttribute) extensionAttribute).getErrrorBehaviorList()); - } - break; - case PRINTING: - if (printingType == null) { - printingType = ((PrintingAttribute) extensionAttribute).getPrintingType(); - } else { - location.reportSemanticError("duplicate attribute `printing'."); - } - break; - default: - break; - } - } - } - - /** - * Checks the prototype attribute set for this external function - * definition. - * - * @param timestamp - * the timestamp of the actual semantic check cycle. - * */ - private void checkPrototype(final CompilationTimeStamp timestamp) { - if (EncodingPrototype_type.NONE.equals(prototype)) { - return; - } - - // checking formal parameter list - if (EncodingPrototype_type.CONVERT.equals(prototype)) { - if (formalParList.getNofParameters() == 1) { - FormalParameter parameter = formalParList.getParameterByIndex(0); - switch (parameter.getRealAssignmentType()) { - case A_PAR_VAL: - case A_PAR_VAL_IN: - inputType = parameter.getType(timestamp); - break; - default: { - final String message = MessageFormat - .format("The parameter must be an `in'' value parameter for attribute `prototype({0})'' instead of {1}", - prototype.getName(), parameter.getAssignmentName()); - parameter.getLocation().reportSemanticError(message); - break; - } - } - } else { - final String message = MessageFormat.format( - "The external function must have one parameter instead of {0} for attribute `prototype({1})''", - formalParList.getNofParameters(), prototype.getName()); - formalParList.getLocation().reportSemanticError(message); - } - } else if (formalParList.getNofParameters() == 2) { - FormalParameter firstParameter = formalParList.getParameterByIndex(0); - if (EncodingPrototype_type.SLIDING.equals(prototype)) { - if (Assignment_type.A_PAR_VAL_INOUT.equals(firstParameter.getRealAssignmentType())) { - Type firstParameterType = firstParameter.getType(timestamp); - IType last = firstParameterType.getTypeRefdLast(timestamp); - if (last.getIsErroneous(timestamp)) { - inputType = firstParameterType; - } else { - switch (last.getTypetypeTtcn3()) { - case TYPE_OCTETSTRING: - case TYPE_CHARSTRING: - inputType = firstParameterType; - break; - default: { - final String message = MessageFormat - .format("The type of the first parameter must be `octetstring'' or `charstring'' for attribute `prototype({0})''", - prototype.getName()); - firstParameter.getLocation().reportSemanticError(message); - - break; - } - } - } - } else { - firstParameter.getLocation() - .reportSemanticError( - MessageFormat.format( - "The first parameter must be an `inout'' value parameter for attribute `prototype({0})'' instead of {1}", - prototype.getName(), firstParameter.getAssignmentName())); - } - } else { - if (Assignment_type.A_PAR_VAL_IN.equals(firstParameter.getRealAssignmentType())) { - inputType = firstParameter.getType(timestamp); - } else { - firstParameter.getLocation() - .reportSemanticError( - MessageFormat.format( - "The first parameter must be an `in'' value parameter for attribute `prototype({0})'' instead of {1}", - prototype.getName(), firstParameter.getAssignmentName())); - } - } - - FormalParameter secondParameter = formalParList.getParameterByIndex(1); - if (Assignment_type.A_PAR_VAL_OUT.equals(secondParameter.getRealAssignmentType())) { - outputType = secondParameter.getType(timestamp); - } else { - secondParameter.getLocation() - .reportSemanticError( - MessageFormat.format( - "The second parameter must be an `out'' value parameter for attribute `prototype({0})'' instead of {1}", - prototype.getName(), secondParameter.getAssignmentName())); - } - } else { - formalParList.getLocation().reportSemanticError( - MessageFormat.format("The function must have two parameters for attribute `prototype({0})'' instead of {1}", - prototype.getName(), formalParList.getNofParameters())); - } - - // checking the return type - if (EncodingPrototype_type.FAST.equals(prototype)) { - if (returnType != null) { - returnType.getLocation().reportSemanticError( - MessageFormat.format("The external function cannot have return type fo attribute `prototype({0})''", - prototype.getName())); - } - } else { - if (returnType == null) { - location.reportSemanticError(MessageFormat.format( - "The external function must have a return type for attribute `prototype({0})''", prototype.getName())); - } else { - if (Assignment_type.A_FUNCTION_RTEMP.equals(assignment_type)) { - returnType.getLocation() - .reportSemanticError( - MessageFormat.format( - "The external function must return a value instead of a template for attribute `prototype({0})''", - prototype.getName())); - } - - if (EncodingPrototype_type.CONVERT.equals(prototype)) { - outputType = returnType; - } else { - IType last = returnType.getTypeRefdLast(timestamp); - - if (!last.getIsErroneous(timestamp) && !Type_type.TYPE_INTEGER.equals(last.getTypetypeTtcn3())) { - returnType.getLocation() - .reportSemanticError( - MessageFormat.format( - "The return type of the function must be `integer'' instead of `{0}'' for attribute `prototype({1})''", - returnType.getTypename(), prototype.getName())); - } - } - } - } - } - - /** - * Checks that the encoding/decoding attributes set for this external - * function definition are valid according to the encoding/decoding type - * of the function. - * - * @param timestamp - * the timestamp of the actual semantic check cycle. - * */ - public void checkFunctionType(final CompilationTimeStamp timestamp) { - switch (functionEncodingType) { - case MANUAL: - if (errorBehaviorList != null) { - errorBehaviorList.getLocation().reportSemanticError( - "Attribute `errorbehavior' can only be used together with `encode' or `decode'"); - errorBehaviorList.check(timestamp); - } - break; - case ENCODE: - switch (prototype) { - case NONE: - location.reportSemanticError("Attribute `encode' cannot be used without `prototype'"); - break; - case BACKTRACK: - case SLIDING: - location.reportSemanticError(MessageFormat.format("Attribute `encode'' cannot be used without `prototype({0})''", - prototype.getName())); - break; - default: - break; - } - // FIXME implement once we know what encoding is set for - // a type - if (errorBehaviorList != null) { - errorBehaviorList.check(timestamp); - } - if (printingType != null) { - printingType.check(timestamp); - } - break; - case DECODE: - if (EncodingPrototype_type.NONE.equals(prototype)) { - location.reportSemanticError("Attribute `decode' cannot be used without `prototype'"); - } - // FIXME implement once we know what encoding is set for - // a type - if (errorBehaviorList != null) { - errorBehaviorList.check(timestamp); - } - break; - default: - // no other option possible - break; - } - - if (printingType != null && (functionEncodingType != ExternalFunctionEncodingType_type.ENCODE || - encodingType != Encoding_type.JSON)) { - location.reportSemanticError("Attribute `printing' is only allowed for JSON encoding functions"); - } - } - - @Override - public String getProposalDescription() { - StringBuilder nameBuilder = new StringBuilder(identifier.getDisplayName()); - nameBuilder.append('('); - formalParList.getAsProposalDesriptionPart(nameBuilder); - nameBuilder.append(')'); - return nameBuilder.toString(); - } - - @Override - public void addProposal(final ProposalCollector propCollector, final int i) { - List<ISubReference> subrefs = propCollector.getReference().getSubreferences(); - if (subrefs.size() <= i || Subreference_type.arraySubReference.equals(subrefs.get(i).getReferenceType())) { - return; - } - - if (subrefs.size() == i + 1 && identifier.getName().toLowerCase().startsWith(subrefs.get(i).getId().getName().toLowerCase())) { - StringBuilder patternBuilder = new StringBuilder(identifier.getDisplayName()); - patternBuilder.append('('); - formalParList.getAsProposalPart(patternBuilder); - patternBuilder.append(')'); - propCollector.addTemplateProposal(identifier.getDisplayName(), - new Template(getProposalDescription(), "", propCollector.getContextIdentifier(), patternBuilder.toString(), - false), TTCN3CodeSkeletons.SKELETON_IMAGE); - super.addProposal(propCollector, i); - } else if (subrefs.size() > i + 1 && returnType != null - && Subreference_type.parameterisedSubReference.equals(subrefs.get(i).getReferenceType()) - && identifier.getName().equals(subrefs.get(i).getId().getName())) { - // perfect match - returnType.addProposal(propCollector, i + 1); - } - } - - @Override - public void addDeclaration(final DeclarationCollector declarationCollector, final int i) { - List<ISubReference> subrefs = declarationCollector.getReference().getSubreferences(); - if (subrefs.size() <= i || Subreference_type.arraySubReference.equals(subrefs.get(i).getReferenceType())) { - return; - } - - if (identifier.getName().equals(subrefs.get(0).getId().getName())) { - if (subrefs.size() > i + 1 && returnType != null) { - returnType.addDeclaration(declarationCollector, i + 1); - } else { - declarationCollector.addDeclaration(this); - } - } - } - - @Override - public String getOutlineText() { - if (lastTimeChecked == null) { - check(CompilationTimeStamp.getBaseTimestamp()); - } - - StringBuilder text = new StringBuilder(identifier.getDisplayName()); - if (formalParList == null) { - return text.toString(); - } - - text.append('('); - for (int i = 0; i < formalParList.getNofParameters(); i++) { - if (i != 0) { - text.append(", "); - } - FormalParameter parameter = formalParList.getParameterByIndex(i); - if (Assignment_type.A_PAR_TIMER.equals(parameter.getRealAssignmentType())) { - text.append("timer"); - } else { - IType type = parameter.getType(lastTimeChecked); - if (type == null) { - text.append("Unknown type"); - } else { - text.append(type.getTypename()); - } - } - } - text.append(')'); - return text.toString(); - } - - @Override - public TemplateRestriction.Restriction_type getTemplateRestriction() { - return template_restriction; - } - - @Override - public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { - if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - - boolean enveloped = false; - - Location temporalIdentifier = identifier.getLocation(); - if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; - reparser.extendDamagedRegion(temporalIdentifier); - IIdentifierReparser r = ParserFactory.createIdentifierReparser(reparser); - int result = r.parseAndSetNameChanged(); - identifier = r.getIdentifier(); - // damage handled - if (result == 0) { - enveloped = true; - } else { - throw new ReParseException(result); - } - } - - if (formalParList != null) { - if (enveloped) { - formalParList.updateSyntax(reparser, false); - reparser.updateLocation(formalParList.getLocation()); - } else if (reparser.envelopsDamage(formalParList.getLocation())) { - formalParList.updateSyntax(reparser, true); - enveloped = true; - reparser.updateLocation(formalParList.getLocation()); - } - } - - if (returnType != null) { - if (enveloped) { - returnType.updateSyntax(reparser, false); - reparser.updateLocation(returnType.getLocation()); - } else if (reparser.envelopsDamage(returnType.getLocation())) { - returnType.updateSyntax(reparser, true); - enveloped = true; - reparser.updateLocation(returnType.getLocation()); - } - } - - if (withAttributesPath != null) { - if (enveloped) { - withAttributesPath.updateSyntax(reparser, false); - reparser.updateLocation(withAttributesPath.getLocation()); - } else if (reparser.envelopsDamage(withAttributesPath.getLocation())) { - withAttributesPath.updateSyntax(reparser, true); - enveloped = true; - reparser.updateLocation(withAttributesPath.getLocation()); - } - } - - if (!enveloped) { - throw new ReParseException(); - } - - return; - } - - reparser.updateLocation(identifier.getLocation()); - - if (formalParList != null) { - formalParList.updateSyntax(reparser, false); - reparser.updateLocation(formalParList.getLocation()); - } - - if (returnType != null) { - returnType.updateSyntax(reparser, false); - reparser.updateLocation(returnType.getLocation()); - } - - if (withAttributesPath != null) { - withAttributesPath.updateSyntax(reparser, false); - reparser.updateLocation(withAttributesPath.getLocation()); - } - } - - @Override - public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - super.findReferences(referenceFinder, foundIdentifiers); - if (formalParList != null) { - formalParList.findReferences(referenceFinder, foundIdentifiers); - } - if (returnType != null) { - returnType.findReferences(referenceFinder, foundIdentifiers); - } - } - - @Override - protected boolean memberAccept(ASTVisitor v) { - if (!super.memberAccept(v)) { - return false; - } - if (formalParList != null && !formalParList.accept(v)) { - return false; - } - if (returnType != null && !returnType.accept(v)) { - return false; - } - return true; - } -} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java index 8c3b30db2f..1590da847a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java @@ -102,13 +102,13 @@ public final class Def_Function extends Definition implements IParameterisedAssi return KIND; } - private final Assignment_type assignment_type; + private final Assignment_type assignmentType; private final FormalParameterList formalParList; - private final Reference runs_on_ref; + private final Reference runsOnRef; private Component_Type runsOnType = null; private final Type returnType; private final boolean returnsTemplate; - private final TemplateRestriction.Restriction_type template_restriction; + private final TemplateRestriction.Restriction_type templateRestriction; private final StatementBlock block; private EncodingPrototype_type prototype; private Type inputType; @@ -118,21 +118,21 @@ public final class Def_Function extends Definition implements IParameterisedAssi private boolean isStartable; private NamedBridgeScope bridgeScope = null; - public Def_Function(final Identifier identifier, final FormalParameterList formalParameters, final Reference runs_on_ref, - final Type returnType, final boolean returnsTemplate, final TemplateRestriction.Restriction_type template_restriction, + public Def_Function(final Identifier identifier, final FormalParameterList formalParameters, final Reference runsOnRef, + final Type returnType, final boolean returnsTemplate, final TemplateRestriction.Restriction_type templateRestriction, final StatementBlock block) { super(identifier); - assignment_type = (returnType == null) ? Assignment_type.A_FUNCTION : (returnsTemplate ? Assignment_type.A_FUNCTION_RTEMP + assignmentType = (returnType == null) ? Assignment_type.A_FUNCTION : (returnsTemplate ? Assignment_type.A_FUNCTION_RTEMP : Assignment_type.A_FUNCTION_RVAL); this.formalParList = formalParameters; if (formalParList != null) { formalParList.setMyDefinition(this); formalParList.setFullNameParent(this); } - this.runs_on_ref = runs_on_ref; + this.runsOnRef = runsOnRef; this.returnType = returnType; this.returnsTemplate = returnsTemplate; - this.template_restriction = template_restriction; + this.templateRestriction = templateRestriction; this.block = block; this.prototype = EncodingPrototype_type.NONE; @@ -143,8 +143,8 @@ public final class Def_Function extends Definition implements IParameterisedAssi block.setMyDefinition(this); block.setFullNameParent(this); } - if (runs_on_ref != null) { - runs_on_ref.setFullNameParent(this); + if (runsOnRef != null) { + runsOnRef.setFullNameParent(this); } if (returnType != null) { returnType.setFullNameParent(this); @@ -157,14 +157,14 @@ public final class Def_Function extends Definition implements IParameterisedAssi @Override public Assignment_type getAssignmentType() { - return assignment_type; + return assignmentType; } @Override public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (runs_on_ref == child) { + if (runsOnRef == child) { return builder.append(FULLNAMEPART1); } else if (formalParList == child) { return builder.append(FULLNAMEPART2); @@ -234,8 +234,8 @@ public final class Def_Function extends Definition implements IParameterisedAssi bridgeScope.setScopeMacroName(identifier.getDisplayName()); super.setMyScope(bridgeScope); - if (runs_on_ref != null) { - runs_on_ref.setMyScope(bridgeScope); + if (runsOnRef != null) { + runsOnRef.setMyScope(bridgeScope); } formalParList.setMyScope(bridgeScope); if (returnType != null) { @@ -276,8 +276,8 @@ public final class Def_Function extends Definition implements IParameterisedAssi lastTimeChecked = timestamp; isStartable = false; - if (runs_on_ref != null) { - runsOnType = runs_on_ref.chkComponentypeReference(timestamp); + if (runsOnRef != null) { + runsOnType = runsOnRef.chkComponentypeReference(timestamp); if (runsOnType != null) { Scope formalParlistPreviosScope = formalParList.getParentScope(); if (formalParlistPreviosScope instanceof RunsOnScope @@ -320,7 +320,7 @@ public final class Def_Function extends Definition implements IParameterisedAssi } // decision of startability - isStartable = runs_on_ref != null; + isStartable = runsOnRef != null; isStartable &= formalParList.getStartability(); if (isStartable && returnType != null && returnType.isComponentInternal(timestamp)) { isStartable = false; @@ -389,7 +389,7 @@ public final class Def_Function extends Definition implements IParameterisedAssi return true; } - if (runs_on_ref == null) { + if (runsOnRef == null) { errorLocation.reportSemanticError(MessageFormat.format( "Function `{0}'' cannot be started on parallel test component because it does not have a `runs on'' clause", getFullName())); @@ -563,7 +563,7 @@ public final class Def_Function extends Definition implements IParameterisedAssi location.reportSemanticError(MessageFormat.format( "The function must have a return type for attribute `prototype({0})''", prototype.getName())); } else { - if (Assignment_type.A_FUNCTION_RTEMP.equals(assignment_type)) { + if (Assignment_type.A_FUNCTION_RTEMP.equals(assignmentType)) { returnType.getLocation() .reportSemanticError( MessageFormat.format( @@ -588,8 +588,8 @@ public final class Def_Function extends Definition implements IParameterisedAssi } // checking the runs on clause - if (runsOnType != null && runs_on_ref != null) { - runs_on_ref.getLocation().reportSemanticError( + if (runsOnType != null && runsOnRef != null) { + runsOnRef.getLocation().reportSemanticError( MessageFormat.format("The function cannot have `runs on'' clause for attribute `prototype({0})''", prototype.getName())); } @@ -686,19 +686,16 @@ public final class Def_Function extends Definition implements IParameterisedAssi @Override public TemplateRestriction.Restriction_type getTemplateRestriction() { - return template_restriction; + return templateRestriction; } @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); @@ -706,7 +703,6 @@ public final class Def_Function extends Definition implements IParameterisedAssi // damage handled if (result == 0) { enveloped = true; - reparser.moduleToBeReanalysed.addAll(referingHere); } else { removeBridge(); throw new ReParseException(result); @@ -722,7 +718,6 @@ public final class Def_Function extends Definition implements IParameterisedAssi formalParList.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(formalParList.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -730,16 +725,15 @@ public final class Def_Function extends Definition implements IParameterisedAssi } } - if (runs_on_ref != null) { + if (runsOnRef != null) { if (enveloped) { - runs_on_ref.updateSyntax(reparser, false); - reparser.updateLocation(runs_on_ref.getLocation()); - } else if (reparser.envelopsDamage(runs_on_ref.getLocation())) { + runsOnRef.updateSyntax(reparser, false); + reparser.updateLocation(runsOnRef.getLocation()); + } else if (reparser.envelopsDamage(runsOnRef.getLocation())) { try { - runs_on_ref.updateSyntax(reparser, true); + runsOnRef.updateSyntax(reparser, true); enveloped = true; - reparser.updateLocation(runs_on_ref.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); + reparser.updateLocation(runsOnRef.getLocation()); } catch (ReParseException e) { removeBridge(); throw e; @@ -756,7 +750,6 @@ public final class Def_Function extends Definition implements IParameterisedAssi returnType.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(returnType.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -789,7 +782,6 @@ public final class Def_Function extends Definition implements IParameterisedAssi withAttributesPath.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(withAttributesPath.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -812,9 +804,9 @@ public final class Def_Function extends Definition implements IParameterisedAssi reparser.updateLocation(formalParList.getLocation()); } - if (runs_on_ref != null) { - runs_on_ref.updateSyntax(reparser, false); - reparser.updateLocation(runs_on_ref.getLocation()); + if (runsOnRef != null) { + runsOnRef.updateSyntax(reparser, false); + reparser.updateLocation(runsOnRef.getLocation()); } if (returnType != null) { @@ -852,8 +844,8 @@ public final class Def_Function extends Definition implements IParameterisedAssi if (returnType != null) { returnType.findReferences(referenceFinder, foundIdentifiers); } - if (runs_on_ref != null) { - runs_on_ref.findReferences(referenceFinder, foundIdentifiers); + if (runsOnRef != null) { + runsOnRef.findReferences(referenceFinder, foundIdentifiers); } if (block != null) { block.findReferences(referenceFinder, foundIdentifiers); @@ -871,7 +863,7 @@ public final class Def_Function extends Definition implements IParameterisedAssi if (returnType != null && !returnType.accept(v)) { return false; } - if (runs_on_ref != null && !runs_on_ref.accept(v)) { + if (runsOnRef != null && !runsOnRef.accept(v)) { return false; } if (block != null && !block.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar.java index 429f89828a..2f7e3792ac 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar.java @@ -56,18 +56,18 @@ public final class Def_ModulePar extends Definition { } private final Type type; - private final Value default_value; + private final Value defaultValue; - public Def_ModulePar(final Identifier identifier, final Type type, final Value default_value) { + public Def_ModulePar(final Identifier identifier, final Type type, final Value defaultValue) { super(identifier); this.type = type; - this.default_value = default_value; + this.defaultValue = defaultValue; if (type != null) { type.setFullNameParent(this); } - if (default_value != null) { - default_value.setFullNameParent(this); + if (defaultValue != null) { + defaultValue.setFullNameParent(this); } } @@ -77,7 +77,7 @@ public final class Def_ModulePar extends Definition { } public Value getDefaultValue() { - return default_value; + return defaultValue; } @@ -87,7 +87,7 @@ public final class Def_ModulePar extends Definition { if (type == child) { return builder.append(FULLNAMEPART1); - } else if (default_value == child) { + } else if (defaultValue == child) { return builder.append(FULLNAMEPART2); } @@ -100,8 +100,8 @@ public final class Def_ModulePar extends Definition { if (type != null) { type.setMyScope(scope); } - if (default_value != null) { - default_value.setMyScope(scope); + if (defaultValue != null) { + defaultValue.setMyScope(scope); } } @@ -175,9 +175,9 @@ public final class Def_ModulePar extends Definition { break; } - if (default_value != null) { - default_value.setMyGovernor(type); - IValue temporalValue = type.checkThisValueRef(timestamp, default_value); + if (defaultValue != null) { + defaultValue.setMyGovernor(type); + IValue temporalValue = type.checkThisValueRef(timestamp, defaultValue); type.checkThisValue(timestamp, temporalValue, new ValueCheckingOptions(Expected_Value_type.EXPECTED_CONSTANT, true, false, true, hasImplicitOmitAttribute(timestamp), false)); } @@ -238,12 +238,10 @@ public final class Def_ModulePar extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); @@ -251,7 +249,6 @@ public final class Def_ModulePar extends Definition { // damage handled if (result == 0) { enveloped = true; - reparser.moduleToBeReanalysed.addAll(referingHere); } else { throw new ReParseException(result); } @@ -265,18 +262,17 @@ public final class Def_ModulePar extends Definition { type.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(type.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } } - if (default_value != null) { + if (defaultValue != null) { if (enveloped) { - default_value.updateSyntax(reparser, false); - reparser.updateLocation(default_value.getLocation()); - } else if (reparser.envelopsDamage(default_value.getLocation())) { - default_value.updateSyntax(reparser, true); + defaultValue.updateSyntax(reparser, false); + reparser.updateLocation(defaultValue.getLocation()); + } else if (reparser.envelopsDamage(defaultValue.getLocation())) { + defaultValue.updateSyntax(reparser, true); enveloped = true; - reparser.updateLocation(default_value.getLocation()); + reparser.updateLocation(defaultValue.getLocation()); } } @@ -288,7 +284,6 @@ public final class Def_ModulePar extends Definition { withAttributesPath.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(withAttributesPath.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } } @@ -306,9 +301,9 @@ public final class Def_ModulePar extends Definition { reparser.updateLocation(type.getLocation()); } - if (default_value != null) { - default_value.updateSyntax(reparser, false); - reparser.updateLocation(default_value.getLocation()); + if (defaultValue != null) { + defaultValue.updateSyntax(reparser, false); + reparser.updateLocation(defaultValue.getLocation()); } if (withAttributesPath != null) { @@ -323,8 +318,8 @@ public final class Def_ModulePar extends Definition { if (type != null) { type.findReferences(referenceFinder, foundIdentifiers); } - if (default_value != null) { - default_value.findReferences(referenceFinder, foundIdentifiers); + if (defaultValue != null) { + defaultValue.findReferences(referenceFinder, foundIdentifiers); } } @@ -336,7 +331,7 @@ public final class Def_ModulePar extends Definition { if (type != null && !type.accept(v)) { return false; } - if (default_value != null && !default_value.accept(v)) { + if (defaultValue != null && !defaultValue.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar_Template.java index c4481d19bf..e3545172c4 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_ModulePar_Template.java @@ -54,15 +54,15 @@ public final class Def_ModulePar_Template extends Definition { private final TTCN3Template defaultTemplate; private ITTCN3Template realTemplate; - public Def_ModulePar_Template(final Identifier identifier, final Type type, final TTCN3Template default_template) { + public Def_ModulePar_Template(final Identifier identifier, final Type type, final TTCN3Template defaultTemplate) { super(identifier); this.type = type; - this.defaultTemplate = default_template; + this.defaultTemplate = defaultTemplate; if (type != null) { type.setFullNameParent(this); } - if (default_template != null) { - default_template.setFullNameParent(this); + if (defaultTemplate != null) { + defaultTemplate.setFullNameParent(this); } } @@ -246,12 +246,10 @@ public final class Def_ModulePar_Template extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); @@ -259,7 +257,6 @@ public final class Def_ModulePar_Template extends Definition { // damage handled if (result == 0) { enveloped = true; - reparser.moduleToBeReanalysed.addAll(referingHere); } else { throw new ReParseException(result); } @@ -273,7 +270,6 @@ public final class Def_ModulePar_Template extends Definition { type.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(type.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } } @@ -296,7 +292,6 @@ public final class Def_ModulePar_Template extends Definition { withAttributesPath.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(withAttributesPath.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Port.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Port.java index af7e30752f..198ad06caa 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Port.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Port.java @@ -254,14 +254,10 @@ public final class Def_Port extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Template.java index 609fe74378..c7a0cba482 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Template.java @@ -83,7 +83,7 @@ public final class Def_Template extends Definition implements IParameterisedAssi private final Type type; - private final TemplateRestriction.Restriction_type template_restriction; + private final TemplateRestriction.Restriction_type templateRestriction; /** * The formal parameter list. Can be null, in that case this template is @@ -115,13 +115,13 @@ public final class Def_Template extends Definition implements IParameterisedAssi private CompilationTimeStamp recursiveDerivationChecked; private NamedBridgeScope bridgeScope = null; - public Def_Template(final TemplateRestriction.Restriction_type template_restriction, final Identifier identifier, final Type type, - final FormalParameterList formalParList, final Reference derived_reference, final TTCN3Template body) { + public Def_Template(final TemplateRestriction.Restriction_type templateRestriction, final Identifier identifier, final Type type, + final FormalParameterList formalParList, final Reference derivedReference, final TTCN3Template body) { super(identifier); - this.template_restriction = template_restriction; + this.templateRestriction = templateRestriction; this.type = type; this.formalParList = formalParList; - this.derivedReference = derived_reference; + this.derivedReference = derivedReference; this.body = body; if (type != null) { @@ -130,8 +130,8 @@ public final class Def_Template extends Definition implements IParameterisedAssi if (formalParList != null) { formalParList.setMyDefinition(this); } - if (derived_reference != null) { - derived_reference.setFullNameParent(this); + if (derivedReference != null) { + derivedReference.setFullNameParent(this); } if (body != null) { body.setFullNameParent(this); @@ -375,9 +375,9 @@ public final class Def_Template extends Definition implements IParameterisedAssi tempBody.checkRecursions(timestamp, tempReferenceChain); tempReferenceChain.release(); - if (template_restriction != TemplateRestriction.Restriction_type.TR_NONE) { + if (templateRestriction != TemplateRestriction.Restriction_type.TR_NONE) { TemplateRestriction.check(timestamp, this, tempBody, null); - if (formalParList != null && template_restriction != TemplateRestriction.Restriction_type.TR_PRESENT) { + if (formalParList != null && templateRestriction != TemplateRestriction.Restriction_type.TR_PRESENT) { int nofFps = formalParList.getNofParameters(); for (int i = 0; i < nofFps; i++) { FormalParameter fp = formalParList.getParameterByIndex(i); @@ -389,7 +389,7 @@ public final class Def_Template extends Definition implements IParameterisedAssi continue; } TemplateRestriction.Restriction_type fpTemplateRestriction = fp.getTemplateRestriction(); - switch (template_restriction) { + switch (templateRestriction) { case TR_VALUE: case TR_OMIT: switch (fpTemplateRestriction) { @@ -633,20 +633,16 @@ public final class Def_Template extends Definition implements IParameterisedAssi @Override public TemplateRestriction.Restriction_type getTemplateRestriction() { - return template_restriction; + return templateRestriction; } @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Testcase.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Testcase.java index ca84db01ab..5b4ba852c5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Testcase.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Testcase.java @@ -67,15 +67,15 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi private final StatementBlock block; private NamedBridgeScope bridgeScope = null; - public Def_Testcase(final Identifier identifier, final FormalParameterList formalParameters, final Reference runs_on_ref, - final Reference system_ref, final StatementBlock block) { + public Def_Testcase(final Identifier identifier, final FormalParameterList formalParameters, final Reference runsOnRef, + final Reference systemRef, final StatementBlock block) { super(identifier); this.formalParList = formalParameters; if (formalParList != null) { formalParList.setMyDefinition(this); } - this.runsOnReference = runs_on_ref; - this.systemReference = system_ref; + this.runsOnReference = runsOnRef; + this.systemReference = systemRef; this.block = block; if (block != null) { block.setMyDefinition(this); @@ -85,11 +85,11 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi if (formalParList != null) { formalParList.setFullNameParent(this); } - if (runs_on_ref != null) { - runs_on_ref.setFullNameParent(this); + if (runsOnRef != null) { + runsOnRef.setFullNameParent(this); } - if (system_ref != null) { - system_ref.setFullNameParent(this); + if (systemRef != null) { + systemRef.setFullNameParent(this); } } @@ -344,14 +344,11 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; int result = 1; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); result = r.parseAndSetNameChanged(); @@ -359,7 +356,6 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi // damage handled if (result == 0) { enveloped = true; - reparser.moduleToBeReanalysed.addAll(referingHere); } else { removeBridge(); throw new ReParseException(result); @@ -375,7 +371,6 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi formalParList.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(formalParList.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -392,7 +387,6 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi runsOnReference.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(runsOnReference.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -409,7 +403,6 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi systemReference.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(systemReference.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; @@ -442,7 +435,6 @@ public final class Def_Testcase extends Definition implements IParameterisedAssi withAttributesPath.updateSyntax(reparser, true); enveloped = true; reparser.updateLocation(withAttributesPath.getLocation()); - reparser.moduleToBeReanalysed.addAll(referingHere); } catch (ReParseException e) { removeBridge(); throw e; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Timer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Timer.java index c0f3ac8288..25a61e6f2d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Timer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Timer.java @@ -58,18 +58,18 @@ public final class Def_Timer extends Definition { private static final String KIND = "timer"; private final ArrayDimensions dimensions; - private final Value default_duration; + private final Value defaultDuration; - public Def_Timer(final Identifier identifier, final ArrayDimensions dimensions, final Value default_duration) { + public Def_Timer(final Identifier identifier, final ArrayDimensions dimensions, final Value defaultDuration) { super(identifier); this.dimensions = dimensions; - this.default_duration = default_duration; + this.defaultDuration = defaultDuration; if (dimensions != null) { dimensions.setFullNameParent(this); } - if (default_duration != null) { - default_duration.setFullNameParent(this); + if (defaultDuration != null) { + defaultDuration.setFullNameParent(this); } } @@ -84,8 +84,8 @@ public final class Def_Timer extends Definition { if (dimensions != null) { dimensions.setMyScope(scope); } - if (default_duration != null) { - default_duration.setMyScope(scope); + if (defaultDuration != null) { + defaultDuration.setMyScope(scope); } } @@ -95,7 +95,7 @@ public final class Def_Timer extends Definition { if (dimensions == child) { return builder.append(FULLNAMEPART1); - } else if (default_duration == child) { + } else if (defaultDuration == child) { return builder.append(FULLNAMEPART2); } @@ -149,13 +149,13 @@ public final class Def_Timer extends Definition { * @return true if the timer has a default duration, false otherwise. * */ public boolean hasDefaultDuration(final CompilationTimeStamp timestamp, final Reference reference) { - if (default_duration == null) { + if (defaultDuration == null) { return false; } else if (dimensions == null || reference == null) { return true; } - IValue v = default_duration; + IValue v = defaultDuration; List<ISubReference> subreferences = reference.getSubreferences(); int nofDimensions = dimensions.size(); int nofReferences = subreferences.size() - 1; @@ -203,25 +203,25 @@ public final class Def_Timer extends Definition { dimensions.check(timestamp); } - if (default_duration != null) { + if (defaultDuration != null) { if (dimensions == null) { - default_duration.setLoweridToReference(timestamp); - Type_type tempType = default_duration.getExpressionReturntype(timestamp, + defaultDuration.setLoweridToReference(timestamp); + Type_type tempType = defaultDuration.getExpressionReturntype(timestamp, isLocal() ? Expected_Value_type.EXPECTED_DYNAMIC_VALUE : Expected_Value_type.EXPECTED_STATIC_VALUE); switch (tempType) { case TYPE_REAL: - IValue last = default_duration.getValueRefdLast(timestamp, null); + IValue last = defaultDuration.getValueRefdLast(timestamp, null); if (!last.isUnfoldable(timestamp)) { Real_Value real = (Real_Value) last; double value = real.getValue(); if (value < 0.0f) { - default_duration.getLocation().reportSemanticError( + defaultDuration.getLocation().reportSemanticError( MessageFormat.format(NEGATIVDURATIONERROR, value)); } else if (real.isPositiveInfinity()) { final String message = MessageFormat.format(INFINITYDURATIONERROR, real.createStringRepresentation()); - default_duration.getLocation() + defaultDuration.getLocation() .reportSemanticError(message ); } @@ -233,7 +233,7 @@ public final class Def_Timer extends Definition { location.reportSemanticError(OPERANDERROR); } } else { - checkArrayDuration(default_duration, 0); + checkArrayDuration(defaultDuration, 0); } } @@ -245,7 +245,7 @@ public final class Def_Timer extends Definition { lastTimeChecked = timestamp; } - private void checkArrayDuration(final IValue duration, final int start_dimension) { + private void checkArrayDuration(final IValue duration, final int startDimension) { // FIXME implement support for dimension handling } @@ -283,22 +283,22 @@ public final class Def_Timer extends Definition { return false; } - if (default_duration != null) { - if (otherTimer.default_duration != null) { - if (!default_duration.isUnfoldable(timestamp) && !otherTimer.default_duration.isUnfoldable(timestamp) - && !default_duration.checkEquality(timestamp, otherTimer.default_duration)) { + if (defaultDuration != null) { + if (otherTimer.defaultDuration != null) { + if (!defaultDuration.isUnfoldable(timestamp) && !otherTimer.defaultDuration.isUnfoldable(timestamp) + && !defaultDuration.checkEquality(timestamp, otherTimer.defaultDuration)) { final String message = MessageFormat .format("Local timer `{0}'' and the timer inherited from component type `{1}'' have different default durations", identifier.getDisplayName(), otherTimer.getMyScope().getFullName()); - default_duration.getLocation().reportSemanticWarning(message); + defaultDuration.getLocation().reportSemanticWarning(message); } } else { final String message = MessageFormat .format("Local timer `{0}'' has default duration, but the timer inherited from component type `{1}'' does not", identifier.getDisplayName(), otherTimer.getMyScope().getFullName()); - default_duration.getLocation().reportSemanticWarning(message); + defaultDuration.getLocation().reportSemanticWarning(message); } - } else if (otherTimer.default_duration != null) { + } else if (otherTimer.defaultDuration != null) { location.reportSemanticWarning(MessageFormat.format( "Local timer `{0}'' does not have default duration, but the timer inherited from component type `{1}'' has", identifier.getDisplayName(), otherTimer.getMyScope().getFullName())); @@ -337,13 +337,9 @@ public final class Def_Timer extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - int result = 1; Location tempIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(tempIdentifier) || reparser.isExtending(tempIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(tempIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); result = r.parseAndSetNameChanged(); @@ -356,9 +352,9 @@ public final class Def_Timer extends Definition { dimensions.updateSyntax(reparser, false); } - if (default_duration != null) { - default_duration.updateSyntax(reparser, false); - reparser.updateLocation(default_duration.getLocation()); + if (defaultDuration != null) { + defaultDuration.updateSyntax(reparser, false); + reparser.updateLocation(defaultDuration.getLocation()); } if (withAttributesPath != null) { @@ -377,9 +373,9 @@ public final class Def_Timer extends Definition { dimensions.updateSyntax(reparser, false); } - if (default_duration != null) { - default_duration.updateSyntax(reparser, false); - reparser.updateLocation(default_duration.getLocation()); + if (defaultDuration != null) { + defaultDuration.updateSyntax(reparser, false); + reparser.updateLocation(defaultDuration.getLocation()); } if (withAttributesPath != null) { @@ -394,8 +390,8 @@ public final class Def_Timer extends Definition { if (dimensions != null) { dimensions.findReferences(referenceFinder, foundIdentifiers); } - if (default_duration != null) { - default_duration.findReferences(referenceFinder, foundIdentifiers); + if (defaultDuration != null) { + defaultDuration.findReferences(referenceFinder, foundIdentifiers); } } @@ -407,7 +403,7 @@ public final class Def_Timer extends Definition { if (dimensions != null && !dimensions.accept(v)) { return false; } - if (default_duration != null && !default_duration.accept(v)) { + if (defaultDuration != null && !defaultDuration.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Type.java index a456d41deb..925ecb4e67 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Type.java @@ -367,13 +367,10 @@ public final class Def_Type extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var.java index e8df06e5f8..0b0121d447 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var.java @@ -55,20 +55,20 @@ public final class Def_Var extends Definition { private static final String KIND = " variable definition"; private final Type type; - private final Value initial_value; + private final Value initialValue; private boolean wasAssigned; - public Def_Var(final Identifier identifier, final Type type, final Value initial_value) { + public Def_Var(final Identifier identifier, final Type type, final Value initialValue) { super(identifier); this.type = type; - this.initial_value = initial_value; + this.initialValue = initialValue; if (type != null) { type.setFullNameParent(this); } - if (initial_value != null) { - initial_value.setFullNameParent(this); + if (initialValue != null) { + initialValue.setFullNameParent(this); } } @@ -83,7 +83,7 @@ public final class Def_Var extends Definition { if (type == child) { return builder.append(FULLNAMEPART1); - } else if (initial_value == child) { + } else if (initialValue == child) { return builder.append(FULLNAMEPART2); } @@ -96,8 +96,8 @@ public final class Def_Var extends Definition { if (type != null) { type.setMyScope(scope); } - if (initial_value != null) { - initial_value.setMyScope(scope); + if (initialValue != null) { + initialValue.setMyScope(scope); } } @@ -143,7 +143,7 @@ public final class Def_Var extends Definition { } public Value getInitialValue() { - return initial_value; + return initialValue; } @Override @@ -192,9 +192,9 @@ public final class Def_Var extends Definition { break; } - if (initial_value != null) { - initial_value.setMyGovernor(type); - IValue temporalValue = type.checkThisValueRef(timestamp, initial_value); + if (initialValue != null) { + initialValue.setMyGovernor(type); + IValue temporalValue = type.checkThisValueRef(timestamp, initialValue); if (isLocal()) { type.checkThisValue(timestamp, temporalValue, new ValueCheckingOptions(Expected_Value_type.EXPECTED_DYNAMIC_VALUE, true, false, true, false, false)); @@ -209,7 +209,7 @@ public final class Def_Var extends Definition { public void postCheck() { super.postCheck(); if (!wasAssigned) { - if (initial_value != null && !initial_value.getIsErroneous(lastTimeChecked) && !initial_value.isUnfoldable(lastTimeChecked)) { + if (initialValue != null && !initialValue.getIsErroneous(lastTimeChecked) && !initialValue.isUnfoldable(lastTimeChecked)) { final String message = MessageFormat.format("The {0} seems to be never written, maybe it could be a constant", getDescription()); final String option = Platform.getPreferencesService().getString(ProductConstants.PRODUCT_ID_DESIGNER, @@ -249,23 +249,23 @@ public final class Def_Var extends Definition { return false; } - if (initial_value != null) { - if (otherVariable.initial_value != null) { - if (!initial_value.isUnfoldable(timestamp) && !otherVariable.initial_value.isUnfoldable(timestamp) - && !initial_value.checkEquality(timestamp, otherVariable.initial_value)) { + if (initialValue != null) { + if (otherVariable.initialValue != null) { + if (!initialValue.isUnfoldable(timestamp) && !otherVariable.initialValue.isUnfoldable(timestamp) + && !initialValue.checkEquality(timestamp, otherVariable.initialValue)) { final String message = MessageFormat .format("Local variable `{0}'' and the variable inherited from component type `{1}'' have different values", identifier.getDisplayName(), otherVariable.getMyScope().getFullName()); - initial_value.getLocation().reportSemanticWarning(message); + initialValue.getLocation().reportSemanticWarning(message); } } else { - initial_value.getLocation() + initialValue.getLocation() .reportSemanticWarning( MessageFormat.format( "Local variable `{0}'' has initial value, but the variable inherited from component type `{1}'' does not", identifier.getDisplayName(), otherVariable.getMyScope().getFullName())); } - } else if (otherVariable.initial_value != null) { + } else if (otherVariable.initialValue != null) { location.reportSemanticWarning(MessageFormat .format("Local variable `{0}'' does not have initial value, but the variable inherited from component type `{1}'' has", identifier.getDisplayName(), otherVariable.getMyScope().getFullName())); @@ -314,15 +314,11 @@ public final class Def_Var extends Definition { @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; int result = 1; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); result = r.parseAndSetNameChanged(); @@ -346,14 +342,14 @@ public final class Def_Var extends Definition { } } - if (initial_value != null) { + if (initialValue != null) { if (enveloped) { - initial_value.updateSyntax(reparser, false); - reparser.updateLocation(initial_value.getLocation()); - } else if (reparser.envelopsDamage(initial_value.getLocation())) { - initial_value.updateSyntax(reparser, true); + initialValue.updateSyntax(reparser, false); + reparser.updateLocation(initialValue.getLocation()); + } else if (reparser.envelopsDamage(initialValue.getLocation())) { + initialValue.updateSyntax(reparser, true); enveloped = true; - reparser.updateLocation(initial_value.getLocation()); + reparser.updateLocation(initialValue.getLocation()); } } @@ -370,9 +366,9 @@ public final class Def_Var extends Definition { reparser.updateLocation(type.getLocation()); } - if (initial_value != null) { - initial_value.updateSyntax(reparser, false); - reparser.updateLocation(initial_value.getLocation()); + if (initialValue != null) { + initialValue.updateSyntax(reparser, false); + reparser.updateLocation(initialValue.getLocation()); } } @@ -382,8 +378,8 @@ public final class Def_Var extends Definition { if (type != null) { type.findReferences(referenceFinder, foundIdentifiers); } - if (initial_value != null) { - initial_value.findReferences(referenceFinder, foundIdentifiers); + if (initialValue != null) { + initialValue.findReferences(referenceFinder, foundIdentifiers); } } @@ -395,7 +391,7 @@ public final class Def_Var extends Definition { if (type != null && !type.accept(v)) { return false; } - if (initial_value != null && !initial_value.accept(v)) { + if (initialValue != null && !initialValue.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var_Template.java index 237236f387..4abb908709 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Var_Template.java @@ -51,23 +51,23 @@ public final class Def_Var_Template extends Definition { private static final String KIND = " template variable definition"; private final Type type; - private final TTCN3Template initial_value; - private final TemplateRestriction.Restriction_type template_restriction; + private final TTCN3Template initialValue; + private final TemplateRestriction.Restriction_type templateRestriction; private boolean wasAssigned; - public Def_Var_Template(final TemplateRestriction.Restriction_type template_restriction, final Identifier identifier, final Type type, - final TTCN3Template initial_value) { + public Def_Var_Template(final TemplateRestriction.Restriction_type templateRestriction, final Identifier identifier, final Type type, + final TTCN3Template initialValue) { super(identifier); - this.template_restriction = template_restriction; + this.templateRestriction = templateRestriction; this.type = type; - this.initial_value = initial_value; + this.initialValue = initialValue; if (type != null) { type.setFullNameParent(this); } - if (initial_value != null) { - initial_value.setFullNameParent(this); + if (initialValue != null) { + initialValue.setFullNameParent(this); } } @@ -82,7 +82,7 @@ public final class Def_Var_Template extends Definition { if (type == child) { return builder.append(FULLNAMEPART1); - } else if (initial_value == child) { + } else if (initialValue == child) { return builder.append(FULLNAMEPART2); } @@ -129,8 +129,8 @@ public final class Def_Var_Template extends Definition { if (type != null) { type.setMyScope(scope); } - if (initial_value != null) { - initial_value.setMyScope(scope); + if (initialValue != null) { + initialValue.setMyScope(scope); } } @@ -161,7 +161,7 @@ public final class Def_Var_Template extends Definition { type.check(timestamp); lastTimeChecked = timestamp; - if (initial_value == null) { + if (initialValue == null) { return; } @@ -174,20 +174,20 @@ public final class Def_Var_Template extends Definition { break; } - TTCN3Template realInitialValue = initial_value; + TTCN3Template realInitialValue = initialValue; - initial_value.setMyGovernor(type); + initialValue.setMyGovernor(type); // Needed in case of universal charstring templates - if (initial_value.getTemplatetype() == Template_type.CSTR_PATTERN && lastType.getTypetype() == Type.Type_type.TYPE_UCHARSTRING) { - realInitialValue = initial_value.setTemplatetype(timestamp, Template_type.USTR_PATTERN); + if (initialValue.getTemplatetype() == Template_type.CSTR_PATTERN && lastType.getTypetype() == Type.Type_type.TYPE_UCHARSTRING) { + realInitialValue = initialValue.setTemplatetype(timestamp, Template_type.USTR_PATTERN); // FIXME implement setting the pattern type, once // universal charstring pattern are supported. } ITTCN3Template temporalValue = type.checkThisTemplateRef(timestamp, realInitialValue); temporalValue.checkThisTemplateGeneric(timestamp, type, true, true, true, true, false); - TemplateRestriction.check(timestamp, this, initial_value, null); + TemplateRestriction.check(timestamp, this, initialValue, null); // Only to follow the pattern, otherwise no such field can exist // here @@ -209,7 +209,7 @@ public final class Def_Var_Template extends Definition { } public TTCN3Template getInitialValue() { - return initial_value; + return initialValue; } /** @@ -243,15 +243,15 @@ public final class Def_Var_Template extends Definition { return false; } - if (initial_value != null) { - if (otherVariable.initial_value == null) { - initial_value.getLocation() + if (initialValue != null) { + if (otherVariable.initialValue == null) { + initialValue.getLocation() .reportSemanticWarning( MessageFormat.format( "Local template variable `{0}'' has initial value, but the template variable inherited from component type `{1}'' does not", identifier.getDisplayName(), otherVariable.getMyScope().getFullName())); } - } else if (otherVariable.initial_value != null) { + } else if (otherVariable.initialValue != null) { location.reportSemanticWarning(MessageFormat .format("Local template variable `{0}'' does not have initial value, but the template variable inherited from component type `{1}'' has", identifier.getDisplayName(), otherVariable.getMyScope().getFullName())); @@ -300,20 +300,16 @@ public final class Def_Var_Template extends Definition { @Override public TemplateRestriction.Restriction_type getTemplateRestriction() { - return template_restriction; + return templateRestriction; } @Override public void updateSyntax(final TTCN3ReparseUpdater reparser, final boolean isDamaged) throws ReParseException { if (isDamaged) { - reparser.moduleToBeReanalysed.addAll(referingHere); - reparser.moduleToBeReanalysed.add(getMyScope().getModuleScope().getName()); - boolean enveloped = false; Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parseAndSetNameChanged(); @@ -337,14 +333,14 @@ public final class Def_Var_Template extends Definition { } } - if (initial_value != null) { + if (initialValue != null) { if (enveloped) { - initial_value.updateSyntax(reparser, false); - reparser.updateLocation(initial_value.getLocation()); - } else if (reparser.envelopsDamage(initial_value.getLocation())) { - initial_value.updateSyntax(reparser, true); + initialValue.updateSyntax(reparser, false); + reparser.updateLocation(initialValue.getLocation()); + } else if (reparser.envelopsDamage(initialValue.getLocation())) { + initialValue.updateSyntax(reparser, true); enveloped = true; - reparser.updateLocation(initial_value.getLocation()); + reparser.updateLocation(initialValue.getLocation()); } } @@ -372,9 +368,9 @@ public final class Def_Var_Template extends Definition { reparser.updateLocation(type.getLocation()); } - if (initial_value != null) { - initial_value.updateSyntax(reparser, false); - reparser.updateLocation(initial_value.getLocation()); + if (initialValue != null) { + initialValue.updateSyntax(reparser, false); + reparser.updateLocation(initialValue.getLocation()); } if (withAttributesPath != null) { @@ -389,8 +385,8 @@ public final class Def_Var_Template extends Definition { if (type != null) { type.findReferences(referenceFinder, foundIdentifiers); } - if (initial_value != null) { - initial_value.findReferences(referenceFinder, foundIdentifiers); + if (initialValue != null) { + initialValue.findReferences(referenceFinder, foundIdentifiers); } } @@ -402,7 +398,7 @@ public final class Def_Var_Template extends Definition { if (type != null && !type.accept(v)) { return false; } - if (initial_value != null && !initial_value.accept(v)) { + if (initialValue != null && !initialValue.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Default_ActualParameter.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Default_ActualParameter.java index 5e853dd053..4cffb5e1da 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Default_ActualParameter.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Default_ActualParameter.java @@ -22,10 +22,10 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; * */ public final class Default_ActualParameter extends ActualParameter { // generated value - private final ActualParameter default_actualParameter; + private final ActualParameter defaultActualParameter; - public Default_ActualParameter(final ActualParameter default_actualParameter) { - this.default_actualParameter = default_actualParameter; + public Default_ActualParameter(final ActualParameter defaultActualParameter) { + this.defaultActualParameter = defaultActualParameter; } @Override @@ -34,14 +34,14 @@ public final class Default_ActualParameter extends ActualParameter { } public ActualParameter getActualParameter() { - return default_actualParameter; + return defaultActualParameter; } @Override public void checkRecursions(final CompilationTimeStamp timestamp, final IReferenceChain referenceChain) { - if (default_actualParameter != null) { + if (defaultActualParameter != null) { referenceChain.markState(); - default_actualParameter.checkRecursions(timestamp, referenceChain); + defaultActualParameter.checkRecursions(timestamp, referenceChain); referenceChain.previousState(); } } @@ -55,8 +55,8 @@ public final class Default_ActualParameter extends ActualParameter { @Override protected boolean memberAccept(ASTVisitor v) { - if (default_actualParameter != null) { - if (!default_actualParameter.accept(v)) { + if (defaultActualParameter != null) { + if (!defaultActualParameter.accept(v)) { return false; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definition.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definition.java index a3ecd05ca6..c7975bef51 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definition.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definition.java @@ -32,7 +32,6 @@ import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.FieldSubReference; -import org.eclipse.titan.designer.AST.IReferencingElement; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Location; @@ -56,7 +55,6 @@ import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute; import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute.Attribute_Type; import org.eclipse.titan.designer.AST.TTCN3.attributes.WithAttributesPath; import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; -import org.eclipse.titan.designer.declarationsearch.Declaration; import org.eclipse.titan.designer.editors.DeclarationCollector; import org.eclipse.titan.designer.editors.ProposalCollector; import org.eclipse.titan.designer.graphics.ImageCache; @@ -75,7 +73,7 @@ import org.eclipse.titan.designer.productUtilities.ProductConstants; * * @author Kristof Szabados * */ -public abstract class Definition extends Assignment implements IAppendableSyntax, IIncrementallyUpdateable, IReferencingElement { +public abstract class Definition extends Assignment implements IAppendableSyntax, IIncrementallyUpdateable { private static final String SHOULD_BE_PRIVATE = "{0} is referenced only locally, it should be private"; protected WithAttributesPath withAttributesPath = null; @@ -86,6 +84,7 @@ public abstract class Definition extends Assignment implements IAppendableSyntax private Location commentLocation = null; + //TODO this should be removed as the same functionality is present in Titanium as codesmell. public List<String> referingHere = new ArrayList<String>(); private static boolean markOccurrences; @@ -323,42 +322,6 @@ public abstract class Definition extends Assignment implements IAppendableSyntax typeArray = new ArrayList<IType>(); boolean validIndexes = definitionType.getSubrefsAsArray(timestamp, reference, 1, subrefsArray, typeArray); - /* - * // debug - * stuff - * StringBuilder - * sb = new - * StringBuilder - * (); - * sb.append( - * '['); for - * (IType t: - * type_array) { - * if - * (sb.length( - * )>1) - * sb.append - * (','); - * sb.append - * (t.get_typename - * ()); } - * sb.append - * (']'); - * actual_qualifier - * . - * getLocation() - * . - * reportSemanticWarning - * ( - * "subrefs_array = " - * + - * subrefs_array - * .toString()+ - * " type_array = " - * + - * sb.toString() - * ); - */ if (!validIndexes) { fieldType = null; subrefsArray = null; @@ -582,11 +545,6 @@ public abstract class Definition extends Assignment implements IAppendableSyntax public boolean shouldMarkOccurrences() { return markOccurrences; } - - @Override - public Declaration getDeclaration() { - return Declaration.createInstance(this); - } private static ErroneousAttributeSpecification parseErrAttrSpecString(final AttributeSpecification aAttrSpec) { ErroneousAttributeSpecification returnValue = null; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java index 1be26c961c..87fe8385b5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Definitions.java @@ -23,7 +23,6 @@ import org.eclipse.titan.designer.AST.Assignments; import org.eclipse.titan.designer.AST.ILocateableNode; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IOutlineElement; -import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Module; @@ -368,6 +367,30 @@ public final class Definitions extends Assignments implements ILocateableNode { LoadBalancingUtilities.astNodeChecked(); } } + + /** + * Experimental method for BrokenPartsViaInvertedImports. + */ + public void checkWithDefinitions(final CompilationTimeStamp timestamp, final List<Assignment> assignments) { + if (lastCompilationTimeStamp != null && !lastCompilationTimeStamp.isLess(timestamp)) { + return; + } + + checkUniqueness(timestamp); + checkGroups(timestamp); + + lastCompilationTimeStamp = timestamp; + + for (Iterator<Assignment> iterator = assignments.iterator(); iterator.hasNext();) { + Assignment assignmentFrom = iterator.next(); + if(definitionMap.containsKey(assignmentFrom.getIdentifier().getName())) { + assignmentFrom.check(timestamp); + LoadBalancingUtilities.astNodeChecked(); + } + } + + } + @Override public void postCheck() { @@ -437,21 +460,8 @@ public final class Definitions extends Assignments implements ILocateableNode { @Override public void addProposal(final ProposalCollector propCollector) { if (propCollector.getReference().getModuleIdentifier() == null) { - // ToDo:code completition does not work most of the time - // it would be needed HQ66225 - // test implementation - if (lastCompilationTimeStamp != null) { - IType preType = null; - for (Iterator<Definition> iterator = definitions.iterator(); iterator.hasNext();) { - iterator.next().addProposal(propCollector, 0); - IType type = definitions.get(0).getType(lastCompilationTimeStamp); - if (type != null) { - if (type != preType) { - type.addProposal(propCollector, 0); - preType = type; - } - } - } + for (Iterator<Definition> iterator = definitions.iterator(); iterator.hasNext();) { + iterator.next().addProposal(propCollector, 0); } } super.addProposal(propCollector); @@ -777,7 +787,8 @@ public final class Definitions extends Assignments implements ILocateableNode { Location tempLocation = temp.getLocation(); if (reparser.isAffected(tempLocation)) { try { - temp.updateSyntax(reparser, enveloped && reparser.envelopsDamage(tempLocation)); + boolean isDamaged = enveloped && reparser.envelopsDamage(tempLocation); + temp.updateSyntax(reparser, isDamaged); if (reparser.getNameChanged()) { if (doubleDefinitions != null) { doubleDefinitions.clear(); @@ -785,6 +796,9 @@ public final class Definitions extends Assignments implements ILocateableNode { lastUniquenessCheckTimeStamp = null; reparser.setNameChanged(false); } + if(isDamaged) { + temp.resetLastTimeChecked(); + } } catch (ReParseException e) { if (e.getDepth() == 1) { enveloped = false; @@ -892,9 +906,6 @@ public final class Definitions extends Assignments implements ILocateableNode { localImports, allFriends, localFriends, controlParts); if ( parser.isErrorListEmpty() ) { - if (!allDefinitions.isEmpty()) { - aReparser.fullAnalysysNeeded = true; - } addDefinitions(allDefinitions); if (doubleDefinitions != null) { doubleDefinitions.clear(); @@ -902,21 +913,17 @@ public final class Definitions extends Assignments implements ILocateableNode { lastUniquenessCheckTimeStamp = null; for (ImportModule impmod : allImports) { - aReparser.fullAnalysysNeeded = true; module.addImportedModule(impmod); } for (Group group : localGroups) { - aReparser.fullAnalysysNeeded = true; addGroup(group); } for (FriendModule friend : allFriends) { - aReparser.fullAnalysysNeeded = true; module.addFriendModule(friend); } if (controlParts != null && controlParts.size() == 1) { - aReparser.fullAnalysysNeeded = true; ((TTCN3Module) parentScope).addControlpart(controlParts.get(0)); } } @@ -941,7 +948,6 @@ public final class Definitions extends Assignments implements ILocateableNode { for (int i = groups.size() - 1; i >= 0; i--) { Group temp = groups.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); groups.remove(i); } @@ -950,7 +956,6 @@ public final class Definitions extends Assignments implements ILocateableNode { for (int i = importedModules.size() - 1; i >= 0; i--) { ImportModule temp = importedModules.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); importedModules.remove(i); } @@ -959,7 +964,6 @@ public final class Definitions extends Assignments implements ILocateableNode { for (int i = friendModules.size() - 1; i >= 0; i--) { FriendModule temp = friendModules.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); friendModules.remove(i); } @@ -968,8 +972,6 @@ public final class Definitions extends Assignments implements ILocateableNode { for (Iterator<Definition> iterator = definitions.iterator(); iterator.hasNext();) { Definition temp = iterator.next(); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; - reparser.moduleToBeReanalysed.addAll(temp.referingHere); reparser.extendDamagedRegion(temp.getLocation()); definitions.remove(temp); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/FormalParameter.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/FormalParameter.java index 03f393b67b..ba7fd9820d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/FormalParameter.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/FormalParameter.java @@ -91,14 +91,14 @@ public final class FormalParameter extends Definition { private boolean wasAssigned; - public FormalParameter(final TemplateRestriction.Restriction_type template_restriction, final Assignment_type assignmentType, + public FormalParameter(final TemplateRestriction.Restriction_type templateRestriction, final Assignment_type assignmentType, final Type type, final Identifier identifier, final TemplateInstance defaultValue, final boolean isLazy) { super(identifier); this.assignmentType = assignmentType; realAssignmentType = assignmentType; this.type = type; this.defaultValue = defaultValue; - this.templateRestriction = template_restriction; + this.templateRestriction = templateRestriction; this.isLazy = isLazy; if (type != null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Group.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Group.java index 62d57f3192..a113e49ca4 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Group.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Group.java @@ -772,7 +772,15 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable tempLocation = temp.getLocation(); if (reparser.isAffected(tempLocation)) { try { - temp.updateSyntax(reparser, enveloped && reparser.envelopsDamage(tempLocation)); + boolean isDamaged = enveloped && reparser.envelopsDamage(tempLocation); + temp.updateSyntax(reparser, isDamaged); + if (reparser.getNameChanged()) { + lastUniquenessCheckTimeStamp = null; + reparser.setNameChanged(false); + } + if(isDamaged) { + temp.resetLastTimeChecked(); + } } catch (ReParseException e) { if (e.getDepth() == 1) { enveloped = false; @@ -841,7 +849,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable } if (!enveloped && reparser.envelopsDamage(innerLocation)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(leftBoundary, rightBoundary); result = reparseModuleDefinitionsList( reparser ); } @@ -872,7 +879,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = groups.size() - 1; i >= 0; i--) { Group temp = groups.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); groups.remove(i); } @@ -881,7 +887,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = importedModules.size() - 1; i >= 0; i--) { ImportModule temp = importedModules.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); importedModules.remove(i); } @@ -890,7 +895,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = allImportedModules.size() - 1; i >= 0; i--) { ImportModule temp = allImportedModules.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); allImportedModules.remove(i); } @@ -899,7 +903,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = friendModules.size() - 1; i >= 0; i--) { FriendModule temp = friendModules.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); friendModules.remove(i); } @@ -908,7 +911,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = allFriends.size() - 1; i >= 0; i--) { FriendModule temp = allFriends.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temp.getLocation()); allFriends.remove(i); } @@ -917,7 +919,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (int i = definitions.size() - 1; i >= 0; i--) { Definition temp = definitions.get(i); if (reparser.isDamaged(temp.getLocation())) { - reparser.moduleToBeReanalysed.addAll(temp.referingHere); reparser.extendDamagedRegion(temp.getLocation()); definitions.remove(i); } @@ -926,7 +927,6 @@ public final class Group extends ASTNode implements IOutlineElement, ILocateable for (Iterator<Definition> iterator = allDefinitions.iterator(); iterator.hasNext();) { Definition temp = iterator.next(); if (reparser.isDamaged(temp.getLocation())) { - reparser.moduleToBeReanalysed.addAll(temp.referingHere); reparser.extendDamagedRegion(temp.getLocation()); allDefinitions.remove(temp); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/ImportModule.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/ImportModule.java index 4ea8aeaeb8..3d3490f820 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/ImportModule.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/ImportModule.java @@ -517,18 +517,18 @@ public final class ImportModule extends ModuleImportation implements ILocateable propCollector.addProposal(identifier, ImageCache.getImage(getOutlineIcon()), KIND); } - final Module savedReferedModule = referredModule; - if (savedReferedModule != null) { - Assignments assignments = savedReferedModule.getAssignments(); + final Module savedReferredModule = referredModule; + if (savedReferredModule != null) { + Assignments assignments = savedReferredModule.getAssignments(); for (int i = 0, size = assignments.getNofAssignments(); i < size; i++) { Assignment temporalAssignment = assignments.getAssignmentByIndex(i); - if (savedReferedModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { + if (savedReferredModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { temporalAssignment.addProposal(propCollector, 0); } } - if (savedReferedModule instanceof TTCN3Module) { - final TTCN3Module ttcnmodule = (TTCN3Module) savedReferedModule; + if (savedReferredModule instanceof TTCN3Module) { + final TTCN3Module ttcnmodule = (TTCN3Module) savedReferredModule; final List<ImportModule> imports = ttcnmodule.getImports(); for (ImportModule importation : imports) { if (importation.getVisibilityModifier() == VisibilityModifier.Public) { @@ -546,18 +546,18 @@ public final class ImportModule extends ModuleImportation implements ILocateable @Override public void addDeclaration(final DeclarationCollector declarationCollector, final Identifier targetModuleId) { - final Module savedReferedModule = referredModule; - if (savedReferedModule != null) { - Assignments assignments = savedReferedModule.getAssignments(); + final Module savedReferredModule = referredModule; + if (savedReferredModule != null) { + Assignments assignments = savedReferredModule.getAssignments(); for (int i = 0; i < assignments.getNofAssignments(); i++) { Assignment temporalAssignment = assignments.getAssignmentByIndex(i); - if (savedReferedModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { + if (savedReferredModule.isVisible(CompilationTimeStamp.getBaseTimestamp(), targetModuleId, temporalAssignment)) { temporalAssignment.addDeclaration(declarationCollector, 0); } } - if (savedReferedModule instanceof TTCN3Module) { - final TTCN3Module ttcnmodule = (TTCN3Module) savedReferedModule; + if (savedReferredModule instanceof TTCN3Module) { + final TTCN3Module ttcnmodule = (TTCN3Module) savedReferredModule; final List<ImportModule> imports = ttcnmodule.getImports(); for (ImportModule importation : imports) { if (importation.getVisibilityModifier() == VisibilityModifier.Public) { @@ -575,7 +575,7 @@ public final class ImportModule extends ModuleImportation implements ILocateable Identifier moduleId = declarationCollector.getReference().getModuleIdentifier(); List<ISubReference> subrefs = declarationCollector.getReference().getSubreferences(); if (moduleId == null && subrefs.size() == 1 && identifier.getName().equals(subrefs.get(0).getId().getName())) { - declarationCollector.addDeclaration(savedReferedModule.getIdentifier().getDisplayName(), savedReferedModule + declarationCollector.addDeclaration(savedReferredModule.getIdentifier().getDisplayName(), savedReferredModule .getIdentifier().getLocation(), (Assignment) null); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/TTCN3Module.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/TTCN3Module.java index b962336534..4d6f9e62ab 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/TTCN3Module.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/TTCN3Module.java @@ -22,11 +22,14 @@ import org.eclipse.titan.common.product.ProductIdentity; import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Assignment.Assignment_type; import org.eclipse.titan.designer.AST.Assignments; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.ISubReference; import org.eclipse.titan.designer.AST.IType; +import org.eclipse.titan.designer.AST.IType.Type_type; import org.eclipse.titan.designer.AST.Identifier; +import org.eclipse.titan.designer.AST.Identifier.Identifier_type; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.ModuleImportation; @@ -34,12 +37,9 @@ import org.eclipse.titan.designer.AST.ModuleImportationChain; import org.eclipse.titan.designer.AST.NamingConventionHelper; import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Type; -import org.eclipse.titan.designer.AST.Assignment.Assignment_type; -import org.eclipse.titan.designer.AST.IType.Type_type; -import org.eclipse.titan.designer.AST.Identifier.Identifier_type; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.attributes.AnytypeAttribute; import org.eclipse.titan.designer.AST.TTCN3.attributes.AttributeSpecification; import org.eclipse.titan.designer.AST.TTCN3.attributes.ExtensionAttribute; @@ -47,12 +47,10 @@ import org.eclipse.titan.designer.AST.TTCN3.attributes.ModuleVersionAttribute; import org.eclipse.titan.designer.AST.TTCN3.attributes.MultipleWithAttributes; import org.eclipse.titan.designer.AST.TTCN3.attributes.Qualifiers; import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute; +import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute.Attribute_Type; import org.eclipse.titan.designer.AST.TTCN3.attributes.TitanVersionAttribute; import org.eclipse.titan.designer.AST.TTCN3.attributes.VersionRequirementAttribute; import org.eclipse.titan.designer.AST.TTCN3.attributes.WithAttributesPath; -import org.eclipse.titan.designer.AST.TTCN3.attributes.SingleWithAttribute.Attribute_Type; -import org.eclipse.titan.designer.AST.TTCN3.statements.Map_Statement; -import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; import org.eclipse.titan.designer.AST.TTCN3.types.Anytype_Type; import org.eclipse.titan.designer.AST.TTCN3.types.CompField; import org.eclipse.titan.designer.AST.TTCN3.types.Referenced_Type; @@ -88,9 +86,7 @@ public final class TTCN3Module extends Module { private static final String FULLNAMEPART = ".control"; public static final String MODULE = "module"; - public static final String DUPLICATEIMPORTFIRST = "Duplicate import from module `{0}'' was first declared here"; - public static final String DUPLICATEIMPORTREPEATED = "Duplicate import from module `{0}'' was declared here again"; - public static final String MISSINGREFERENCE = "There is no visible definition with name `{0}'' in module `{1}''"; + private static final String MISSINGREFERENCE = "There is no visible definition with name `{0}'' in module `{1}''"; private final List<ImportModule> importedModules; private final List<FriendModule> friendModules; @@ -441,6 +437,53 @@ public final class TTCN3Module extends Module { controlpart.check(timestamp); } } + + /** + * Experimental method for BrokenPartsViaInvertedImports. + */ + public void checkWithDefinitions(final CompilationTimeStamp timestamp, final List<Assignment> assignments) { + if (lastCompilationTimeStamp != null && !lastCompilationTimeStamp.isLess(timestamp)) { + return; + } + + T3Doc.check(this.getCommentLocation(), MODULE); + + lastCompilationTimeStamp = timestamp; + + NamingConventionHelper.checkConvention(PreferenceConstants.REPORTNAMINGCONVENTION_TTCN3MODULE, identifier, "TTCN-3 module"); + + // re-initialize at the beginning of the cycle. + versionNumber = null; + anytype.clear(); + missingReferences.clear(); + + if (withAttributesPath != null) { + withAttributesPath.checkGlobalAttributes(timestamp, false); + withAttributesPath.checkAttributes(timestamp); + } + + //for (ImportModule impMod : importedModules) { + // impMod.check(timestamp); + //} + + checkFriendModuleUniqueness(); + for (FriendModule friendModule : friendModules) { + friendModule.check(timestamp); + } + + if (withAttributesPath != null) { + analyzeExtensionAttributes(timestamp); + } + + //anytypeDefinition.check(timestamp); + //definitions.check(timestamp); + + definitions.checkWithDefinitions(timestamp, assignments); + + if (controlpart != null) { + controlpart.check(timestamp); + } + } @Override public void postCheck() { @@ -758,13 +801,6 @@ public final class TTCN3Module extends Module { if (temporalAssignment != null) { return temporalAssignment; } - - //map(A:port, system:MyActualNotIdentifiedPort) form shall be accepted in function and altstep - if( reference.getNameParent() != null && reference.getNameParent() instanceof Map_Statement - && reference.getMyScope() != null && (reference.getMyScope() instanceof StatementBlock) - ) { - return null; - } referenceLocation .reportSemanticError(MessageFormat.format(MISSINGREFERENCE, id.getDisplayName(), identifier.getDisplayName())); @@ -948,7 +984,6 @@ public final class TTCN3Module extends Module { return aReparser.parse(new ITTCN3ReparseBase() { @Override public void reparse(final Ttcn3Reparser parser) { - aReparser.fullAnalysysNeeded = true; MultipleWithAttributes attributes = parser.pr_reparser_optionalWithStatement().attributes; parser.pr_EndOfFile(); if ( parser.isErrorListEmpty() ) { @@ -1021,7 +1056,6 @@ public final class TTCN3Module extends Module { // edited the module identifier Location temporalIdentifier = identifier.getLocation(); if (reparser.envelopsDamage(temporalIdentifier) || reparser.isExtending(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(temporalIdentifier); IIdentifierReparser r = new IdentifierReparser(reparser); int result = r.parse(); @@ -1044,7 +1078,6 @@ public final class TTCN3Module extends Module { } return; } else if (reparser.isDamaged(temporalIdentifier)) { - reparser.fullAnalysysNeeded = true; throw new ReParseException(); } @@ -1056,7 +1089,6 @@ public final class TTCN3Module extends Module { try { definitions.updateSyntax(reparser, importedModules, friendModules, controlpart); } catch (ReParseException e) { - reparser.fullAnalysysNeeded = true; throw e; } @@ -1066,7 +1098,6 @@ public final class TTCN3Module extends Module { try { controlpart.updateSyntax(reparser); } catch (ReParseException e) { - reparser.fullAnalysysNeeded = true; throw e; } @@ -1079,7 +1110,6 @@ public final class TTCN3Module extends Module { if (withAttributesPath != null && reparser.isAffected(withAttributesPath.getLocation())) { // The modification happened inside the attribute list if (reparser.envelopsDamage(withAttributesPath.getLocation())) { - reparser.fullAnalysysNeeded = true; reparser.extendDamagedRegion(withAttributesPath.getLocation()); int result = reparseInsideAttributelist( reparser ); @@ -1094,7 +1124,6 @@ public final class TTCN3Module extends Module { reparser.updateLocation(withAttributesPath.getLocation()); } else { - reparser.fullAnalysysNeeded = true; // Something happened that we can not handle, // for example the with attribute were commented // out diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Activate_Referenced_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Activate_Referenced_Statement.java index 4cb6a3a383..a01de0a925 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Activate_Referenced_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Activate_Referenced_Statement.java @@ -38,15 +38,15 @@ public final class Activate_Referenced_Statement extends Statement { private static final String FULLNAMEPART2 = ".<parameters>"; private static final String STATEMENT_NAME = "activate"; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters actualParameterList; - public Activate_Referenced_Statement(final Value dereferedValue, final ParsedActualParameters actualParameterList) { - this.dereferedValue = dereferedValue; + public Activate_Referenced_Statement(final Value dereferredValue, final ParsedActualParameters actualParameterList) { + this.dereferredValue = dereferredValue; this.actualParameterList = actualParameterList; - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (actualParameterList != null) { actualParameterList.setFullNameParent(this); @@ -67,7 +67,7 @@ public final class Activate_Referenced_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (dereferedValue == child) { + if (dereferredValue == child) { return builder.append(FULLNAMEPART1); } else if (actualParameterList == child) { return builder.append(FULLNAMEPART2); @@ -79,8 +79,8 @@ public final class Activate_Referenced_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (actualParameterList != null) { actualParameterList.setMyScope(scope); @@ -96,13 +96,13 @@ public final class Activate_Referenced_Statement extends Statement { isErroneous = false; lastTimeChecked = timestamp; - if (dereferedValue == null) { + if (dereferredValue == null) { setIsErroneous(); return; } - dereferedValue.setLoweridToReference(timestamp); - IType type = dereferedValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); + dereferredValue.setLoweridToReference(timestamp); + IType type = dereferredValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); if (type != null) { type = type.getTypeRefdLast(timestamp); } @@ -113,13 +113,13 @@ public final class Activate_Referenced_Statement extends Statement { } if (!Type_type.TYPE_ALTSTEP.equals(type.getTypetype())) { - dereferedValue.getLocation().reportSemanticError(MessageFormat.format(ALTSTEPEXPECTED, type.getTypename())); + dereferredValue.getLocation().reportSemanticError(MessageFormat.format(ALTSTEPEXPECTED, type.getTypename())); setIsErroneous(); return; } if (((Altstep_Type) type).isRunsOnSelf()) { - dereferedValue.getLocation().reportSemanticError(RUNONSELFERROR); + dereferredValue.getLocation().reportSemanticError(RUNONSELFERROR); setIsErroneous(); return; } @@ -148,9 +148,9 @@ public final class Activate_Referenced_Statement extends Statement { throw new ReParseException(); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (actualParameterList != null) { actualParameterList.updateSyntax(reparser, false); @@ -160,8 +160,8 @@ public final class Activate_Referenced_Statement extends Statement { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (actualParameterList != null) { actualParameterList.findReferences(referenceFinder, foundIdentifiers); @@ -170,7 +170,7 @@ public final class Activate_Referenced_Statement extends Statement { @Override protected boolean memberAccept(ASTVisitor v) { - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (actualParameterList != null && !actualParameterList.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Altstep_Applied_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Altstep_Applied_Statement.java index b5c45f7b52..81a410dd6f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Altstep_Applied_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Altstep_Applied_Statement.java @@ -29,15 +29,15 @@ public final class Altstep_Applied_Statement extends Statement { private static final String FULLNAMEPART2 = ".<parameters>"; private static final String STATEMENT_NAME = "altstep type application"; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters actualParameterList; - public Altstep_Applied_Statement(final Value dereferedValue, final ParsedActualParameters actualParameterList) { - this.dereferedValue = dereferedValue; + public Altstep_Applied_Statement(final Value dereferredValue, final ParsedActualParameters actualParameterList) { + this.dereferredValue = dereferredValue; this.actualParameterList = actualParameterList; - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (actualParameterList != null) { actualParameterList.setFullNameParent(this); @@ -58,7 +58,7 @@ public final class Altstep_Applied_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (dereferedValue == child) { + if (dereferredValue == child) { return builder.append(FULLNAMEPART1); } else if (actualParameterList == child) { return builder.append(FULLNAMEPART2); @@ -70,8 +70,8 @@ public final class Altstep_Applied_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (actualParameterList != null) { actualParameterList.setMyScope(scope); @@ -98,9 +98,9 @@ public final class Altstep_Applied_Statement extends Statement { throw new ReParseException(); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (actualParameterList != null) { @@ -111,8 +111,8 @@ public final class Altstep_Applied_Statement extends Statement { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (actualParameterList != null) { actualParameterList.findReferences(referenceFinder, foundIdentifiers); @@ -121,7 +121,7 @@ public final class Altstep_Applied_Statement extends Statement { @Override protected boolean memberAccept(ASTVisitor v) { - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (actualParameterList != null && !actualParameterList.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Catch_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Catch_Statement.java index c519d21fc8..4e38cb55df 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Catch_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Catch_Statement.java @@ -206,7 +206,7 @@ public final class Catch_Statement extends Statement { lastTimeChecked = timestamp; } - public static void checkCatch(final CompilationTimeStamp timestamp, final Statement statement, final String statement_name, + public static void checkCatch(final CompilationTimeStamp timestamp, final Statement statement, final String statementName, final Reference portReference, final Reference signatureReference, final TemplateInstance parameter, final boolean timeout, final TemplateInstance fromClause, final Reference redirectValue, final Reference redirectSender) { @@ -251,7 +251,7 @@ public final class Catch_Statement extends Statement { if (OperationModes.OP_Message.equals(body.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(MESSAGEPORT, statement_name, portType.getTypename())); + MessageFormat.format(MESSAGEPORT, statementName, portType.getTypename())); } else if (!body.catchAllowed(timestamp)) { portReference.getLocation().reportSemanticError( MessageFormat.format(PORTWITHOUTEXCEPTIONSUPPORT, portType.getTypename())); @@ -271,7 +271,7 @@ public final class Catch_Statement extends Statement { if (OperationModes.OP_Message.equals(body.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(MESSAGEPORT, statement_name, portType.getTypename())); + MessageFormat.format(MESSAGEPORT, statementName, portType.getTypename())); } else if (body.catchAllowed(timestamp)) { TypeSet outSignatures = body.getOutSignatures(); @@ -290,11 +290,11 @@ public final class Catch_Statement extends Statement { } } else if (portReference == null) { if (parameter != null) { - parameter.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHPARAMETER, statement_name)); + parameter.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHPARAMETER, statementName)); } if (redirectValue != null) { redirectValue.getLocation().reportSemanticError( - MessageFormat.format(ANYPORTWITHVALUEREDIRECT, statement_name)); + MessageFormat.format(ANYPORTWITHVALUEREDIRECT, statementName)); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Connect_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Connect_Statement.java index eb77222c12..039b71645e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Connect_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Connect_Statement.java @@ -13,11 +13,11 @@ import java.util.List; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IType; -import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.PortReference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Value; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.types.PortTypeBody; import org.eclipse.titan.designer.AST.TTCN3.types.Port_Type; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -37,12 +37,12 @@ public final class Connect_Statement extends Statement { private static final String STATEMENT_NAME = "connect"; private final Value componentReference1; - private final Reference portReference1; + private final PortReference portReference1; private final Value componentReference2; - private final Reference portReference2; + private final PortReference portReference2; - public Connect_Statement(final Value componentReference1, final Reference portReference1, final Value componentReference2, - final Reference portReference2) { + public Connect_Statement(final Value componentReference1, final PortReference portReference1, final Value componentReference2, + final PortReference portReference2) { this.componentReference1 = componentReference1; this.portReference1 = portReference1; this.componentReference2 = componentReference2; @@ -95,15 +95,9 @@ public final class Connect_Statement extends Statement { if (componentReference1 != null) { componentReference1.setMyScope(scope); } - if (portReference1 != null) { - portReference1.setMyScope(scope); - } if (componentReference2 != null) { componentReference2.setMyScope(scope); } - if (portReference2 != null) { - portReference2.setMyScope(scope); - } } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Disconnect_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Disconnect_Statement.java index de2fba5bf5..ccc5a4e565 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Disconnect_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Disconnect_Statement.java @@ -13,11 +13,11 @@ import java.util.List; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IType; -import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.PortReference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Value; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.types.PortTypeBody; import org.eclipse.titan.designer.AST.TTCN3.types.Port_Type; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -35,12 +35,12 @@ public final class Disconnect_Statement extends Statement { private static final String STATEMENT_NAME = "disconnect"; private final Value componentReference1; - private final Reference portReference1; + private final PortReference portReference1; private final Value componentReference2; - private final Reference portReference2; + private final PortReference portReference2; - public Disconnect_Statement(final Value componentReference1, final Reference portReference1, final Value componentReference2, - final Reference portReference2) { + public Disconnect_Statement(final Value componentReference1, final PortReference portReference1, final Value componentReference2, + final PortReference portReference2) { this.componentReference1 = componentReference1; this.portReference1 = portReference1; this.componentReference2 = componentReference2; @@ -93,15 +93,9 @@ public final class Disconnect_Statement extends Statement { if (componentReference1 != null) { componentReference1.setMyScope(scope); } - if (portReference1 != null) { - portReference1.setMyScope(scope); - } if (componentReference2 != null) { componentReference2.setMyScope(scope); } - if (portReference2 != null) { - portReference2.setMyScope(scope); - } } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/For_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/For_Statement.java index 5cff67c687..19182d0777 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/For_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/For_Statement.java @@ -23,7 +23,6 @@ import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; import org.eclipse.titan.designer.AST.TTCN3.definitions.For_Loop_Definitions; -import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock.ReturnStatus_type; import org.eclipse.titan.designer.AST.TTCN3.values.Boolean_Value; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; import org.eclipse.titan.designer.parsers.ttcn3parser.ReParseException; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Function_Applied_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Function_Applied_Statement.java index c094bf9a86..e41f56e785 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Function_Applied_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Function_Applied_Statement.java @@ -29,15 +29,15 @@ public final class Function_Applied_Statement extends Statement { private static final String FULLNAMEPART2 = ".<parameters>"; private static final String STATEMENT_NAME = "function type application"; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters actualParameterList; - public Function_Applied_Statement(final Value dereferedValue, final ParsedActualParameters actualParameterList) { - this.dereferedValue = dereferedValue; + public Function_Applied_Statement(final Value dereferredValue, final ParsedActualParameters actualParameterList) { + this.dereferredValue = dereferredValue; this.actualParameterList = actualParameterList; - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (actualParameterList != null) { actualParameterList.setFullNameParent(this); @@ -58,7 +58,7 @@ public final class Function_Applied_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (dereferedValue == child) { + if (dereferredValue == child) { return builder.append(FULLNAMEPART1); } else if (actualParameterList == child) { return builder.append(FULLNAMEPART2); @@ -70,8 +70,8 @@ public final class Function_Applied_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (actualParameterList != null) { actualParameterList.setMyScope(scope); @@ -93,9 +93,9 @@ public final class Function_Applied_Statement extends Statement { throw new ReParseException(); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (actualParameterList != null) { @@ -106,8 +106,8 @@ public final class Function_Applied_Statement extends Statement { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (actualParameterList != null) { actualParameterList.findReferences(referenceFinder, foundIdentifiers); @@ -116,7 +116,7 @@ public final class Function_Applied_Statement extends Statement { @Override protected boolean memberAccept(ASTVisitor v) { - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (actualParameterList != null && !actualParameterList.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java index 7c993625f3..32d1fcd767 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java @@ -144,7 +144,7 @@ public final class Getcall_Statement extends Statement { lastTimeChecked = timestamp; } - public static void checkGetcallStatement(final CompilationTimeStamp timestamp, final Statement statement, final String statement_name, + public static void checkGetcallStatement(final CompilationTimeStamp timestamp, final Statement statement, final String statementName, final Reference portReference, final TemplateInstance parameter, final TemplateInstance fromClause, final Parameter_Redirect redirect, final Reference redirectSender) { Port_Type portType = Port_Utility.checkPortReference(timestamp, statement, portReference); @@ -154,7 +154,7 @@ public final class Getcall_Statement extends Statement { PortTypeBody body = portType.getPortBody(); if (OperationModes.OP_Message.equals(body.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(MESSAGEBASEDPORT, statement_name, portType.getTypename())); + MessageFormat.format(MESSAGEBASEDPORT, statementName, portType.getTypename())); } else if (body.getInSignatures() == null) { portReference.getLocation().reportSemanticError(MessageFormat.format(NOINSIGNATURES, portType.getTypename())); } @@ -173,7 +173,7 @@ public final class Getcall_Statement extends Statement { TypeSet inSignatures = body.getInSignatures(); if (OperationModes.OP_Message.equals(body.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(MESSAGEBASEDPORT, statement_name, portType.getTypename())); + MessageFormat.format(MESSAGEBASEDPORT, statementName, portType.getTypename())); } else if (inSignatures != null) { if (inSignatures.getNofTypes() == 1) { signature = inSignatures.getTypeByIndex(0); @@ -198,9 +198,9 @@ public final class Getcall_Statement extends Statement { } else if (portReference == null) { // any port is referenced, or there was a syntax // error - parameter.getLocation().reportSemanticError(MessageFormat.format(ANYWITHPARAMETER, statement_name)); + parameter.getLocation().reportSemanticError(MessageFormat.format(ANYWITHPARAMETER, statementName)); if (redirect != null) { - redirect.getLocation().reportSemanticError(MessageFormat.format(ANYWITHREDIRECT, statement_name)); + redirect.getLocation().reportSemanticError(MessageFormat.format(ANYWITHREDIRECT, statementName)); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/If_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/If_Statement.java index 9fc479457b..dc9b6a997a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/If_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/If_Statement.java @@ -45,7 +45,7 @@ public final class If_Statement extends Statement { private static final String FULLNAMEPART2 = ".elseblock"; private static final String STATEMENT_NAME = "if"; - private final If_Clauses if_clauses; + private final If_Clauses ifClauses; /** * this statementblock represents the else clause. @@ -80,12 +80,12 @@ public final class If_Statement extends Statement { } } - public If_Statement(final If_Clauses if_clauses, final StatementBlock statementblock) { - this.if_clauses = if_clauses; + public If_Statement(final If_Clauses ifClauses, final StatementBlock statementblock) { + this.ifClauses = ifClauses; this.statementblock = statementblock; - if (if_clauses != null) { - if_clauses.setFullNameParent(this); + if (ifClauses != null) { + ifClauses.setFullNameParent(this); } if (statementblock != null) { statementblock.setFullNameParent(this); @@ -106,7 +106,7 @@ public final class If_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (if_clauses == child) { + if (ifClauses == child) { return builder.append(FULLNAMEPART1); } else if (statementblock == child) { return builder.append(FULLNAMEPART2); @@ -116,7 +116,7 @@ public final class If_Statement extends Statement { } public If_Clauses getIfClauses() { - return if_clauses; + return ifClauses; } public StatementBlock getStatementBlock() { @@ -126,8 +126,8 @@ public final class If_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (if_clauses != null) { - if_clauses.setMyScope(scope); + if (ifClauses != null) { + ifClauses.setMyScope(scope); } if (statementblock != null) { statementblock.setMyScope(scope); @@ -137,8 +137,8 @@ public final class If_Statement extends Statement { @Override public void setMyStatementBlock(final StatementBlock statementBlock, final int index) { super.setMyStatementBlock(statementBlock, index); - if (if_clauses != null) { - if_clauses.setMyStatementBlock(statementBlock, index); + if (ifClauses != null) { + ifClauses.setMyStatementBlock(statementBlock, index); } if (statementblock != null) { statementblock.setMyStatementBlock(statementBlock, index); @@ -147,8 +147,8 @@ public final class If_Statement extends Statement { @Override public void setMyDefinition(final Definition definition) { - if (if_clauses != null) { - if_clauses.setMyDefinition(definition); + if (ifClauses != null) { + ifClauses.setMyDefinition(definition); } if (statementblock != null) { statementblock.setMyDefinition(definition); @@ -157,8 +157,8 @@ public final class If_Statement extends Statement { @Override public void setMyAltguards(final AltGuards altGuards) { - if (if_clauses != null) { - if_clauses.setMyAltguards(altGuards); + if (ifClauses != null) { + ifClauses.setMyAltguards(altGuards); } if (statementblock != null) { statementblock.setMyAltguards(altGuards); @@ -167,8 +167,8 @@ public final class If_Statement extends Statement { @Override public StatementBlock.ReturnStatus_type hasReturn(final CompilationTimeStamp timestamp) { - if (if_clauses != null) { - return if_clauses.hasReturn(timestamp, statementblock); + if (ifClauses != null) { + return ifClauses.hasReturn(timestamp, statementblock); } return StatementBlock.ReturnStatus_type.RS_NO; @@ -181,8 +181,8 @@ public final class If_Statement extends Statement { } boolean unreachable = false; - if (if_clauses != null) { - unreachable = if_clauses.check(timestamp, unreachable); + if (ifClauses != null) { + unreachable = ifClauses.check(timestamp, unreachable); } if (statementblock != null) { @@ -202,8 +202,8 @@ public final class If_Statement extends Statement { @Override public void checkAllowedInterleave() { - if (if_clauses != null) { - if_clauses.checkAllowedInterleave(); + if (ifClauses != null) { + ifClauses.checkAllowedInterleave(); } if (statementblock != null) { statementblock.checkAllowedInterleave(); @@ -212,8 +212,8 @@ public final class If_Statement extends Statement { @Override public void postCheck() { - if (if_clauses != null) { - if_clauses.postCheck(); + if (ifClauses != null) { + ifClauses.postCheck(); } if (statementblock != null) { statementblock.postCheck(); @@ -238,8 +238,8 @@ public final class If_Statement extends Statement { throw new ReParseException(); } - if (if_clauses != null) { - if_clauses.updateSyntax(reparser, false); + if (ifClauses != null) { + ifClauses.updateSyntax(reparser, false); } if (statementblock != null) { @@ -250,8 +250,8 @@ public final class If_Statement extends Statement { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (if_clauses != null) { - if_clauses.findReferences(referenceFinder, foundIdentifiers); + if (ifClauses != null) { + ifClauses.findReferences(referenceFinder, foundIdentifiers); } if (statementblock != null) { statementblock.findReferences(referenceFinder, foundIdentifiers); @@ -260,7 +260,7 @@ public final class If_Statement extends Statement { @Override protected boolean memberAccept(ASTVisitor v) { - if (if_clauses != null && !if_clauses.accept(v)) { + if (ifClauses != null && !ifClauses.accept(v)) { return false; } if (statementblock != null && !statementblock.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Map_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Map_Statement.java index 7bb8216a97..79ffa39159 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Map_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Map_Statement.java @@ -14,12 +14,12 @@ import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IValue; -import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.IValue.Value_type; +import org.eclipse.titan.designer.AST.PortReference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Value; -import org.eclipse.titan.designer.AST.IValue.Value_type; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.types.PortTypeBody; import org.eclipse.titan.designer.AST.TTCN3.types.Port_Type; @@ -47,12 +47,12 @@ public final class Map_Statement extends Statement { private static final String STATEMENT_NAME = "map"; private final Value componentReference1; - private final Reference portReference1; + private final PortReference portReference1; private final Value componentReference2; - private final Reference portReference2; + private final PortReference portReference2; - public Map_Statement(final Value componentReference1, final Reference portReference1, final Value componentReference2, - final Reference portReference2) { + public Map_Statement(final Value componentReference1, final PortReference portReference1, final Value componentReference2, + final PortReference portReference2) { this.componentReference1 = componentReference1; this.portReference1 = portReference1; this.componentReference2 = componentReference2; @@ -105,15 +105,9 @@ public final class Map_Statement extends Statement { if (componentReference1 != null) { componentReference1.setMyScope(scope); } - if (portReference1 != null) { - portReference1.setMyScope(scope); - } if (componentReference2 != null) { componentReference2.setMyScope(scope); } - if (portReference2 != null) { - portReference2.setMyScope(scope); - } } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Assignments.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Assignments.java index f641b83890..a96735750c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Assignments.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Assignments.java @@ -28,18 +28,18 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; public final class Parameter_Assignments extends ASTNode implements IIncrementallyUpdateable { private static final String FULLNAMEPART = ".parameterassignment_"; - private final List<Parameter_Assignment> parameter_assignments; + private final List<Parameter_Assignment> parameterAssignments; public Parameter_Assignments() { - parameter_assignments = new ArrayList<Parameter_Assignment>(); + parameterAssignments = new ArrayList<Parameter_Assignment>(); } @Override public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - for (int i = 0; i < parameter_assignments.size(); i++) { - if (parameter_assignments.get(i) == child) { + for (int i = 0; i < parameterAssignments.size(); i++) { + if (parameterAssignments.get(i) == child) { return builder.append(FULLNAMEPART).append(Integer.toString(i + 1)); } } @@ -51,22 +51,22 @@ public final class Parameter_Assignments extends ASTNode implements IIncremental public void setMyScope(final Scope scope) { super.setMyScope(scope); - for (int i = 0; i < parameter_assignments.size(); i++) { - parameter_assignments.get(i).setMyScope(scope); + for (int i = 0; i < parameterAssignments.size(); i++) { + parameterAssignments.get(i).setMyScope(scope); } } - public void add(final Parameter_Assignment parameter_assignment) { - parameter_assignments.add(parameter_assignment); - parameter_assignment.setFullNameParent(this); + public void add(final Parameter_Assignment parameterAssignment) { + parameterAssignments.add(parameterAssignment); + parameterAssignment.setFullNameParent(this); } public int getNofParameterAssignments() { - return parameter_assignments.size(); + return parameterAssignments.size(); } public Parameter_Assignment getParameterAssignmentByIndex(final int index) { - return parameter_assignments.get(index); + return parameterAssignments.get(index); } @Override @@ -75,8 +75,8 @@ public final class Parameter_Assignments extends ASTNode implements IIncremental throw new ReParseException(); } - for (int i = 0, size = parameter_assignments.size(); i < size; i++) { - Parameter_Assignment assignment = parameter_assignments.get(i); + for (int i = 0, size = parameterAssignments.size(); i < size; i++) { + Parameter_Assignment assignment = parameterAssignments.get(i); assignment.updateSyntax(reparser, isDamaged); reparser.updateLocation(assignment.getLocation()); @@ -85,19 +85,19 @@ public final class Parameter_Assignments extends ASTNode implements IIncremental @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (parameter_assignments == null) { + if (parameterAssignments == null) { return; } - for (Parameter_Assignment pa : parameter_assignments) { + for (Parameter_Assignment pa : parameterAssignments) { pa.findReferences(referenceFinder, foundIdentifiers); } } @Override protected boolean memberAccept(ASTVisitor v) { - if (parameter_assignments != null) { - for (Parameter_Assignment pa : parameter_assignments) { + if (parameterAssignments != null) { + for (Parameter_Assignment pa : parameterAssignments) { if (!pa.accept(v)) { return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Port_Utility.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Port_Utility.java index 97f8d40b52..8a238f0412 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Port_Utility.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Port_Utility.java @@ -18,6 +18,7 @@ import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IValue; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.PortReference; import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.ReferenceChain; import org.eclipse.titan.designer.AST.Value; @@ -308,7 +309,7 @@ public final class Port_Utility { * problems. * */ public static IType checkConnectionEndpoint(final CompilationTimeStamp timestamp, final Statement source, final Value componentReference, - final Reference portReference, final boolean allowSystem) { + final PortReference portReference, final boolean allowSystem) { IType componentType = checkComponentReference(timestamp, source, componentReference, true, allowSystem); if (portReference == null) { return componentType; @@ -363,6 +364,7 @@ public final class Port_Utility { ComponentTypeBody componentBody = ((Component_Type) componentType).getComponentBody(); portReference.setBaseScope(componentBody); + portReference.setComponent((Component_Type) componentType); Identifier portIdentifier = portReference.getId(); if (!componentBody.hasLocalAssignmentWithId(portIdentifier)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Receive_Port_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Receive_Port_Statement.java index 8f2bb143e0..1ca9f6f423 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Receive_Port_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Receive_Port_Statement.java @@ -178,7 +178,7 @@ public final class Receive_Port_Statement extends Statement { * the timestamp of the actual semantic check cycle. * @param origin * the original statement. - * @param statement_name + * @param statementName * the name of the original statement. * @param portReference * the port reference. @@ -191,7 +191,7 @@ public final class Receive_Port_Statement extends Statement { * @param redirectSender * the sender redirection of the statement. * */ - public static void checkReceivingStatement(final CompilationTimeStamp timestamp, final Statement origin, final String statement_name, + public static void checkReceivingStatement(final CompilationTimeStamp timestamp, final Statement origin, final String statementName, final Reference portReference, final TemplateInstance receiveParameter, final TemplateInstance fromClause, final Reference redirectValue, final Reference redirectSender) { Port_Type portType = Port_Utility.checkPortReference(timestamp, origin, portReference); @@ -201,7 +201,7 @@ public final class Receive_Port_Statement extends Statement { PortTypeBody body = portType.getPortBody(); if (OperationModes.OP_Procedure.equals(body.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(MESSAGEBASEOPERATIONONPROCEDUREPORT, statement_name, + MessageFormat.format(MESSAGEBASEOPERATIONONPROCEDUREPORT, statementName, portType.getTypename())); } else if (body.getInMessages() == null) { portReference.getLocation().reportSemanticError( @@ -225,7 +225,7 @@ public final class Receive_Port_Statement extends Statement { TypeSet inMessages = portTypeBody.getInMessages(); if (OperationModes.OP_Procedure.equals(portTypeBody.getOperationMode())) { portReference.getLocation().reportSemanticError( - MessageFormat.format(RECEIVEONPORT, statement_name, portType.getTypename())); + MessageFormat.format(RECEIVEONPORT, statementName, portType.getTypename())); } else if (inMessages != null) { if (inMessages.getNofTypes() == 1) { messageType = inMessages.getTypeByIndex(0); @@ -255,10 +255,10 @@ public final class Receive_Port_Statement extends Statement { } } else if (portReference == null) { // any port - receiveParameter.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHPARAMETER, statement_name)); + receiveParameter.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHPARAMETER, statementName)); if (redirectValue != null) { redirectValue.getLocation().reportSemanticError( - MessageFormat.format(RECEIVEWITHVALUEREDIRECT, statement_name)); + MessageFormat.format(RECEIVEWITHVALUEREDIRECT, statementName)); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Referenced_Testcase_Instance_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Referenced_Testcase_Instance_Statement.java index fb73ba5cf2..fa5b2e8ee6 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Referenced_Testcase_Instance_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Referenced_Testcase_Instance_Statement.java @@ -43,18 +43,18 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { private static final String FULLNAMEPART3 = ".timerValue"; private static final String STATEMENT_NAME = "execute"; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters actualParameterList; private final Value timerValue; - public Referenced_Testcase_Instance_Statement(final Value dereferedValue, final ParsedActualParameters actualParameterList, + public Referenced_Testcase_Instance_Statement(final Value dereferredValue, final ParsedActualParameters actualParameterList, final Value timerValue) { - this.dereferedValue = dereferedValue; + this.dereferredValue = dereferredValue; this.actualParameterList = actualParameterList; this.timerValue = timerValue; - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (actualParameterList != null) { actualParameterList.setFullNameParent(this); @@ -78,7 +78,7 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (dereferedValue == child) { + if (dereferredValue == child) { return builder.append(FULLNAMEPART1); } else if (actualParameterList == child) { return builder.append(FULLNAMEPART2); @@ -92,8 +92,8 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (actualParameterList != null) { actualParameterList.setMyScope(scope); @@ -111,11 +111,11 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { lastTimeChecked = timestamp; - if (dereferedValue == null) { + if (dereferredValue == null) { return; } - IValue temporalValue = dereferedValue.setLoweridToReference(timestamp); + IValue temporalValue = dereferredValue.setLoweridToReference(timestamp); IType type = temporalValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_TEMPLATE); if (type != null) { type = type.getTypeRefdLast(timestamp); @@ -125,7 +125,7 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { } if (!Type_type.TYPE_TESTCASE.equals(type.getTypetype())) { - dereferedValue.getLocation().reportSemanticError( + dereferredValue.getLocation().reportSemanticError( MessageFormat.format( "A value of type testcase was expected in the argument of `derefers()'' instead of `{0}''", type.getTypename())); @@ -133,7 +133,7 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { } if (myStatementBlock.getScopeRunsOn() != null) { - dereferedValue.getLocation().reportSemanticError(DEFINITIONWITHOUTRUNSONEXPECTED); + dereferredValue.getLocation().reportSemanticError(DEFINITIONWITHOUTRUNSONEXPECTED); return; } @@ -173,9 +173,9 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { throw new ReParseException(); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (actualParameterList != null) { @@ -191,8 +191,8 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (actualParameterList != null) { actualParameterList.findReferences(referenceFinder, foundIdentifiers); @@ -204,7 +204,7 @@ public final class Referenced_Testcase_Instance_Statement extends Statement { @Override protected boolean memberAccept(ASTVisitor v) { - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (actualParameterList != null && !actualParameterList.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Setverdict_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Setverdict_Statement.java index 6015de9b13..cdb6e8f5af 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Setverdict_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Setverdict_Statement.java @@ -75,14 +75,14 @@ public final class Setverdict_Statement extends Statement { } } - public Setverdict_Statement(final Value verdictValue, final LogArguments verdict_reason) { + public Setverdict_Statement(final Value verdictValue, final LogArguments verdictReason) { this.verdictValue = verdictValue; - this.verdictReason = verdict_reason; + this.verdictReason = verdictReason; if (verdictValue != null) { verdictValue.setFullNameParent(this); } - if (verdict_reason != null) { + if (verdictReason != null) { this.verdictReason.setFullNameParent(this); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Start_Referenced_Component_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Start_Referenced_Component_Statement.java index 8f4d8279d4..220bce9d68 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Start_Referenced_Component_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Start_Referenced_Component_Statement.java @@ -43,20 +43,20 @@ public final class Start_Referenced_Component_Statement extends Statement { private static final String STATEMENT_NAME = "start test component"; private final Value componentReference; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters parameters; - public Start_Referenced_Component_Statement(final Value componentReference, final Value dereferedValue, + public Start_Referenced_Component_Statement(final Value componentReference, final Value dereferredValue, final ParsedActualParameters parameters) { this.componentReference = componentReference; - this.dereferedValue = dereferedValue; + this.dereferredValue = dereferredValue; this.parameters = parameters; if (componentReference != null) { componentReference.setFullNameParent(this); } - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (parameters != null) { parameters.setFullNameParent(this); @@ -79,7 +79,7 @@ public final class Start_Referenced_Component_Statement extends Statement { if (componentReference == child) { return builder.append(FULLNAMEPART1); - } else if (dereferedValue == child) { + } else if (dereferredValue == child) { return builder.append(FULLNAMEPART2); } else if (parameters == child) { return builder.append(FULLNAMEPART3); @@ -89,8 +89,8 @@ public final class Start_Referenced_Component_Statement extends Statement { } /** @return the dereferred value */ - public Value getDereferedValue() { - return dereferedValue; + public Value getDereferredValue() { + return dereferredValue; } @Override @@ -99,8 +99,8 @@ public final class Start_Referenced_Component_Statement extends Statement { if (componentReference != null) { componentReference.setMyScope(scope); } - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (parameters != null) { parameters.setMyScope(scope); @@ -121,14 +121,14 @@ public final class Start_Referenced_Component_Statement extends Statement { compType = Port_Utility.checkComponentReference(timestamp, this, componentReference, false, false); } - if (dereferedValue == null) { + if (dereferredValue == null) { return; } - switch (dereferedValue.getValuetype()) { + switch (dereferredValue.getValuetype()) { case EXPRESSION_VALUE: - if (Operation_type.REFERS_OPERATION.equals(((Expression_Value) dereferedValue).getOperationType())) { - dereferedValue.getLocation().reportSemanticError( + if (Operation_type.REFERS_OPERATION.equals(((Expression_Value) dereferredValue).getOperationType())) { + dereferredValue.getLocation().reportSemanticError( "A value of a function type was expected in the argument instead of a `refers' operation," + " which does not specify any function type."); return; @@ -136,7 +136,7 @@ public final class Start_Referenced_Component_Statement extends Statement { break; case TTCN3_NULL_VALUE: case FAT_NULL_VALUE: - dereferedValue.getLocation() + dereferredValue.getLocation() .reportSemanticError( "A value of a function type was expected in the argument instead of a `null' value, which does not specify any function type."); return; @@ -144,8 +144,8 @@ public final class Start_Referenced_Component_Statement extends Statement { break; } - dereferedValue.setLoweridToReference(timestamp); - IType type = dereferedValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); + dereferredValue.setLoweridToReference(timestamp); + IType type = dereferredValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); if (type != null) { type = type.getTypeRefdLast(timestamp); } @@ -155,14 +155,14 @@ public final class Start_Referenced_Component_Statement extends Statement { } if (!Type_type.TYPE_FUNCTION.equals(type.getTypetype())) { - dereferedValue.getLocation().reportSemanticError( + dereferredValue.getLocation().reportSemanticError( MessageFormat.format("A value of type function was expected in the argument of `{0}''", type.getTypename())); return; } Function_Type functionType = (Function_Type) type; if (functionType.isRunsOnSelf()) { - dereferedValue.getLocation().reportSemanticError("The argument cannot be a function reference with 'runs on self' clause"); + dereferredValue.getLocation().reportSemanticError("The argument cannot be a function reference with 'runs on self' clause"); return; } @@ -182,7 +182,7 @@ public final class Start_Referenced_Component_Statement extends Statement { IType returnType = functionType.getReturnType(); if (returnType != null) { if (functionType.returnsTemplate()) { - dereferedValue.getLocation().reportSemanticWarning( + dereferredValue.getLocation().reportSemanticWarning( MessageFormat.format("Function of type `{0}'' return a template of type `{1}''," + " which cannot be retrieved when the test component terminates", functionType.getTypename(), returnType.getTypename())); @@ -209,7 +209,7 @@ public final class Start_Referenced_Component_Statement extends Statement { } if (!returnTypeCorrect) { - dereferedValue.getLocation() + dereferredValue.getLocation() .reportSemanticWarning( MessageFormat.format( "Return type of function type `{0}'' is `{1}'', which does not have the `done'' extension attibute." @@ -238,9 +238,9 @@ public final class Start_Referenced_Component_Statement extends Statement { reparser.updateLocation(componentReference.getLocation()); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (parameters != null) { parameters.updateSyntax(reparser, false); @@ -253,8 +253,8 @@ public final class Start_Referenced_Component_Statement extends Statement { if (componentReference != null) { componentReference.findReferences(referenceFinder, foundIdentifiers); } - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (parameters != null) { parameters.findReferences(referenceFinder, foundIdentifiers); @@ -266,7 +266,7 @@ public final class Start_Referenced_Component_Statement extends Statement { if (componentReference != null && !componentReference.accept(v)) { return false; } - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (parameters != null && !parameters.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/TestcaseStop_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/TestcaseStop_Statement.java index 0729a95e1f..540aa0bd50 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/TestcaseStop_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/TestcaseStop_Statement.java @@ -103,4 +103,9 @@ public final class TestcaseStop_Statement extends Statement { } return true; } + + @Override + public boolean isTerminating(final CompilationTimeStamp timestamp) { + return true; + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unknown_Applied_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unknown_Applied_Statement.java index 552d7c1146..863afbaf41 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unknown_Applied_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unknown_Applied_Statement.java @@ -41,19 +41,19 @@ public final class Unknown_Applied_Statement extends Statement { private static final String FULLNAMEPART2 = ".<parameters>"; private static final String STATEMENT_NAME = "function or altstep type application"; - private final Value dereferedValue; + private final Value dereferredValue; private final ParsedActualParameters actualParameterList; private Statement realStatement; /** The index of this statement in its parent statement block. */ private int statementIndex; - public Unknown_Applied_Statement(final Value dereferedValue, final ParsedActualParameters actualParameterList) { - this.dereferedValue = dereferedValue; + public Unknown_Applied_Statement(final Value dereferredValue, final ParsedActualParameters actualParameterList) { + this.dereferredValue = dereferredValue; this.actualParameterList = actualParameterList; - if (dereferedValue != null) { - dereferedValue.setFullNameParent(this); + if (dereferredValue != null) { + dereferredValue.setFullNameParent(this); } if (actualParameterList != null) { actualParameterList.setFullNameParent(this); @@ -74,7 +74,7 @@ public final class Unknown_Applied_Statement extends Statement { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (dereferedValue == child) { + if (dereferredValue == child) { return builder.append(FULLNAMEPART1); } else if (actualParameterList == child) { return builder.append(FULLNAMEPART2); @@ -86,8 +86,8 @@ public final class Unknown_Applied_Statement extends Statement { @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (dereferedValue != null) { - dereferedValue.setMyScope(scope); + if (dereferredValue != null) { + dereferredValue.setMyScope(scope); } if (actualParameterList != null) { actualParameterList.setMyScope(scope); @@ -108,12 +108,12 @@ public final class Unknown_Applied_Statement extends Statement { lastTimeChecked = timestamp; - if (dereferedValue == null) { + if (dereferredValue == null) { return; } - dereferedValue.setLoweridToReference(timestamp); - IType type = dereferedValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_TEMPLATE); + dereferredValue.setLoweridToReference(timestamp); + IType type = dereferredValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_TEMPLATE); if (type != null) { type = type.getTypeRefdLast(timestamp); } @@ -127,7 +127,7 @@ public final class Unknown_Applied_Statement extends Statement { switch (type.getTypetype()) { case TYPE_FUNCTION: if (realStatement == null || !Statement_type.S_FUNCTION_APPLIED.equals(realStatement.getType())) { - realStatement = new Function_Applied_Statement(dereferedValue, actualParameterList); + realStatement = new Function_Applied_Statement(dereferredValue, actualParameterList); realStatement.setFullNameParent(this); realStatement.setLocation(location); realStatement.setMyStatementBlock(getMyStatementBlock(), statementIndex); @@ -145,7 +145,7 @@ public final class Unknown_Applied_Statement extends Statement { break; case TYPE_ALTSTEP: if (realStatement == null || !Statement_type.S_ALTSTEP_APPLIED.equals(realStatement.getType())) { - realStatement = new Altstep_Applied_Statement(dereferedValue, actualParameterList); + realStatement = new Altstep_Applied_Statement(dereferredValue, actualParameterList); realStatement.setFullNameParent(this); realStatement.setLocation(location); realStatement.setMyStatementBlock(getMyStatementBlock(), statementIndex); @@ -156,7 +156,7 @@ public final class Unknown_Applied_Statement extends Statement { formalParameterList.checkActualParameterList(timestamp, actualParameterList, tempActualParameters); break; default: - dereferedValue.getLocation().reportSemanticError(MessageFormat.format(FUNCTIONORALTSTEPVALUEXPECTED, type.getTypename())); + dereferredValue.getLocation().reportSemanticError(MessageFormat.format(FUNCTIONORALTSTEPVALUEXPECTED, type.getTypename())); break; } @@ -178,9 +178,9 @@ public final class Unknown_Applied_Statement extends Statement { throw new ReParseException(); } - if (dereferedValue != null) { - dereferedValue.updateSyntax(reparser, false); - reparser.updateLocation(dereferedValue.getLocation()); + if (dereferredValue != null) { + dereferredValue.updateSyntax(reparser, false); + reparser.updateLocation(dereferredValue.getLocation()); } if (actualParameterList != null) { @@ -194,8 +194,8 @@ public final class Unknown_Applied_Statement extends Statement { if (realStatement != null) { realStatement.findReferences(referenceFinder, foundIdentifiers); } else { - if (dereferedValue != null) { - dereferedValue.findReferences(referenceFinder, foundIdentifiers); + if (dereferredValue != null) { + dereferredValue.findReferences(referenceFinder, foundIdentifiers); } if (actualParameterList != null) { actualParameterList.findReferences(referenceFinder, foundIdentifiers); @@ -208,7 +208,7 @@ public final class Unknown_Applied_Statement extends Statement { if (realStatement != null) { return realStatement.accept(v); } else { - if (dereferedValue != null && !dereferedValue.accept(v)) { + if (dereferredValue != null && !dereferredValue.accept(v)) { return false; } if (actualParameterList != null && !actualParameterList.accept(v)) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unmap_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unmap_Statement.java index 41f7c28254..9e55048fd2 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unmap_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Unmap_Statement.java @@ -14,12 +14,12 @@ import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IValue; -import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.IValue.Value_type; +import org.eclipse.titan.designer.AST.PortReference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Value; -import org.eclipse.titan.designer.AST.IValue.Value_type; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.types.PortTypeBody; import org.eclipse.titan.designer.AST.TTCN3.types.Port_Type; @@ -38,12 +38,12 @@ public final class Unmap_Statement extends Statement { private static final String STATEMENT_NAME = "unmap"; private final Value componentReference1; - private final Reference portReference1; + private final PortReference portReference1; private final Value componentReference2; - private final Reference portReference2; + private final PortReference portReference2; - public Unmap_Statement(final Value componentReference1, final Reference portReference1, final Value componentReference2, - final Reference portReference2) { + public Unmap_Statement(final Value componentReference1, final PortReference portReference1, final Value componentReference2, + final PortReference portReference2) { this.componentReference1 = componentReference1; this.portReference1 = portReference1; this.componentReference2 = componentReference2; @@ -96,15 +96,9 @@ public final class Unmap_Statement extends Statement { if (componentReference1 != null) { componentReference1.setMyScope(scope); } - if (portReference1 != null) { - portReference1.setMyScope(scope); - } if (componentReference2 != null) { componentReference2.setMyScope(scope); } - if (portReference2 != null) { - portReference2.setMyScope(scope); - } } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AllElementsFrom.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AllElementsFrom.java index 64dc1c126a..de401cf336 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AllElementsFrom.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AllElementsFrom.java @@ -128,8 +128,8 @@ public class AllElementsFrom extends TemplateBody { break; case TYPE_TTCN3_SEQUENCE: // it = ((TTCN3_Sequence_Type) rt).getFieldType(timestamp, - // reference, actualSubReference, expected_index, - // interrupt_if_optional) + // reference, actualSubReference, expectedIndex, + // interruptIfOptional) break; default: template.getLocation().reportSemanticError(LISTEXPECTED); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AnyOrOmit_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AnyOrOmit_Template.java index efa6d0a7b5..af4849db7e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AnyOrOmit_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/AnyOrOmit_Template.java @@ -95,7 +95,7 @@ public final class AnyOrOmit_Template extends TTCN3Template { @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); usageLocation.reportSemanticError(MessageFormat.format(RESTRICTIONERROR, definitionName, getTemplateTypeName())); return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CharString_Pattern_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CharString_Pattern_Template.java index 3b13f046f4..8598a22136 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CharString_Pattern_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CharString_Pattern_Template.java @@ -100,7 +100,7 @@ public final class CharString_Pattern_Template extends TTCN3Template { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { getLocation().reportSemanticError("A specific value expected instead of an charstring pattern"); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ComplementedList_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ComplementedList_Template.java index 8cee218911..e7f061ed4d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ComplementedList_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ComplementedList_Template.java @@ -8,9 +8,10 @@ package org.eclipse.titan.designer.AST.TTCN3.templates; import java.text.MessageFormat; - import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IType.Type_type; +import org.eclipse.titan.designer.AST.IValue; +import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.TemplateRestriction; @@ -82,17 +83,24 @@ public final class ComplementedList_Template extends CompositeTemplate { @Override public void checkThisTemplateGeneric(final CompilationTimeStamp timestamp, final IType type, final boolean isModified, final boolean allowOmit, final boolean allowAnyOrOmit, final boolean subCheck, final boolean implicitOmit) { + + if(type == null){ + return; + } + + boolean allowOmitInValueList = allowOmitInValueList(allowOmit); + for (int i = 0, size = templates.getNofTemplates(); i < size; i++) { ITemplateListItem component = templates.getTemplateByIndex(i); component.setMyGovernor(type); ITTCN3Template temporalComponent = type.checkThisTemplateRef(timestamp, component); - temporalComponent.checkThisTemplateGeneric(timestamp, type, false, allowOmit, true, subCheck, implicitOmit); + temporalComponent.checkThisTemplateGeneric(timestamp, type, false, allowOmitInValueList, true, subCheck, implicitOmit); if (Template_type.ANY_OR_OMIT.equals(temporalComponent.getTemplatetype())) { component.getLocation().reportSemanticWarning(ANYOROMITWARNING); } } - + checkLengthRestriction(timestamp, type); if (!allowOmit && isIfpresent) { location.reportSemanticError("`ifpresent' is not allowed here"); @@ -102,13 +110,46 @@ public final class ComplementedList_Template extends CompositeTemplate { } } + /** + * If ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY is switched on + * and has AnyOrOmit (=AnyOrNone) or omit in the list then accepted, otherwise not + */ @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); - - //TODO: if ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY is switched on and has any or omit in the list then accepted, otherwise not - //Old solution has been removed - + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + + boolean allowOmitInValueList = allowOmitInValueList(true); + if(allowOmitInValueList) { + boolean hasAnyOrOmit = false; + for (int i = 0, size = templates.getNofTemplates(); i < size; i++) { + ITemplateListItem component = templates.getTemplateByIndex(i); + + // === if OMIT_VALUE then hasOmitValue=true and break ==== + // componentType == ITTCN3Template.Template_type.OMIT_VALUE does not work + // TODO: put this if-block to a higher level + //TODO: avoid NPE (?) + if(component instanceof TemplateBody) { + ITTCN3Template template = ((TemplateBody) component).getTemplate(); + if(Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype())){ + IValue value = ((SpecificValue_Template) template).getSpecificValue(); + if( Value_type.OMIT_VALUE.equals(value.getValuetype())){ + hasAnyOrOmit = true; + break; + } + } + } + TTCN3Template.Template_type componentType = component.getTemplatetype(); + if (ITTCN3Template.Template_type.ANY_OR_OMIT.equals(componentType)) { + hasAnyOrOmit = true; + break; + } + + } + if (!hasAnyOrOmit) { + location.reportSemanticError(MessageFormat.format(RESTRICTIONERROR+" without omit or AnyValueOrNone in the list", definitionName, getTemplateTypeName())); + return false; + } + } // some basic check was performed, always needs runtime check return true; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CompositeTemplate.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CompositeTemplate.java index 056e5df085..719ee44e02 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CompositeTemplate.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/CompositeTemplate.java @@ -9,9 +9,16 @@ package org.eclipse.titan.designer.AST.TTCN3.templates; import java.util.List; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IReferenceChain; +import org.eclipse.titan.designer.AST.Location; +import org.eclipse.titan.designer.AST.NULL_Location; import org.eclipse.titan.designer.AST.ReferenceFinder; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; @@ -19,6 +26,8 @@ import org.eclipse.titan.designer.AST.TTCN3.IIncrementallyUpdateable; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; import org.eclipse.titan.designer.parsers.ttcn3parser.ReParseException; import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; +import org.eclipse.titan.designer.properties.data.ProjectBuildPropertyData; +import org.eclipse.titan.designer.properties.data.TITANFlagsOptionsData; /** * @author Kristof Szabados @@ -232,4 +241,57 @@ public abstract class CompositeTemplate extends TTCN3Template { } return true; } + + /** Test if omit is allowed in a value list + * <p> + * Uses TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY: + * (It is the same as -M flag of makefilegen) <p> + * If it is true the old syntax allowed. + * If it is false then only the new syntax is allowed.<p> + * For example:<p/> + * ( 1 ifpresent, 2 ifpresent, omit ) //=> allowed in old solution, + * not allowed in new solution (3 error markers)<p> + * ( 1, 2 ) ifpresent //= only this allowed in new solution when this function returns false<p> + * + * @param allowOmit true if the field is optional field, + * false if the field is mandatory.<p> + * Of course in this case omit value and the ifpresent clause is prohibitied=> returns false<p> + * @return + * If allowOmit == false it returns false + * ( quick exit for mandatory fields). + * If allowOmit == true it returns according to the + * project property setting + * TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY + */ + final protected boolean allowOmitInValueList(boolean allowOmit) { + if( !allowOmit ) { + return false; + } + + Location loc = this.getLocation(); + if(loc == null || (loc instanceof NULL_Location)) { + return true; + } + + IResource f = loc.getFile(); + if( f == null) { + return true; + } + + IProject project = f.getProject(); + if(project == null) { + return true; + } + + QualifiedName qn = new QualifiedName(ProjectBuildPropertyData.QUALIFIER,TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY); + try { + String s= project.getPersistentProperty(qn); + return ( "true".equals(s)); + } catch (CoreException e) { + ErrorReporter.logExceptionStackTrace(e); + return true; + } + + } + } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ITTCN3Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ITTCN3Template.java index b39216fe8b..34c095bc6d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ITTCN3Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ITTCN3Template.java @@ -226,14 +226,14 @@ public interface ITTCN3Template extends IGovernedSimple { * * @param timestamp * the time stamp of the actual semantic check cycle. - * @param new_type + * @param newType * the new template_type the new template should belong * to. * * @return the new template of the provided kind if the conversion is * possible, or this template otherwise. * */ - ITTCN3Template setTemplatetype(final CompilationTimeStamp timestamp, final Template_type new_type); + ITTCN3Template setTemplatetype(final CompilationTimeStamp timestamp, final Template_type newType); /** * Calculates the return type of the template when used in an @@ -351,7 +351,7 @@ public interface ITTCN3Template extends IGovernedSimple { * @param usageLocation * the location to be used for reporting errors * */ - void checkRestrictionCommon(final String definitionName, final TemplateRestriction.Restriction_type templateRestriction, final Location usageLocation); + void checkRestrictionCommon(final CompilationTimeStamp timestamp, final String definitionName, final TemplateRestriction.Restriction_type templateRestriction, final Location usageLocation); /** * Checks if this template conforms to the restriction TR_OMIT or diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Indexed_Template_List.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Indexed_Template_List.java index c6350faac6..3fae5f67a4 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Indexed_Template_List.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Indexed_Template_List.java @@ -15,12 +15,12 @@ import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IValue; +import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.ReferenceChain; import org.eclipse.titan.designer.AST.ReferenceFinder; -import org.eclipse.titan.designer.AST.Scope; -import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; +import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.TemplateRestriction; import org.eclipse.titan.designer.AST.TTCN3.types.Array_Type; @@ -317,9 +317,9 @@ public final class Indexed_Template_List extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } for (int i = 0, size = indexedTemplates.getNofTemplates(); i < size; i++) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Invoke_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Invoke_Template.java index f00f1c3119..ab84d0d7ad 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Invoke_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Invoke_Template.java @@ -164,12 +164,12 @@ public final class Invoke_Template extends TTCN3Template { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (getIsErroneous(timestamp) || value == null) { return Type_type.TYPE_UNDEFINED; } - IType type = value.getExpressionGovernor(timestamp, expected_value); + IType type = value.getExpressionGovernor(timestamp, expectedValue); if (type == null) { return Type_type.TYPE_UNDEFINED; } @@ -252,9 +252,9 @@ public final class Invoke_Template extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } return false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/LengthRestriction.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/LengthRestriction.java index b99b4707b9..bd96fae386 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/LengthRestriction.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/LengthRestriction.java @@ -59,10 +59,10 @@ public abstract class LengthRestriction extends ASTNode implements ILocateableNo * * @param timestamp * the time stamp of the actual semantic check cycle. - * @param expected_value + * @param expectedValue * the value kind expected. * */ - public abstract void check(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value); + public abstract void check(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue); /** * Checks if the length restriction is valid for the array type. diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NamedTemplate.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NamedTemplate.java index e24120717c..98441bb228 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NamedTemplate.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NamedTemplate.java @@ -177,6 +177,9 @@ public final class NamedTemplate extends ASTNode implements ILocateableNode, IIn INamedNode inamedNode = getNameParent(); while (!(inamedNode instanceof Named_Template_List)) { + if( inamedNode == null) { + return null; //FIXME: this is just a temp solution! find the reason! + } inamedNode = inamedNode.getNameParent(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Named_Template_List.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Named_Template_List.java index 2d6dccb262..5744d7c5e5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Named_Template_List.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Named_Template_List.java @@ -360,9 +360,9 @@ public final class Named_Template_List extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } boolean needsRuntimeCheck = false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NotUsed_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NotUsed_Template.java index 696032b6e4..bcf7515a2f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NotUsed_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/NotUsed_Template.java @@ -81,9 +81,9 @@ public final class NotUsed_Template extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } if (baseTemplate != null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/OmitValue_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/OmitValue_Template.java index d25c5325c9..a8933e69e9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/OmitValue_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/OmitValue_Template.java @@ -120,9 +120,9 @@ public final class OmitValue_Template extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); usageLocation.reportSemanticError(MessageFormat.format(RESTRICTIONERROR, definitionName, getTemplateTypeName())); } @@ -131,7 +131,7 @@ public final class OmitValue_Template extends TTCN3Template { @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); usageLocation.reportSemanticError(MessageFormat.format(RESTRICTIONERROR, definitionName, getTemplateTypeName())); return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/PermutationMatch_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/PermutationMatch_Template.java index 2764ea185f..31e0e0bce8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/PermutationMatch_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/PermutationMatch_Template.java @@ -36,7 +36,7 @@ public final class PermutationMatch_Template extends CompositeTemplate { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { getLocation().reportSemanticError("A specific value expected instead of a permutation match"); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/RangeLenghtRestriction.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/RangeLenghtRestriction.java index 253aee00d2..5eab48cf63 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/RangeLenghtRestriction.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/RangeLenghtRestriction.java @@ -126,7 +126,7 @@ public final class RangeLenghtRestriction extends LengthRestriction { } @Override - public void check(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public void check(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { return; } @@ -135,7 +135,7 @@ public final class RangeLenghtRestriction extends LengthRestriction { Integer_Type integer = new Integer_Type(); lower.setMyGovernor(integer); IValue last = integer.checkThisValueRef(timestamp, lower); - integer.checkThisValueLimit(timestamp, last, expected_value, false, false, true, false); + integer.checkThisValueLimit(timestamp, last, expectedValue, false, false, true, false); IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true); IValue valueLower = last.getValueRefdLast(timestamp, chain); @@ -168,7 +168,7 @@ public final class RangeLenghtRestriction extends LengthRestriction { upper.setMyGovernor(integer); last = integer.checkThisValueRef(timestamp, upper); - integer.checkThisValueLimit(timestamp, last, expected_value, false, false, true, false); + integer.checkThisValueLimit(timestamp, last, expectedValue, false, false, true, false); chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true); IValue valueUpper = last.getValueRefdLast(timestamp, chain); @@ -262,7 +262,7 @@ public final class RangeLenghtRestriction extends LengthRestriction { @Override public void checkNofElements(final CompilationTimeStamp timestamp, final int nofElements, final boolean lessAllowed, - final boolean more_allowed, final boolean has_anyornone, final ILocateableNode locatable) { + final boolean moreAllowed, final boolean hasAnyornone, final ILocateableNode locatable) { if (lower == null) { return; } @@ -293,10 +293,10 @@ public final class RangeLenghtRestriction extends LengthRestriction { if (Value_type.INTEGER_VALUE.equals(last.getValuetype()) && !last.getIsErroneous(timestamp)) { BigInteger length = ((Integer_Value) last).getValueValue(); - if (length.compareTo(BigInteger.valueOf(nofElements)) == -1 && !more_allowed) { + if (length.compareTo(BigInteger.valueOf(nofElements)) == -1 && !moreAllowed) { final String message = MessageFormat.format( "There are more ({0} {1}) elements than it is allowed by the length restriction ({2})", - has_anyornone ? "at least" : "", nofElements, length); + hasAnyornone ? "at least" : "", nofElements, length); locatable.getLocation().reportSemanticError(message); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Referenced_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Referenced_Template.java index ecdf116cc4..16f78a6a0c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Referenced_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Referenced_Template.java @@ -182,9 +182,9 @@ public final class Referenced_Template extends TTCN3Template { * reference too. * * @param timestamp - * the time stamp of the actual semantic check cycle. + * the time stamp of the actual semantic check cycle. * @param referenceChain - * the reference chain used to detect cyclic references. + * the reference chain used to detect cyclic references. * * @return the template referenced * */ @@ -263,13 +263,13 @@ public final class Referenced_Template extends TTCN3Template { } /** - * Returns whether in the chain of referenced templates there is one which - * was defined to have the implicit omit attribute set + * Returns whether in the chain of referenced templates there is one + * which was defined to have the implicit omit attribute set * * @param timestamp - * the time stamp of the actual semantic check cycle. + * the time stamp of the actual semantic check cycle. * @param referenceChain - * the ReferenceChain used to detect circular references + * the ReferenceChain used to detect circular references * * @return true if it has, false otherwise. * */ @@ -369,7 +369,7 @@ public final class Referenced_Template extends TTCN3Template { TypeCompatibilityInfo info = new TypeCompatibilityInfo(type, governor, true); if (!type.isCompatible(timestamp, governor, info, null, null)) { - IType last = type.getTypeRefdLast(timestamp); + IType last = type.getTypeRefdLast(timestamp); switch (last.getTypetype()) { case TYPE_PORT: @@ -405,9 +405,9 @@ public final class Referenced_Template extends TTCN3Template { public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } if (reference != null) { @@ -444,7 +444,7 @@ public final class Referenced_Template extends TTCN3Template { @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); if (reference != null) { Assignment ass = reference.getRefdAssignment(timestamp, true); switch (ass.getAssignmentType()) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SingleLenghtRestriction.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SingleLenghtRestriction.java index 6b9b26485a..d71b8cd9f7 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SingleLenghtRestriction.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SingleLenghtRestriction.java @@ -85,7 +85,7 @@ public final class SingleLenghtRestriction extends LengthRestriction { } @Override - public void check(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public void check(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { return; } @@ -97,7 +97,7 @@ public final class SingleLenghtRestriction extends LengthRestriction { } value.setMyGovernor(integer); IValue last = integer.checkThisValueRef(timestamp, value); - integer.checkThisValue(timestamp, last, new ValueCheckingOptions(expected_value, false, false, true, false, false)); + integer.checkThisValue(timestamp, last, new ValueCheckingOptions(expectedValue, false, false, true, false, false)); IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true); last = last.getValueRefdLast(timestamp, chain); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SpecificValue_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SpecificValue_Template.java index 309f83afa5..98b467b7aa 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SpecificValue_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SpecificValue_Template.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB + * Copyright (c) 2000-2016 Ericsson Telecom AB * 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 @@ -13,17 +13,18 @@ import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.IType; +import org.eclipse.titan.designer.AST.IType.Type_type; +import org.eclipse.titan.designer.AST.IType.ValueCheckingOptions; import org.eclipse.titan.designer.AST.IValue; +import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Location; +import org.eclipse.titan.designer.AST.NULL_Location; import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.ReferenceChain; import org.eclipse.titan.designer.AST.ReferenceFinder; -import org.eclipse.titan.designer.AST.Scope; -import org.eclipse.titan.designer.AST.IType.Type_type; -import org.eclipse.titan.designer.AST.IType.ValueCheckingOptions; -import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; +import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.IIncrementallyUpdateable; import org.eclipse.titan.designer.AST.TTCN3.TemplateRestriction; @@ -31,6 +32,7 @@ import org.eclipse.titan.designer.AST.TTCN3.types.Function_Type; import org.eclipse.titan.designer.AST.TTCN3.values.Bitstring_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Charstring_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Expression_Value; +import org.eclipse.titan.designer.AST.TTCN3.values.Expression_Value.Operation_type; import org.eclipse.titan.designer.AST.TTCN3.values.Function_Reference_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Hexstring_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Octetstring_Value; @@ -39,7 +41,6 @@ import org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value; import org.eclipse.titan.designer.AST.TTCN3.values.SetOf_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Undefined_LowerIdentifier_Value; import org.eclipse.titan.designer.AST.TTCN3.values.UniversalCharstring_Value; -import org.eclipse.titan.designer.AST.TTCN3.values.Expression_Value.Operation_type; import org.eclipse.titan.designer.AST.TTCN3.values.expressions.ApplyExpression; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; import org.eclipse.titan.designer.parsers.ttcn3parser.ReParseException; @@ -161,10 +162,7 @@ public final class SpecificValue_Template extends TTCN3Template { lastTimeChecked = timestamp; realTemplate = this; - - if (getIsErroneous(timestamp)) { - return this; - } + isErroneous = false; IValue temp = specificValue.setLoweridToReference(timestamp); @@ -203,7 +201,7 @@ public final class SpecificValue_Template extends TTCN3Template { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { if (specificValue == null) { return; } @@ -213,7 +211,7 @@ public final class SpecificValue_Template extends TTCN3Template { // checked later break; case OMIT_VALUE: - if (!allow_omit) { + if (!allowOmit) { getLocation().reportSemanticError(OmitValue_Template.SPECIFICVALUEEXPECTED); } return; @@ -236,7 +234,7 @@ public final class SpecificValue_Template extends TTCN3Template { if (Type_type.TYPE_FUNCTION.equals(type.getTypetype()) && ((Function_Type) type).returnsTemplate()) { ITTCN3Template template = setTemplatetype(timestamp, Template_type.TEMPLATE_INVOKE); - template.checkSpecificValue(timestamp, allow_omit); + template.checkSpecificValue(timestamp, allowOmit); } } @@ -329,7 +327,11 @@ public final class SpecificValue_Template extends TTCN3Template { checkLengthRestriction(timestamp, type); if (!allowOmit && isIfpresent) { - location.reportSemanticError("`ifpresent' is not allowed here"); + if( location != null && !(location instanceof NULL_Location)) { + location.reportSemanticError("`ifpresent' is not allowed here"); + } else if(specificValue != null && !(specificValue.getLocation() instanceof NULL_Location)) { + specificValue.getLocation().reportSemanticError("`ifpresent' is not allowed here"); + } } if (subCheck) { type.checkThisTemplateSubtype(timestamp, this); @@ -445,9 +447,9 @@ public final class SpecificValue_Template extends TTCN3Template { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } return false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SubsetMatch_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SubsetMatch_Template.java index 48df97f3a1..959fa4871c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SubsetMatch_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SubsetMatch_Template.java @@ -46,7 +46,7 @@ public final class SubsetMatch_Template extends CompositeTemplate { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (getIsErroneous(timestamp)) { return Type_type.TYPE_UNDEFINED; } @@ -55,7 +55,7 @@ public final class SubsetMatch_Template extends CompositeTemplate { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { getLocation().reportSemanticError("A specific value expected instead of a subset match"); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SupersetMatch_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SupersetMatch_Template.java index 894d50cf98..2e7fc935ac 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SupersetMatch_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/SupersetMatch_Template.java @@ -37,7 +37,7 @@ public final class SupersetMatch_Template extends CompositeTemplate { } @Override - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (getIsErroneous(timestamp)) { return Type_type.TYPE_UNDEFINED; } @@ -46,7 +46,7 @@ public final class SupersetMatch_Template extends CompositeTemplate { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { getLocation().reportSemanticError("A specific value expected instead of a superset match"); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TTCN3Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TTCN3Template.java index ebba39a8a5..ca1ae8c60e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TTCN3Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TTCN3Template.java @@ -56,7 +56,7 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; public abstract class TTCN3Template extends GovernedSimple implements IReferenceChainElement, ITTCN3Template, IIncrementallyUpdateable { protected static final String RESTRICTIONERROR = "Restriction on {0} does not allow usage of `{1}''"; protected static final String OMITRESTRICTIONERROR = "Restriction 'omit' on {0} does not allow usage of `{1}''"; - protected static final String VALUERESTRICTIONERROR = "Restriction 'value' on {0} does not allow usage of `{1}''"; + protected static final String VALUERESTRICTIONERROR = "Restriction ''value'' on {0} does not allow usage of {1}"; protected static final String PRESENTRESTRICTIONERROR = "Restriction 'present' on {0} does not allow usage of `{1}''"; private static final String LENGTHRESTRICTIONERROR = "Restriction on {0} does not allow usage of length restriction"; @@ -972,9 +972,13 @@ public abstract class TTCN3Template extends GovernedSimple implements IReference * the location to be used for reporting errors * */ @Override - public final void checkRestrictionCommon(final String definitionName, final TemplateRestriction.Restriction_type templateRestriction, final Location usageLocation) { + public final void checkRestrictionCommon(final CompilationTimeStamp timestamp, final String definitionName, final TemplateRestriction.Restriction_type templateRestriction, final Location usageLocation) { switch (templateRestriction) { case TR_VALUE: + if (!isValue(timestamp)) { + usageLocation.reportSemanticError(MessageFormat.format(VALUERESTRICTIONERROR, definitionName, "not completely initialized template")); + } + //Intentional fall-through case TR_OMIT: if (lengthRestriction != null) { usageLocation.reportSemanticError(MessageFormat.format(LENGTHRESTRICTIONERROR, definitionName)); @@ -984,7 +988,7 @@ public abstract class TTCN3Template extends GovernedSimple implements IReference } break; case TR_PRESENT: - if (isIfpresent) { + if (isIfpresent || getTemplateReferencedLast(timestamp).isIfpresent) { usageLocation.reportSemanticError(MessageFormat.format(PRESENTRESTRICTIONERROR, definitionName, "ifpresent")); } break; @@ -1015,9 +1019,9 @@ public abstract class TTCN3Template extends GovernedSimple implements IReference @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } usageLocation.reportSemanticError(MessageFormat.format(RESTRICTIONERROR, definitionName, getTemplateTypeName())); @@ -1063,7 +1067,7 @@ public abstract class TTCN3Template extends GovernedSimple implements IReference */ @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TemplateBody.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TemplateBody.java index 498e840237..4676356a3b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TemplateBody.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/TemplateBody.java @@ -140,8 +140,8 @@ public class TemplateBody implements ITemplateListItem { @Override public ITTCN3Template setTemplatetype(CompilationTimeStamp timestamp, - Template_type new_type) { - return template.setTemplatetype(timestamp,new_type); + Template_type newType) { + return template.setTemplatetype(timestamp, newType); } @Override @@ -189,9 +189,9 @@ public class TemplateBody implements ITemplateListItem { } @Override - public void checkRestrictionCommon(String definitionName, + public void checkRestrictionCommon(final CompilationTimeStamp timestamp, String definitionName, Restriction_type templateRestriction, final Location usageLocation) { - template.checkRestrictionCommon(definitionName, templateRestriction, usageLocation); + template.checkRestrictionCommon(timestamp, definitionName, templateRestriction, usageLocation); } @Override @@ -219,8 +219,8 @@ public class TemplateBody implements ITemplateListItem { } @Override - public void setIsErroneous(boolean is_erroneous) { - template.setIsErroneous(is_erroneous); + public void setIsErroneous(boolean isErroneous) { + template.setIsErroneous(isErroneous); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Template_List.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Template_List.java index 6f91c24c00..3913161559 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Template_List.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/Template_List.java @@ -236,7 +236,7 @@ public final class Template_List extends CompositeTemplate { } @Override - public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allow_omit) { + public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { for (int i = 0, size = templates.getNofTemplates(); i < size; i++) { templates.getTemplateByIndex(i).checkSpecificValue(timestamp, true); } @@ -256,9 +256,9 @@ public final class Template_List extends CompositeTemplate { @Override public boolean checkValueomitRestriction(final CompilationTimeStamp timestamp, final String definitionName, final boolean omitAllowed, final Location usageLocation) { if (omitAllowed) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_OMIT, usageLocation); } else { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_VALUE, usageLocation); } boolean needsRuntimeCheck = false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueList_Template.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueList_Template.java index ea0b8574b8..d5d5552f4e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueList_Template.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueList_Template.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (c) 2000-2015 Ericsson Telecom AB + * Copyright (c) 2000-2016 Ericsson Telecom AB * 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 @@ -10,6 +10,7 @@ package org.eclipse.titan.designer.AST.TTCN3.templates; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.IType.Type_type; import org.eclipse.titan.designer.AST.Location; +import org.eclipse.titan.designer.AST.NULL_Location; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.TemplateRestriction; import org.eclipse.titan.designer.parsers.CompilationTimeStamp; @@ -76,23 +77,27 @@ public final class ValueList_Template extends CompositeTemplate { final boolean allowOmit, final boolean allowAnyOrOmit, final boolean subCheck, final boolean implicitOmit) { if(type == null){ return; - } + } + boolean allowOmitInValueList = allowOmitInValueList(allowOmit); + for (int i = 0, size = templates.getNofTemplates(); i < size; i++) { ITemplateListItem component = templates.getTemplateByIndex(i); component.setMyGovernor(type); ITTCN3Template temporalComponent = type.checkThisTemplateRef(timestamp, component); - temporalComponent.checkThisTemplateGeneric(timestamp, type, false, allowOmit, true, subCheck, implicitOmit); + temporalComponent.checkThisTemplateGeneric(timestamp, type, false, allowOmitInValueList, true, subCheck, implicitOmit); } checkLengthRestriction(timestamp, type); if (!allowOmit && isIfpresent) { - location.reportSemanticError("`ifpresent' is not allowed here"); + if( location != null && !(location instanceof NULL_Location)) { + location.reportSemanticError("`ifpresent' is not allowed here"); + } } if (subCheck) { type.checkThisTemplateSubtype(timestamp, this); } } - + @Override public void checkSpecificValue(final CompilationTimeStamp timestamp, final boolean allowOmit) { getLocation().reportSemanticError("A specific value was expected instead of value list match"); @@ -100,7 +105,7 @@ public final class ValueList_Template extends CompositeTemplate { @Override public boolean checkPresentRestriction(final CompilationTimeStamp timestamp, final String definitionName, final Location usageLocation) { - checkRestrictionCommon(definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); + checkRestrictionCommon(timestamp, definitionName, TemplateRestriction.Restriction_type.TR_PRESENT, usageLocation); boolean needsRuntimeCheck = false; for (int i = 0, size = templates.getNofTemplates(); i < size; i++) { ITTCN3Template component = templates.getTemplateByIndex(i); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueRange.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueRange.java index 371041de76..a775208497 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueRange.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/templates/ValueRange.java @@ -109,21 +109,21 @@ public final class ValueRange extends ASTNode implements IIncrementallyUpdateabl * * @param timestamp * the actual semantic checking cycle - * @param expected_value + * @param expectedValue * the kind of the value to be expected. * * @return the governor of the value range * */ - public IType getExpressionGovernor(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public IType getExpressionGovernor(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (min != null) { - IType type = min.getExpressionGovernor(timestamp, expected_value); + IType type = min.getExpressionGovernor(timestamp, expectedValue); if (type != null) { return type; } } if (max != null) { - IType type = max.getExpressionGovernor(timestamp, expected_value); + IType type = max.getExpressionGovernor(timestamp, expectedValue); if (type != null) { return type; } @@ -137,21 +137,21 @@ public final class ValueRange extends ASTNode implements IIncrementallyUpdateabl * * @param timestamp * the actual semantic checking cycle - * @param expected_value + * @param expectedValue * the kind of the value to be expected. * * @return the returning type of the value range * */ - public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expected_value) { + public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { if (min != null) { - Type_type type = min.getExpressionReturntype(timestamp, expected_value); + Type_type type = min.getExpressionReturntype(timestamp, expectedValue); if (!Type_type.TYPE_UNDEFINED.equals(type)) { return type; } } if (max != null) { - Type_type type = max.getExpressionReturntype(timestamp, expected_value); + Type_type type = max.getExpressionReturntype(timestamp, expectedValue); if (!Type_type.TYPE_UNDEFINED.equals(type)) { return type; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Altstep_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Altstep_Type.java index 1c5bc9b8fb..9702b47a37 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Altstep_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Altstep_Type.java @@ -250,7 +250,7 @@ public final class Altstep_Type extends Type { Def_Altstep altstep = null; switch (last.getValuetype()) { case ALTSTEP_REFERENCE_VALUE: - altstep = ((Altstep_Reference_Value) last).getReferedAltstep(); + altstep = ((Altstep_Reference_Value) last).getReferredAltstep(); if (altstep == null) { setIsErroneous(true); return; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Array_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Array_Type.java index 44bae6331e..8675870344 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Array_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Array_Type.java @@ -467,14 +467,9 @@ public final class Array_Type extends Type implements IReferenceableElement { int nofValues = lastValue.getNofComponents(); - if (!dimension.getIsErroneous(timestamp) && dimension.getSize() != nofValues) { - if (nofValues < dimension.getSize()) { - originalValue.getLocation().reportSemanticError(MessageFormat.format(TOOFEWEXPECTED, dimension.getSize(), nofValues)); - originalValue.setIsErroneous(true); - } else { + if (!dimension.getIsErroneous(timestamp) && dimension.getSize() < nofValues) { originalValue.getLocation().reportSemanticError(MessageFormat.format(TOOMANYEXPECTED, dimension.getSize(), nofValues)); originalValue.setIsErroneous(true); - } } if (lastValue.isIndexed()) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/CompField.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/CompField.java index 2451d1168e..1f573ac8a7 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/CompField.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/CompField.java @@ -345,6 +345,9 @@ public final class CompField extends ASTNode INamedNode inamedNode = getNameParent(); while (!(inamedNode instanceof Definition)) { + if( inamedNode == null) { + return null; //FIXME: this is just a temp solution! find the reason! + } inamedNode = inamedNode.getNameParent(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ComponentTypeBody.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ComponentTypeBody.java index db08e7c715..87fb7c1ed5 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ComponentTypeBody.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ComponentTypeBody.java @@ -104,6 +104,7 @@ public final class ComponentTypeBody extends TTCN3Scope implements IReferenceCha * */ private Map<String, Definition> attributeGainedDefinitions = new HashMap<String, Definition>(); + /** the with attributes of the definition does not belong to the componentTypeBody naturally !*/ private WithAttributesPath withAttributesPath; // the component type to which this body belongs. @@ -596,6 +597,7 @@ public final class ComponentTypeBody extends TTCN3Scope implements IReferenceCha lastUniquenessCheck = timestamp; compatibleBodies.clear(); + definitions.checkUniqueness(); addDefinitionsOfExtendsParents(timestamp); addDefinitionsOfExtendAttributeParents(timestamp); @@ -660,7 +662,7 @@ public final class ComponentTypeBody extends TTCN3Scope implements IReferenceCha } } } else { - extendsGainedDefinitions.put(definition.getIdentifier().getName(), definition); + extendsGainedDefinitions.put(name, definition); if (!definition.getMyScope().getModuleScope().equals(parentScope.getModuleScope())) { if (parentScope.hasAssignmentWithId(timestamp, definition.getIdentifier())) { @@ -900,9 +902,6 @@ public final class ComponentTypeBody extends TTCN3Scope implements IReferenceCha if (attrExtendsReferences != null) { attrExtendsReferences.findReferences(referenceFinder, foundIdentifiers); } - if (withAttributesPath != null) { - withAttributesPath.findReferences(referenceFinder, foundIdentifiers); - } } @Override @@ -931,11 +930,6 @@ public final class ComponentTypeBody extends TTCN3Scope implements IReferenceCha return false; } } - if (withAttributesPath != null) { - if (!withAttributesPath.accept(v)) { - return false; - } - } if (v.leave(this)==ASTVisitor.V_ABORT) { return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java index 43b61c1585..934ea00982 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Component_Type.java @@ -60,6 +60,8 @@ public final class Component_Type extends Type { private static final String COMPONENTVALUEEXPECTED = "Component value was expected"; private static final String TEMPLATENOTALLOWED = "{0} cannot be used for type `{1}''"; private static final String LENGTHRESTRICTIONNOTALLOWED = "Length restriction is not allowed for type `{0}''"; + private static final String INVALIDSUBREFERENCE = "Referencing fields of a component is not allowed"; + private static final String[] SIMPLE_COMPONENT_PROPOSALS = new String[] {"alive", "create;", "create alive;", "done", "kill;", "killed", "running", "stop;" }; @@ -227,7 +229,7 @@ public final class Component_Type extends Type { return null; case fieldSubReference: subreference.getLocation().reportSemanticError( - MessageFormat.format(FieldSubReference.INVALIDSUBREFERENCE, ((FieldSubReference) subreference).getId().getDisplayName(), + MessageFormat.format(INVALIDSUBREFERENCE, ((FieldSubReference) subreference).getId().getDisplayName(), getTypename())); return null; case parameterisedSubReference: diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/DefinitionContainer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/DefinitionContainer.java index 65291ba047..c0c1bdf854 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/DefinitionContainer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/DefinitionContainer.java @@ -75,6 +75,22 @@ public class DefinitionContainer implements Iterable<Definition> { } } + public void checkUniqueness() { + definitionMap.clear(); + + for(Definition definition: definitions) { + String definitionName = definition.getIdentifier().getName(); + if (definitionMap.containsKey(definitionName)) { + definitionMap.get(definitionName).getIdentifier().getLocation().reportSingularSemanticError( + MessageFormat.format(CompFieldMap.DUPLICATEFIELDNAMEFIRST, definition.getIdentifier().getDisplayName())); + definition.getIdentifier().getLocation().reportSemanticError( + MessageFormat.format(CompFieldMap.DUPLICATEFIELDNAMEREPEATED, definition.getIdentifier().getDisplayName())); + } else { + definitionMap.put(definitionName, definition); + } + } + } + public boolean isEmpty() { return definitions.isEmpty(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/EnumItem.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/EnumItem.java index 5f4de7ac81..13083934bd 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/EnumItem.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/EnumItem.java @@ -11,18 +11,19 @@ import java.util.List; import org.eclipse.titan.designer.AST.ASTNode; import org.eclipse.titan.designer.AST.ASTVisitor; +import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.ILocateableNode; -import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IReferencingElement; import org.eclipse.titan.designer.AST.ISubReference; -import org.eclipse.titan.designer.AST.ITypeWithComponents; +import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Location; +import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.NULL_Location; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.Value; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.IIncrementallyUpdateable; import org.eclipse.titan.designer.declarationsearch.Declaration; import org.eclipse.titan.designer.editors.DeclarationCollector; @@ -202,14 +203,15 @@ public final class EnumItem extends ASTNode implements ILocateableNode, IIncreme @Override public Declaration getDeclaration() { - INamedNode inamedNode = getNameParent(); - - while (!(inamedNode instanceof TTCN3_Enumerated_Type)) { - inamedNode = inamedNode.getNameParent(); + Module module = getMyScope().getModuleScope(); + Assignment assignment = module.getEnclosingAssignment(getLocation().getOffset()); + IType type = assignment.getType(CompilationTimeStamp.getBaseTimestamp()); + + if(!(type instanceof TTCN3_Enumerated_Type)) { + return null; } - TTCN3_Enumerated_Type type = (TTCN3_Enumerated_Type) inamedNode; - Identifier id = ((ITypeWithComponents) type).getComponentIdentifierByName(getId()); - return Declaration.createInstance(type.getDefiningAssignment(), id); + Identifier id = ((TTCN3_Enumerated_Type) type).getComponentIdentifierByName(getId()); + return Declaration.createInstance(assignment, id); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Function_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Function_Type.java index de19dc89ca..683788496e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Function_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Function_Type.java @@ -342,7 +342,7 @@ public final class Function_Type extends Type { Assignment assignment = null; switch (last.getValuetype()) { case FUNCTION_REFERENCE_VALUE: - assignment = ((Function_Reference_Value) last).getReferedFunction(); + assignment = ((Function_Reference_Value) last).getReferredFunction(); if (assignment == null) { value.setIsErroneous(true); return; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/SequenceOf_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/SequenceOf_Type.java index 9eac2d0408..80bf31a328 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/SequenceOf_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/SequenceOf_Type.java @@ -460,11 +460,11 @@ public final class SequenceOf_Type extends AbstractOfType implements IReferencea * @param value the value to be checked * @param expectedValue the kind of value expected here. * @param incompleteAllowed wheather incomplete value is allowed or not. - * @param implicit_omit true if the implicit omit optional attribute was set + * @param implicitOmit true if the implicit omit optional attribute was set * for the value, false otherwise * */ public void checkThisValueSequenceOf(final CompilationTimeStamp timestamp, final SequenceOf_Value value, - final Expected_Value_type expectedValue, final boolean incompleteAllowed , final boolean implicit_omit, final boolean strElem) { + final Expected_Value_type expectedValue, final boolean incompleteAllowed , final boolean implicitOmit, final boolean strElem) { if (value.isIndexed()) { boolean checkHoles = Expected_Value_type.EXPECTED_CONSTANT.equals(expectedValue); BigInteger maxIndex = BigInteger.valueOf(-1); @@ -504,7 +504,7 @@ public final class SequenceOf_Type extends AbstractOfType implements IReferencea component.setMyGovernor(getOfType()); IValue tempValue2 = getOfType().checkThisValueRef(timestamp, component); getOfType().checkThisValue(timestamp, tempValue2, - new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicit_omit, strElem)); + new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicitOmit, strElem)); } if (checkHoles) { if (maxIndex.compareTo(BigInteger.valueOf(indexMap.size() - 1)) != 0) { @@ -522,7 +522,7 @@ public final class SequenceOf_Type extends AbstractOfType implements IReferencea } else { IValue tempValue2 = getOfType().checkThisValueRef(timestamp, component); getOfType().checkThisValue(timestamp, tempValue2, - new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicit_omit, strElem)); + new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicitOmit, strElem)); } } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java index e98bc30eaa..70aa2cd50a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java @@ -34,6 +34,7 @@ import org.eclipse.titan.designer.AST.IValue.Value_type; import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template; +import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template.Template_type; import org.eclipse.titan.designer.AST.TTCN3.types.subtypes.SubType; import org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value; import org.eclipse.titan.designer.AST.TTCN3.values.Undefined_LowerIdentifier_Value; @@ -312,10 +313,11 @@ public final class TTCN3_Enumerated_Type extends Type implements ITypeWithCompon final boolean isModified, final boolean implicitOmit) { registerUsage(template); template.setMyGovernor(this); - - template.getLocation().reportSemanticError(MessageFormat.format(TEMPLATENOTALLOWED, template.getTemplateTypeName())); - template.setIsErroneous(true); - + + if (!Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype()) && !Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype())) { + template.getLocation().reportSemanticError(MessageFormat.format(TEMPLATENOTALLOWED, template.getTemplateTypeName())); + template.setIsErroneous(true); + } if (template.getLengthRestriction() != null) { template.getLocation().reportSemanticError(LENGTHRESTRICTIONNOTALLOWED); template.setIsErroneous(true); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Set_Seq_Choice_BaseType.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Set_Seq_Choice_BaseType.java index 53f7ecf814..48ad16e813 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Set_Seq_Choice_BaseType.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Set_Seq_Choice_BaseType.java @@ -426,17 +426,6 @@ public abstract class TTCN3_Set_Seq_Choice_BaseType extends Type implements ITyp if (subreferences.size() <= i) { return; } - - //ToDo:code completition does not work most of the time it would be needed HQ66225 - // test implementation - if (compFieldMap != null) { - int nofComponents = this.getNofComponents(); - for (int j = 0; j < nofComponents; j++) { - Identifier id = this.getComponentIdentifierByIndex(j); - propCollector.addProposal(id, null, ""); - } - } - ISubReference subreference = subreferences.get(i); if (Subreference_type.fieldSubReference.equals(subreference.getReferenceType())) { if (subreferences.size() > i + 1) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Testcase_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Testcase_Type.java index 0649aafb58..ff8d79b429 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Testcase_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Testcase_Type.java @@ -244,7 +244,7 @@ public final class Testcase_Type extends Type { Def_Testcase testcase = null; switch (last.getValuetype()) { case TESTCASE_REFERENCE_VALUE: - testcase = ((Testcase_Reference_Value) last).getReferedTestcase(); + testcase = ((Testcase_Reference_Value) last).getReferredTestcase(); if (testcase == null) { setIsErroneous(true); return; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/EmptyStringSet.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/EmptyStringSet.java index 621d5aaff0..a94dbc5871 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/EmptyStringSet.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/EmptyStringSet.java @@ -12,8 +12,8 @@ package org.eclipse.titan.designer.AST.TTCN3.types.subtypes; * */ public final class EmptyStringSet extends StringSubtypeTreeElement { - public EmptyStringSet(final StringType string_type) { - super(string_type); + public EmptyStringSet(final StringType stringType) { + super(stringType); } @Override @@ -23,7 +23,7 @@ public final class EmptyStringSet extends StringSubtypeTreeElement { @Override public SubtypeConstraint complement() { - return new FullStringSet(string_type); + return new FullStringSet(stringType); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/FullStringSet.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/FullStringSet.java index cef0460783..54f518e8b6 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/FullStringSet.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/FullStringSet.java @@ -12,8 +12,8 @@ package org.eclipse.titan.designer.AST.TTCN3.types.subtypes; * */ public final class FullStringSet extends StringSubtypeTreeElement { - public FullStringSet(final StringType string_type) { - super(string_type); + public FullStringSet(final StringType stringType) { + super(stringType); } @Override @@ -23,7 +23,7 @@ public final class FullStringSet extends StringSubtypeTreeElement { @Override public EmptyStringSet complement() { - return new EmptyStringSet(string_type); + return new EmptyStringSet(stringType); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/IntegerLimit.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/IntegerLimit.java index 20b18152a1..63aa1ddd26 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/IntegerLimit.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/IntegerLimit.java @@ -16,7 +16,7 @@ public final class IntegerLimit extends LimitType { public static final IntegerLimit MAXIMUM = new IntegerLimit(ValueType.PLUS_INFINITY); public static final IntegerLimit MINIMUM = new IntegerLimit(ValueType.MINUS_INFINITY); - private final ValueType value_type; + private final ValueType valueType; private final BigInteger value; public enum ValueType { @@ -24,12 +24,12 @@ public final class IntegerLimit extends LimitType { } public IntegerLimit(final BigInteger value) { - value_type = ValueType.NUMBER; + valueType = ValueType.NUMBER; this.value = value; } - public IntegerLimit(final ValueType value_type) { - this.value_type = value_type; + public IntegerLimit(final ValueType valueType) { + this.valueType = valueType; value = BigInteger.ZERO; } @@ -40,23 +40,23 @@ public final class IntegerLimit extends LimitType { @Override public LimitType decrement() { - return (value_type == ValueType.NUMBER) ? new IntegerLimit(value.subtract(BigInteger.ONE)) : this; + return (valueType == ValueType.NUMBER) ? new IntegerLimit(value.subtract(BigInteger.ONE)) : this; } @Override public LimitType increment() { - return (value_type == ValueType.NUMBER) ? new IntegerLimit(value.add(BigInteger.ONE)) : this; + return (valueType == ValueType.NUMBER) ? new IntegerLimit(value.add(BigInteger.ONE)) : this; } @Override public boolean isAdjacent(final LimitType other) { final IntegerLimit il = (IntegerLimit) other; - return ((value_type == ValueType.NUMBER) && (il.value_type == ValueType.NUMBER) && value.add(BigInteger.ONE).equals(il.value)); + return ((valueType == ValueType.NUMBER) && (il.valueType == ValueType.NUMBER) && value.add(BigInteger.ONE).equals(il.value)); } @Override public void toString(final StringBuilder sb) { - switch (value_type) { + switch (valueType) { case MINUS_INFINITY: sb.append("-infinity"); break; @@ -72,13 +72,13 @@ public final class IntegerLimit extends LimitType { @Override public int compareTo(final LimitType other) { final IntegerLimit il = (IntegerLimit) other; - switch (value_type) { + switch (valueType) { case MINUS_INFINITY: - return (il.value_type == ValueType.MINUS_INFINITY) ? 0 : -1; + return (il.valueType == ValueType.MINUS_INFINITY) ? 0 : -1; case PLUS_INFINITY: - return (il.value_type == ValueType.PLUS_INFINITY) ? 0 : 1; + return (il.valueType == ValueType.PLUS_INFINITY) ? 0 : 1; default: - switch (il.value_type) { + switch (il.valueType) { case MINUS_INFINITY: return 1; case PLUS_INFINITY: @@ -101,7 +101,7 @@ public final class IntegerLimit extends LimitType { final IntegerLimit other = (IntegerLimit) obj; - return value_type == other.value_type && value.equals(other.value); + return valueType == other.valueType && value.equals(other.value); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/Range_ParsedSubType.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/Range_ParsedSubType.java index e78412d8da..0a4967ddf2 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/Range_ParsedSubType.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/Range_ParsedSubType.java @@ -28,11 +28,11 @@ public final class Range_ParsedSubType extends ParsedSubType { private Value max; private boolean maxExclusive; - public Range_ParsedSubType(final Value min, final boolean min_exclusive, final Value max, final boolean max_exclusive) { + public Range_ParsedSubType(final Value min, final boolean minExclusive, final Value max, final boolean maxExclusive) { this.min = min; - this.minExclusive = min_exclusive; + this.minExclusive = minExclusive; this.max = max; - this.maxExclusive = max_exclusive; + this.maxExclusive = maxExclusive; } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealLimit.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealLimit.java index 0dd449a1f0..d0996b8e0e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealLimit.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealLimit.java @@ -29,11 +29,11 @@ public final class RealLimit extends LimitType { public static final RealLimit MAXIMUM = new RealLimit(Double.POSITIVE_INFINITY); public static final RealLimit MINIMUM = new RealLimit(Double.NEGATIVE_INFINITY); - private final ValueType value_type; + private final ValueType valueType; private final double value; private RealLimit(final ValueType vt, final double d) { - value_type = vt; + valueType = vt; value = d; } @@ -41,7 +41,7 @@ public final class RealLimit extends LimitType { if (Double.isNaN(d)) { ErrorReporter.INTERNAL_ERROR("NaN range limit"); } - value_type = ValueType.EXACT; + valueType = ValueType.EXACT; value = d; } @@ -51,7 +51,7 @@ public final class RealLimit extends LimitType { @Override public LimitType decrement() { - switch (value_type) { + switch (valueType) { case UPPER: return new RealLimit(value); default: @@ -66,7 +66,7 @@ public final class RealLimit extends LimitType { @Override public LimitType increment() { - switch (value_type) { + switch (valueType) { case LOWER: return new RealLimit(value); default: @@ -77,12 +77,12 @@ public final class RealLimit extends LimitType { @Override public boolean isAdjacent(final LimitType other) { RealLimit rl = (RealLimit) other; - return ((Double.compare(value, rl.value) == 0) && ((value_type.value() + 1) == rl.value_type.value())); + return ((Double.compare(value, rl.value) == 0) && ((valueType.value() + 1) == rl.valueType.value())); } @Override public void toString(final StringBuilder sb) { - if (value_type != ValueType.EXACT) { + if (valueType != ValueType.EXACT) { sb.append('!'); } sb.append(value); @@ -94,7 +94,7 @@ public final class RealLimit extends LimitType { // compare the double values with "natural ordering" compare, // where -0.0 < 0.0 ... INF < NaN final int rv = Double.compare(value, rl.value); - return (rv != 0) ? rv : (value_type.value() - rl.value_type.value()); + return (rv != 0) ? rv : (valueType.value() - rl.valueType.value()); } @Override @@ -109,7 +109,7 @@ public final class RealLimit extends LimitType { final RealLimit other = (RealLimit) obj; - return value_type == other.value_type && Double.compare(value, other.value) == 0; + return valueType == other.valueType && Double.compare(value, other.value) == 0; } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealRangeListConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealRangeListConstraint.java index bd3047f48d..176d86601d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealRangeListConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/RealRangeListConstraint.java @@ -16,53 +16,53 @@ package org.eclipse.titan.designer.AST.TTCN3.types.subtypes; * @author Adam Delic */ public final class RealRangeListConstraint extends SubtypeConstraint { - private final boolean has_nan; + private final boolean hasNan; private final RangeListConstraint rlc; /** empty set constructor */ public RealRangeListConstraint() { - has_nan = false; + hasNan = false; rlc = new RangeListConstraint(LimitType.Type.REAL); } /** single value set */ public RealRangeListConstraint(final Double d) { if (Double.isNaN(d)) { - has_nan = true; + hasNan = true; rlc = new RangeListConstraint(LimitType.Type.REAL); return; } - has_nan = false; + hasNan = false; rlc = new RangeListConstraint(new RealLimit(d)); } /** value range set */ - public RealRangeListConstraint(final RealLimit rl_begin, final RealLimit rl_end) { - has_nan = false; - rlc = new RangeListConstraint(rl_begin, rl_end); + public RealRangeListConstraint(final RealLimit rlBegin, final RealLimit rlEnd) { + hasNan = false; + rlc = new RangeListConstraint(rlBegin, rlEnd); } - private RealRangeListConstraint(final boolean has_nan, final RangeListConstraint rlc) { - this.has_nan = has_nan; + private RealRangeListConstraint(final boolean hasNan, final RangeListConstraint rlc) { + this.hasNan = hasNan; this.rlc = rlc; } @Override public RealRangeListConstraint complement() { - return new RealRangeListConstraint(!has_nan, rlc.complement()); + return new RealRangeListConstraint(!hasNan, rlc.complement()); } @Override public RealRangeListConstraint intersection(final SubtypeConstraint other) { RealRangeListConstraint o = (RealRangeListConstraint) other; - return new RealRangeListConstraint(has_nan && o.has_nan, rlc.intersection(o.rlc)); + return new RealRangeListConstraint(hasNan && o.hasNan, rlc.intersection(o.rlc)); } @Override public boolean isElement(final Object o) { Double d = (Double) o; if (d.isNaN()) { - return has_nan; + return hasNan; } return rlc.isElement(new RealLimit(d)); @@ -70,25 +70,25 @@ public final class RealRangeListConstraint extends SubtypeConstraint { @Override public TernaryBool isEmpty() { - return rlc.isEmpty().and(TernaryBool.fromBool(!has_nan)); + return rlc.isEmpty().and(TernaryBool.fromBool(!hasNan)); } @Override public TernaryBool isEqual(final SubtypeConstraint other) { RealRangeListConstraint o = (RealRangeListConstraint) other; - return rlc.isEqual(o.rlc).and(TernaryBool.fromBool(has_nan == o.has_nan)); + return rlc.isEqual(o.rlc).and(TernaryBool.fromBool(hasNan == o.hasNan)); } @Override public TernaryBool isFull() { - return rlc.isFull().and(TernaryBool.fromBool(has_nan)); + return rlc.isFull().and(TernaryBool.fromBool(hasNan)); } @Override public void toString(final StringBuilder sb) { sb.append('('); rlc.toString(sb, false); - if (has_nan) { + if (hasNan) { if (rlc.isEmpty() != TernaryBool.TTRUE) { sb.append(", "); } @@ -100,7 +100,7 @@ public final class RealRangeListConstraint extends SubtypeConstraint { @Override public RealRangeListConstraint union(final SubtypeConstraint other) { RealRangeListConstraint o = (RealRangeListConstraint) other; - return new RealRangeListConstraint(has_nan || o.has_nan, rlc.union(o.rlc)); + return new RealRangeListConstraint(hasNan || o.hasNan, rlc.union(o.rlc)); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetConstraint.java index 05024abe05..5efd42d19e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetConstraint.java @@ -26,12 +26,12 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { PATTERN_CONSTRAINT } - private final ConstraintType constraint_type; + private final ConstraintType constraintType; private final SubtypeConstraint constraint; - public StringSetConstraint(final StringType string_type, final ConstraintType constraint_type, final SubtypeConstraint constraint) { - super(string_type); - this.constraint_type = constraint_type; + public StringSetConstraint(final StringType stringType, final ConstraintType constraintType, final SubtypeConstraint constraint) { + super(stringType); + this.constraintType = constraintType; this.constraint = constraint; } @@ -41,7 +41,7 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { } public ConstraintType getType() { - return constraint_type; + return constraintType; } public SubtypeConstraint getConstraint() { @@ -50,7 +50,7 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { @Override public StringSetConstraint complement() { - return new StringSetConstraint(string_type, constraint_type, constraint.complement()); + return new StringSetConstraint(stringType, constraintType, constraint.complement()); } @Override @@ -58,12 +58,12 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { StringSubtypeTreeElement o = (StringSubtypeTreeElement) other; if (o instanceof StringSetConstraint) { StringSetConstraint ssc = (StringSetConstraint) o; - if (ssc.constraint_type == constraint_type) { - return new StringSetConstraint(string_type, constraint_type, + if (ssc.constraintType == constraintType) { + return new StringSetConstraint(stringType, constraintType, constraint.intersection(((StringSetConstraint) o).constraint)); } } - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.INTERSECTION, this, o); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.INTERSECTION, this, o); return returnValue.evaluate(); } @@ -72,11 +72,11 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { StringSubtypeTreeElement o = (StringSubtypeTreeElement) other; if (o instanceof StringSetConstraint) { StringSetConstraint ssc = (StringSetConstraint) o; - if (ssc.constraint_type == constraint_type) { - return new StringSetConstraint(string_type, constraint_type, constraint.union(((StringSetConstraint) o).constraint)); + if (ssc.constraintType == constraintType) { + return new StringSetConstraint(stringType, constraintType, constraint.union(((StringSetConstraint) o).constraint)); } } - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.UNION, this, o); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.UNION, this, o); return returnValue.evaluate(); } @@ -85,11 +85,11 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { StringSubtypeTreeElement o = (StringSubtypeTreeElement) other; if (o instanceof StringSetConstraint) { StringSetConstraint ssc = (StringSetConstraint) o; - if (ssc.constraint_type == constraint_type) { - return new StringSetConstraint(string_type, constraint_type, constraint.except(((StringSetConstraint) o).constraint)); + if (ssc.constraintType == constraintType) { + return new StringSetConstraint(stringType, constraintType, constraint.except(((StringSetConstraint) o).constraint)); } } - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.EXCEPT, this, o); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.EXCEPT, this, o); return returnValue.evaluate(); } @@ -105,7 +105,7 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { StringSubtypeTreeElement o = (StringSubtypeTreeElement) other; if (o instanceof StringSetConstraint) { StringSetConstraint ssc = (StringSetConstraint) o; - if (constraint_type == ssc.constraint_type) { + if (constraintType == ssc.constraintType) { return constraint.isSubset(ssc.constraint); } } @@ -114,9 +114,9 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { @Override public boolean isElement(final Object o) { - switch (constraint_type) { + switch (constraintType) { case ALPHABET_CONSTRAINT: { - if (string_type == StringType.CHARSTRING) { + if (stringType == StringType.CHARSTRING) { String str = (String) o; for (int i = 0; i < str.length(); i++) { if (!constraint.isElement(new CharLimit(str.charAt(i)))) { @@ -135,7 +135,7 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { return true; } case SIZE_CONSTRAINT: { - if (string_type == StringType.CHARSTRING) { + if (stringType == StringType.CHARSTRING) { String str = (String) o; return constraint.isElement(new SizeLimit(str.length())); } @@ -169,7 +169,7 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { @Override public void toString(final StringBuilder sb) { - if (constraint_type == ConstraintType.SIZE_CONSTRAINT) { + if (constraintType == ConstraintType.SIZE_CONSTRAINT) { sb.append("length"); } constraint.toString(sb); @@ -178,10 +178,10 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { @Override public StringSubtypeTreeElement evaluate() { if (constraint.isEmpty() == TernaryBool.TTRUE) { - return new EmptyStringSet(string_type); + return new EmptyStringSet(stringType); } if (constraint.isFull() == TernaryBool.TTRUE) { - return new FullStringSet(string_type); + return new FullStringSet(stringType); } return this; } @@ -190,8 +190,8 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { * if this is a value list and the other is a size/alphabet/pattern * constraint then call the remove function of the value list */ - public StringSetConstraint remove(final StringSubtypeTreeElement other, final boolean if_element) { - if (constraint_type != ConstraintType.VALUE_CONSTRAINT) { + public StringSetConstraint remove(final StringSubtypeTreeElement other, final boolean ifElement) { + if (constraintType != ConstraintType.VALUE_CONSTRAINT) { return this; } @@ -203,25 +203,25 @@ public final class StringSetConstraint extends StringSubtypeTreeElement { switch (o.getType()) { case SIZE_CONSTRAINT: case ALPHABET_CONSTRAINT: { - if (string_type == StringType.CHARSTRING) { + if (stringType == StringType.CHARSTRING) { StringValueConstraint svc = (StringValueConstraint) constraint; - return new StringSetConstraint(string_type, constraint_type, svc.remove((RangeListConstraint) o.getConstraint(), - if_element)); + return new StringSetConstraint(stringType, constraintType, svc.remove((RangeListConstraint) o.getConstraint(), + ifElement)); } UStringValueConstraint usvc = (UStringValueConstraint) constraint; - return new StringSetConstraint(string_type, constraint_type, usvc.remove((RangeListConstraint) o.getConstraint(), if_element)); + return new StringSetConstraint(stringType, constraintType, usvc.remove((RangeListConstraint) o.getConstraint(), ifElement)); } case PATTERN_CONSTRAINT: { - if (string_type == StringType.CHARSTRING) { + if (stringType == StringType.CHARSTRING) { StringValueConstraint svc = (StringValueConstraint) constraint; - return new StringSetConstraint(string_type, constraint_type, svc.remove((StringPatternConstraint) o.getConstraint(), - if_element)); + return new StringSetConstraint(stringType, constraintType, svc.remove((StringPatternConstraint) o.getConstraint(), + ifElement)); } UStringValueConstraint usvc = (UStringValueConstraint) constraint; - return new StringSetConstraint(string_type, constraint_type, usvc.remove((StringPatternConstraint) o.getConstraint(), - if_element)); + return new StringSetConstraint(stringType, constraintType, usvc.remove((StringPatternConstraint) o.getConstraint(), + ifElement)); } default: return this; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetOperation.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetOperation.java index 4db8a21dbc..f8cac9f3ee 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetOperation.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSetOperation.java @@ -17,14 +17,14 @@ public final class StringSetOperation extends StringSubtypeTreeElement { INTERSECTION, INHERIT, UNION, EXCEPT } - private final OperationType operation_type; + private final OperationType operationType; private StringSubtypeTreeElement a; private StringSubtypeTreeElement b; - public StringSetOperation(final StringType string_type, final OperationType operation_type, final StringSubtypeTreeElement a, + public StringSetOperation(final StringType stringType, final OperationType operationType, final StringSubtypeTreeElement a, final StringSubtypeTreeElement b) { - super(string_type); - this.operation_type = operation_type; + super(stringType); + this.operationType = operationType; this.a = a; this.b = b; } @@ -36,20 +36,20 @@ public final class StringSetOperation extends StringSubtypeTreeElement { @Override public SubtypeConstraint complement() { - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.EXCEPT, new FullStringSet(string_type), this); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.EXCEPT, new FullStringSet(stringType), this); return returnValue.evaluate(); } @Override public SubtypeConstraint intersection(final SubtypeConstraint other) { - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.INTERSECTION, this, + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.INTERSECTION, this, (StringSubtypeTreeElement) other); return returnValue.evaluate(); } @Override public boolean isElement(final Object o) { - switch (operation_type) { + switch (operationType) { case INHERIT: case INTERSECTION: return a.isElement(o) && b.isElement(o); @@ -64,7 +64,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { @Override public TernaryBool isEmpty() { - switch (operation_type) { + switch (operationType) { case INHERIT: case INTERSECTION: return a.isEmpty().or(b.isEmpty()); @@ -87,7 +87,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { @Override public TernaryBool isFull() { - switch (operation_type) { + switch (operationType) { case INHERIT: case INTERSECTION: return a.isFull().and(b.isFull()); @@ -104,7 +104,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { public void toString(final StringBuilder sb) { sb.append('('); a.toString(sb); - switch (operation_type) { + switch (operationType) { case INHERIT: sb.append(" intersection "); break; @@ -126,13 +126,13 @@ public final class StringSetOperation extends StringSubtypeTreeElement { @Override public SubtypeConstraint union(final SubtypeConstraint other) { - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.UNION, this, (StringSubtypeTreeElement) other); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.UNION, this, (StringSubtypeTreeElement) other); return returnValue.evaluate(); } @Override public SubtypeConstraint except(final SubtypeConstraint other) { - StringSetOperation returnValue = new StringSetOperation(string_type, OperationType.EXCEPT, this, (StringSubtypeTreeElement) other); + StringSetOperation returnValue = new StringSetOperation(stringType, OperationType.EXCEPT, this, (StringSubtypeTreeElement) other); return returnValue.evaluate(); } @@ -150,26 +150,26 @@ public final class StringSetOperation extends StringSubtypeTreeElement { // special simple cases when one side is ET_ALL or ET_NONE but // the other can be a tree if ((a instanceof EmptyStringSet) || (b instanceof EmptyStringSet)) { - if ((operation_type == OperationType.INHERIT) || (operation_type == OperationType.INTERSECTION)) { - return new EmptyStringSet(string_type); + if ((operationType == OperationType.INHERIT) || (operationType == OperationType.INTERSECTION)) { + return new EmptyStringSet(stringType); } - if (operation_type == OperationType.UNION) { + if (operationType == OperationType.UNION) { return (a instanceof EmptyStringSet) ? a : b; } } - if ((b instanceof EmptyStringSet) && (operation_type == OperationType.EXCEPT)) { + if ((b instanceof EmptyStringSet) && (operationType == OperationType.EXCEPT)) { return a; } if ((a instanceof FullStringSet) || (b instanceof FullStringSet)) { - if ((operation_type == OperationType.INHERIT) || (operation_type == OperationType.INTERSECTION)) { + if ((operationType == OperationType.INHERIT) || (operationType == OperationType.INTERSECTION)) { return (a instanceof FullStringSet) ? b : a; } - if (operation_type == OperationType.UNION) { + if (operationType == OperationType.UNION) { return (a instanceof FullStringSet) ? a : b; } } - if ((b instanceof FullStringSet) && (operation_type == OperationType.EXCEPT)) { - return new EmptyStringSet(string_type); + if ((b instanceof FullStringSet) && (operationType == OperationType.EXCEPT)) { + return new EmptyStringSet(stringType); } // both operands must be single constraints @@ -181,7 +181,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { // special case: ALL - some constraint type that can be // complemented - if ((a instanceof FullStringSet) && (operation_type == OperationType.EXCEPT) && (b instanceof StringSetConstraint)) { + if ((a instanceof FullStringSet) && (operationType == OperationType.EXCEPT) && (b instanceof StringSetConstraint)) { switch (((StringSetConstraint) b).getType()) { case SIZE_CONSTRAINT: case ALPHABET_CONSTRAINT: @@ -193,7 +193,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { // isElement() can be called for the values // and drop values or drop the other operand set or both // depending on the operation - switch (operation_type) { + switch (operationType) { case INHERIT: case INTERSECTION: if (a instanceof StringSetConstraint) { @@ -243,8 +243,8 @@ public final class StringSetOperation extends StringSubtypeTreeElement { if (a.getElementType() == b.getElementType()) { switch (a.getElementType()) { case ALL: - if (operation_type == OperationType.EXCEPT) { - return new EmptyStringSet(string_type); + if (operationType == OperationType.EXCEPT) { + return new EmptyStringSet(stringType); } return a; @@ -255,7 +255,7 @@ public final class StringSetOperation extends StringSubtypeTreeElement { if (((StringSetConstraint) a).getType() == ConstraintType.PATTERN_CONSTRAINT) { break; } - switch (operation_type) { + switch (operationType) { case INHERIT: case INTERSECTION: return (StringSubtypeTreeElement) a.intersection(b); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSizeAndValueListConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSizeAndValueListConstraint.java index 080a306529..a427395b1c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSizeAndValueListConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSizeAndValueListConstraint.java @@ -226,7 +226,7 @@ public final class StringSizeAndValueListConstraint extends SubtypeConstraint { } } // drop ret_val.has_values elements that are elements of the - // ret_val.size_constraint set + // ret_val.sizeConstraint set for (Iterator<String> i = returnValue.hasValues.iterator(); i.hasNext();) { String str = i.next(); if (returnValue.sizeConstraint.isElement(new SizeLimit(str.length() / type.elemSize()))) { @@ -234,7 +234,7 @@ public final class StringSizeAndValueListConstraint extends SubtypeConstraint { } } // drop ret_val.not_values elements that are not elements of the - // ret_val.size_constraint set + // ret_val.sizeConstraint set for (Iterator<String> i = returnValue.notValues.iterator(); i.hasNext();) { String str = i.next(); if (!returnValue.sizeConstraint.isElement(new SizeLimit(str.length() / type.elemSize()))) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSubtypeTreeElement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSubtypeTreeElement.java index c5e5905d21..384a28bffc 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSubtypeTreeElement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringSubtypeTreeElement.java @@ -26,10 +26,10 @@ public abstract class StringSubtypeTreeElement extends SubtypeConstraint { CONSTRAINT } - protected final StringType string_type; + protected final StringType stringType; - protected StringSubtypeTreeElement(final StringType string_type) { - this.string_type = string_type; + protected StringSubtypeTreeElement(final StringType stringType) { + this.stringType = stringType; } public StringSubtypeTreeElement evaluate() { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringValueConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringValueConstraint.java index 16937f03c2..393ae9ba6e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringValueConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/StringValueConstraint.java @@ -146,7 +146,7 @@ public final class StringValueConstraint extends SubtypeConstraint { return new StringValueConstraint(returnValue); } default: - // illegal range_constraint type, ignore + // illegal rangeConstraint type, ignore return this; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/UStringValueConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/UStringValueConstraint.java index 95a29bfa6e..b76a628599 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/UStringValueConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/UStringValueConstraint.java @@ -113,12 +113,12 @@ public final class UStringValueConstraint extends SubtypeConstraint { sb.append(')'); } - public UStringValueConstraint remove(final RangeListConstraint range_constraint, final boolean ifElement) { - switch (range_constraint.getLimitType()) { + public UStringValueConstraint remove(final RangeListConstraint rangeConstraint, final boolean ifElement) { + switch (rangeConstraint.getLimitType()) { case SIZE: { Set<UniversalCharstring> returnValue = new TreeSet<UniversalCharstring>(); for (UniversalCharstring str : values) { - if (range_constraint.isElement(new SizeLimit(str.length())) != ifElement) { + if (rangeConstraint.isElement(new SizeLimit(str.length())) != ifElement) { returnValue.add(str); } } @@ -129,7 +129,7 @@ public final class UStringValueConstraint extends SubtypeConstraint { for (UniversalCharstring str : values) { boolean allCharsAreElements = true; for (int charIndex = 0; charIndex < str.length(); charIndex++) { - if (!range_constraint.isElement(new UCharLimit(str.get(charIndex)))) { + if (!rangeConstraint.isElement(new UCharLimit(str.get(charIndex)))) { allCharsAreElements = false; break; } @@ -141,7 +141,7 @@ public final class UStringValueConstraint extends SubtypeConstraint { return new UStringValueConstraint(returnValue); } default: - // illegal range_constraint type, ignore + // illegal rangeConstraint type, ignore return this; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListAndSizeConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListAndSizeConstraint.java index ae2404bb25..c21fbf6bcc 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListAndSizeConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListAndSizeConstraint.java @@ -42,8 +42,8 @@ public final class ValueListAndSizeConstraint extends SubtypeConstraint { } /** size range */ - public ValueListAndSizeConstraint(final SizeLimit l_begin, final SizeLimit l_end) { - sizeConstraint = new RangeListConstraint(l_begin, l_end); + public ValueListAndSizeConstraint(final SizeLimit lBegin, final SizeLimit lEnd) { + sizeConstraint = new RangeListConstraint(lBegin, lEnd); hasValues = new ValueListConstraint(); notValues = new ValueListConstraint(); } @@ -57,11 +57,11 @@ public final class ValueListAndSizeConstraint extends SubtypeConstraint { return returnValue; } - public ValueListAndSizeConstraint setOperation(final SubtypeConstraint other, final boolean is_union) { + public ValueListAndSizeConstraint setOperation(final SubtypeConstraint other, final boolean isUnion) { ValueListAndSizeConstraint o = (ValueListAndSizeConstraint) other; ValueListAndSizeConstraint returnValue = new ValueListAndSizeConstraint(); - returnValue.sizeConstraint = sizeConstraint.setOperation(o.sizeConstraint, is_union); - if (is_union) { + returnValue.sizeConstraint = sizeConstraint.setOperation(o.sizeConstraint, isUnion); + if (isUnion) { // V1+V2 returnValue.hasValues = hasValues.union(o.hasValues); // ~S1*N2 @@ -86,10 +86,10 @@ public final class ValueListAndSizeConstraint extends SubtypeConstraint { returnValue.hasValues = returnValue.hasValues.except(vlc); returnValue.notValues = returnValue.notValues.except(vlc); // drop ret_val.has_values elements that are elements of the - // ret_val.size_constraint set + // ret_val.sizeConstraint set returnValue.hasValues = returnValue.hasValues.remove(returnValue.sizeConstraint, true); // drop ret_val.not_values elements that are not elements of the - // ret_val.size_constraint set + // ret_val.sizeConstraint set returnValue.notValues = returnValue.notValues.remove(returnValue.sizeConstraint, false); return returnValue; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListConstraint.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListConstraint.java index c6c072bfd2..41c9f75d87 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListConstraint.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/subtypes/ValueListConstraint.java @@ -159,24 +159,24 @@ public final class ValueListConstraint extends SubtypeConstraint { /** * remove all elements whose size/length is inside/outside of - * size_constraint + * sizeConstraint */ - public ValueListConstraint remove(final RangeListConstraint size_constraint, final boolean if_element) { + public ValueListConstraint remove(final RangeListConstraint sizeConstraint, final boolean ifElement) { ArrayList<IValue> returnValue = new ArrayList<IValue>(); for (IValue v : values) { switch (v.getValuetype()) { case ARRAY_VALUE: - if (size_constraint.isElement(new SizeLimit(((Array_Value) v).getNofComponents())) != if_element) { + if (sizeConstraint.isElement(new SizeLimit(((Array_Value) v).getNofComponents())) != ifElement) { returnValue.add(v); } break; case SEQUENCEOF_VALUE: - if (size_constraint.isElement(new SizeLimit(((SequenceOf_Value) v).getNofComponents())) != if_element) { + if (sizeConstraint.isElement(new SizeLimit(((SequenceOf_Value) v).getNofComponents())) != ifElement) { returnValue.add(v); } break; case SETOF_VALUE: - if (size_constraint.isElement(new SizeLimit(((SetOf_Value) v).getNofComponents())) != if_element) { + if (sizeConstraint.isElement(new SizeLimit(((SetOf_Value) v).getNofComponents())) != ifElement) { returnValue.add(v); } break; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Altstep_Reference_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Altstep_Reference_Value.java index dc85d66f72..43f16e3ecc 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Altstep_Reference_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Altstep_Reference_Value.java @@ -37,10 +37,10 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; */ public final class Altstep_Reference_Value extends Value { - private Def_Altstep referedAltstep; + private Def_Altstep referredAltstep; - public Altstep_Reference_Value(final Def_Altstep referedAltstep) { - this.referedAltstep = referedAltstep; + public Altstep_Reference_Value(final Def_Altstep referredAltstep) { + this.referredAltstep = referredAltstep; } @Override @@ -51,12 +51,12 @@ public final class Altstep_Reference_Value extends Value { @Override public String createStringRepresentation() { StringBuilder builder = new StringBuilder("refers("); - builder.append(referedAltstep.getAssignmentName()).append(')'); + builder.append(referredAltstep.getAssignmentName()).append(')'); return builder.toString(); } - public Def_Altstep getReferedAltstep() { - return referedAltstep; + public Def_Altstep getReferredAltstep() { + return referredAltstep; } @Override @@ -104,7 +104,7 @@ public final class Altstep_Reference_Value extends Value { referenceChain.release(); return Value_type.ALTSTEP_REFERENCE_VALUE.equals(last.getValuetype()) - && referedAltstep == ((Altstep_Reference_Value) last).getReferedAltstep(); + && referredAltstep == ((Altstep_Reference_Value) last).getReferredAltstep(); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Function_Reference_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Function_Reference_Value.java index e28fd30e47..ceef067916 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Function_Reference_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Function_Reference_Value.java @@ -41,12 +41,12 @@ public final class Function_Reference_Value extends Value { private Definition referredFunction; - public Function_Reference_Value(final Def_Function referedFunction) { - this.referredFunction = referedFunction; + public Function_Reference_Value(final Def_Function referredFunction) { + this.referredFunction = referredFunction; } - public Function_Reference_Value(final Def_Extfunction referedFunction) { - this.referredFunction = referedFunction; + public Function_Reference_Value(final Def_Extfunction referredFunction) { + this.referredFunction = referredFunction; } @Override @@ -61,7 +61,7 @@ public final class Function_Reference_Value extends Value { return builder.toString(); } - public Definition getReferedFunction() { + public Definition getReferredFunction() { return referredFunction; } @@ -110,7 +110,7 @@ public final class Function_Reference_Value extends Value { referenceChain.release(); return Value_type.FUNCTION_REFERENCE_VALUE.equals(last.getValuetype()) - && referredFunction == ((Function_Reference_Value) last).getReferedFunction(); + && referredFunction == ((Function_Reference_Value) last).getReferredFunction(); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/NamedValue.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/NamedValue.java index ba97182669..136f64965a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/NamedValue.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/NamedValue.java @@ -152,6 +152,9 @@ public final class NamedValue extends ASTNode implements ILocateableNode, IIncre INamedNode inamedNode = getNameParent(); while (!(inamedNode instanceof IValue)) { + if( inamedNode == null) { + return null; //FIXME: this is just a temp solution! find the reason! + } inamedNode = inamedNode.getNameParent(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Testcase_Reference_Value.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Testcase_Reference_Value.java index 1aa69a6e2f..78f09aa631 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Testcase_Reference_Value.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/Testcase_Reference_Value.java @@ -37,10 +37,10 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; */ public final class Testcase_Reference_Value extends Value { - private Def_Testcase referedTestcase; + private Def_Testcase referredTestcase; public Testcase_Reference_Value(final Def_Testcase referredTestcase) { - this.referedTestcase = referredTestcase; + this.referredTestcase = referredTestcase; } @Override @@ -51,12 +51,12 @@ public final class Testcase_Reference_Value extends Value { @Override public String createStringRepresentation() { StringBuilder builder = new StringBuilder("refers("); - builder.append(referedTestcase.getAssignmentName()).append(')'); + builder.append(referredTestcase.getAssignmentName()).append(')'); return builder.toString(); } - public Def_Testcase getReferedTestcase() { - return referedTestcase; + public Def_Testcase getReferredTestcase() { + return referredTestcase; } @Override @@ -104,7 +104,7 @@ public final class Testcase_Reference_Value extends Value { referenceChain.release(); return Value_type.TESTCASE_REFERENCE_VALUE.equals(last.getValuetype()) - && referedTestcase == ((Testcase_Reference_Value) last).getReferedTestcase(); + && referredTestcase == ((Testcase_Reference_Value) last).getReferredTestcase(); } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/MTCComponentExpression.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/MTCComponentExpression.java index 1de4ebd04d..1b88f6054a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/MTCComponentExpression.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/MTCComponentExpression.java @@ -45,8 +45,10 @@ public final class MTCComponentExpression extends Expression_Value { @Override public IType getExpressionGovernor(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { - if (myGovernor != null) { - return myGovernor; + if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { + if (myGovernor != null) { + return myGovernor; + } } if (myScope != null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/RefersExpression.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/RefersExpression.java index 3e9c532a03..833bafdfe3 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/RefersExpression.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/RefersExpression.java @@ -42,14 +42,14 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; public final class RefersExpression extends Expression_Value { private static final String OPERANDERROR = "Reference to a function, external function, altstep or testcase was expected."; - private Reference refered; - private Assignment referedAssignment; + private Reference referred; + private Assignment referredAssignment; - public RefersExpression(final Reference refered) { - this.refered = refered; + public RefersExpression(final Reference referred) { + this.referred = referred; - if (refered != null) { - refered.setFullNameParent(this); + if (referred != null) { + referred.setFullNameParent(this); } } @@ -60,20 +60,20 @@ public final class RefersExpression extends Expression_Value { @Override public String createStringRepresentation() { - if (refered == null) { + if (referred == null) { return "<erroneous value>"; } StringBuilder builder = new StringBuilder(); - builder.append("refers(").append(refered.getDisplayName()).append(')'); + builder.append("refers(").append(referred.getDisplayName()).append(')'); return builder.toString(); } @Override public void setMyScope(final Scope scope) { super.setMyScope(scope); - if (refered != null) { - refered.setMyScope(scope); + if (referred != null) { + referred.setMyScope(scope); } } @@ -81,7 +81,7 @@ public final class RefersExpression extends Expression_Value { public StringBuilder getFullName(final INamedNode child) { StringBuilder builder = super.getFullName(child); - if (refered == child) { + if (referred == child) { return builder.append(OPERAND); } @@ -90,11 +90,11 @@ public final class RefersExpression extends Expression_Value { @Override public Type_type getExpressionReturntype(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { - if (referedAssignment == null) { + if (referredAssignment == null) { return Type_type.TYPE_UNDEFINED; } - switch (referedAssignment.getAssignmentType()) { + switch (referredAssignment.getAssignmentType()) { case A_FUNCTION: case A_FUNCTION_RTEMP: case A_FUNCTION_RVAL: @@ -130,16 +130,16 @@ public final class RefersExpression extends Expression_Value { * */ private void checkExpressionOperands(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) { - if (refered == null) { + if (referred == null) { return; } - referedAssignment = refered.getRefdAssignment(timestamp, false); - if (referedAssignment == null) { + referredAssignment = referred.getRefdAssignment(timestamp, false); + if (referredAssignment == null) { return; } - switch (referedAssignment.getAssignmentType()) { + switch (referredAssignment.getAssignmentType()) { case A_FUNCTION: case A_FUNCTION_RTEMP: case A_FUNCTION_RVAL: @@ -167,13 +167,13 @@ public final class RefersExpression extends Expression_Value { lastTimeChecked = timestamp; lastValue = this; - if (refered == null) { + if (referred == null) { return lastValue; } checkExpressionOperands(timestamp, expectedValue, referenceChain); - if (getIsErroneous(timestamp) || referedAssignment == null) { + if (getIsErroneous(timestamp) || referredAssignment == null) { return lastValue; } @@ -181,25 +181,25 @@ public final class RefersExpression extends Expression_Value { return lastValue; } - switch (referedAssignment.getAssignmentType()) { + switch (referredAssignment.getAssignmentType()) { case A_FUNCTION: case A_FUNCTION_RTEMP: case A_FUNCTION_RVAL: - lastValue = new Function_Reference_Value((Def_Function) referedAssignment); + lastValue = new Function_Reference_Value((Def_Function) referredAssignment); lastValue.copyGeneralProperties(this); break; case A_EXT_FUNCTION: case A_EXT_FUNCTION_RTEMP: case A_EXT_FUNCTION_RVAL: - lastValue = new Function_Reference_Value((Def_Extfunction) referedAssignment); + lastValue = new Function_Reference_Value((Def_Extfunction) referredAssignment); lastValue.copyGeneralProperties(this); break; case A_ALTSTEP: - lastValue = new Altstep_Reference_Value((Def_Altstep) referedAssignment); + lastValue = new Altstep_Reference_Value((Def_Altstep) referredAssignment); lastValue.copyGeneralProperties(this); break; case A_TESTCASE: - lastValue = new Testcase_Reference_Value((Def_Testcase) referedAssignment); + lastValue = new Testcase_Reference_Value((Def_Testcase) referredAssignment); lastValue.copyGeneralProperties(this); break; default: @@ -217,24 +217,24 @@ public final class RefersExpression extends Expression_Value { throw new ReParseException(); } - if (refered != null) { - refered.updateSyntax(reparser, false); - reparser.updateLocation(refered.getLocation()); + if (referred != null) { + referred.updateSyntax(reparser, false); + reparser.updateLocation(referred.getLocation()); } } @Override public void findReferences(final ReferenceFinder referenceFinder, final List<Hit> foundIdentifiers) { - if (refered == null) { + if (referred == null) { return; } - refered.findReferences(referenceFinder, foundIdentifiers); + referred.findReferences(referenceFinder, foundIdentifiers); } @Override protected boolean memberAccept(ASTVisitor v) { - if (refered != null && !refered.accept(v)) { + if (referred != null && !referred.accept(v)) { return false; } return true; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SelfComponentExpression.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SelfComponentExpression.java index 3ea315da83..dc7e257c43 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SelfComponentExpression.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SelfComponentExpression.java @@ -47,8 +47,10 @@ public final class SelfComponentExpression extends Expression_Value { @Override public IType getExpressionGovernor(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { - if (myGovernor != null) { - return myGovernor; + if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { + if (myGovernor != null) { + return myGovernor; + } } if (myScope == null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SystemComponentExpression.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SystemComponentExpression.java index 0fc5c80899..de4dd7a217 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SystemComponentExpression.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/values/expressions/SystemComponentExpression.java @@ -45,8 +45,10 @@ public final class SystemComponentExpression extends Expression_Value { @Override public IType getExpressionGovernor(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue) { - if (myGovernor != null) { - return myGovernor; + if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) { + if (myGovernor != null) { + return myGovernor; + } } if (myScope != null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Type.java index ca125ea7ed..5db706c7e8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Type.java @@ -239,9 +239,9 @@ public abstract class Type extends Governor implements IType, IIncrementallyUpda @Override public IType getFieldType(final CompilationTimeStamp timestamp, final Reference reference, final int actualSubReference, - final Expected_Value_type expected_index, final boolean interrupt_if_optional) { + final Expected_Value_type expectedIndex, final boolean interruptIfOptional) { IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true); - IType temp = getFieldType(timestamp, reference, actualSubReference, expected_index, chain, interrupt_if_optional); + IType temp = getFieldType(timestamp, reference, actualSubReference, expectedIndex, chain, interruptIfOptional); chain.release(); return temp; @@ -413,15 +413,15 @@ public abstract class Type extends Governor implements IType, IIncrementallyUpda public void checkThisValue(final CompilationTimeStamp timestamp, final IValue value, final ValueCheckingOptions valueCheckingOptions) { value.setIsErroneous(false); - Definition def = getDefiningDefinition(); - if (def != null) { + final Assignment assignment = getDefiningAssignment(); + if (assignment != null && assignment instanceof Definition) { final Scope scope = value.getMyScope(); if (scope != null) { final Module module = scope.getModuleScope(); if (module != null) { final String referingModuleName = module.getName(); - if (!def.referingHere.contains(referingModuleName)) { - def.referingHere.add(referingModuleName); + if (!((Definition)assignment).referingHere.contains(referingModuleName)) { + ((Definition)assignment).referingHere.add(referingModuleName); } } else { ErrorReporter.logError("The value `" + value.getFullName() + "' does not appear to be in a module"); @@ -511,11 +511,11 @@ public abstract class Type extends Governor implements IType, IIncrementallyUpda return; } - Definition def = getDefiningDefinition(); - if (def != null) { + final Assignment myAssignment = getDefiningAssignment(); + if (myAssignment != null && myAssignment instanceof Definition) { String referingModuleName = value.getMyScope().getModuleScope().getName(); - if (!def.referingHere.contains(referingModuleName)) { - def.referingHere.add(referingModuleName); + if (!((Definition)myAssignment).referingHere.contains(referingModuleName)) { + ((Definition)myAssignment).referingHere.add(referingModuleName); } } @@ -929,11 +929,11 @@ public abstract class Type extends Governor implements IType, IIncrementallyUpda * the template to use. * */ protected void registerUsage(final ITTCN3Template template) { - final Definition def = getDefiningDefinition(); - if (def != null) { + final Assignment assignment = getDefiningAssignment(); + if (assignment != null && assignment instanceof Definition) { String referingModuleName = template.getMyScope().getModuleScope().getName(); - if (!def.referingHere.contains(referingModuleName)) { - def.referingHere.add(referingModuleName); + if (!((Definition)assignment).referingHere.contains(referingModuleName)) { + ((Definition)assignment).referingHere.add(referingModuleName); } } } @@ -1310,22 +1310,14 @@ public abstract class Type extends Governor implements IType, IIncrementallyUpda @Override public Assignment getDefiningAssignment() { - INamedNode parent = getNameParent(); - while (parent != null && !(parent instanceof Assignment)) { - parent = parent.getNameParent(); + if(getMyScope() == null) { + return null; } - return (Assignment) parent; - } - - @Override - public Definition getDefiningDefinition() { - INamedNode parent = getNameParent(); - while (parent != null && !(parent instanceof Definition)) { - parent = parent.getNameParent(); - } + Module module = getMyScope().getModuleScope(); + Assignment assignment = module.getEnclosingAssignment(getLocation().getOffset()); - return (Definition) parent; + return assignment; } @Override diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/Activator.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/Activator.java index 436e4fa0e0..c00046b246 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/Activator.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/Activator.java @@ -36,6 +36,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.IPreferencesService; @@ -51,6 +52,7 @@ import org.eclipse.titan.designer.parsers.GlobalParser; import org.eclipse.titan.designer.preferences.PreferenceConstants; import org.eclipse.titan.designer.productUtilities.ProductConstants; import org.eclipse.titan.designer.properties.PropertyNotificationManager; +import org.eclipse.titan.designer.properties.data.ProjectBuildPropertyData; import org.eclipse.titan.designer.properties.data.ProjectFileHandler; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.IActivityManager; @@ -323,7 +325,6 @@ public final class Activator extends AbstractUIPlugin { if ((projectDelta.getFlags() & IResourceDelta.DESCRIPTION) != 0) { TITANBuilder.markProjectForRebuild(project); - GlobalParser.getProjectSourceParser(project).setFullSemanticAnalysisNeeded(); } if (projectDelta.getKind() == IResourceDelta.ADDED) { @@ -381,9 +382,47 @@ public final class Activator extends AbstractUIPlugin { } catch (CoreException e) { ErrorReporter.logExceptionStackTrace(e); } - tempVisitor.reportOutdatedFiles(); - GlobalParser.getProjectSourceParser(project).analyzeAll(false); - // It is of no importance when this analysis will run, or end for that matter. + final WorkspaceJob[] outdatingJobs = tempVisitor.reportOutdatedFiles(); + + WorkspaceJob analyzeAfterOutdating = new WorkspaceJob("analyzeAfterOutdating") { + @Override + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + //Wait for reportOutdatedFiles() to finish + try { + for (WorkspaceJob job : outdatingJobs) { + if(job != null) { + job.join(); + } + } + } catch (InterruptedException e) { + ErrorReporter.logExceptionStackTrace(e); + } + + GlobalParser.getProjectSourceParser(project).analyzeAll(false); + // It is of no importance when this analysis will run, or end for that matter. + + boolean usesInternal; + try { + usesInternal = "true".equals(project.getPersistentProperty(new QualifiedName(ProjectBuildPropertyData.QUALIFIER, + ProjectBuildPropertyData.GENERATE_INTERNAL_MAKEFILE_PROPERTY))); + } catch (CoreException e) { + usesInternal = false; + } + if (usesInternal) { + TITANBuilder.markProjectForRebuild(project); + TITANBuilder.removeMakefile(project, false); + } + + return Status.OK_STATUS; + } + }; + analyzeAfterOutdating.setPriority(Job.LONG); + analyzeAfterOutdating.setUser(false); + analyzeAfterOutdating.setSystem(true); + analyzeAfterOutdating.setRule(project.getWorkspace().getRuleFactory().refreshRule(project)); + analyzeAfterOutdating.setProperty(IProgressConstants.ICON_PROPERTY, ImageCache.getImageDescriptor("titan.gif")); + analyzeAfterOutdating.schedule(); + return Status.OK_STATUS; } }; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GeneralConstants.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GeneralConstants.java index 2636ea22e6..38ec739f15 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GeneralConstants.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GeneralConstants.java @@ -20,7 +20,7 @@ import org.eclipse.titan.designer.properties.data.FolderBuildPropertyData; */ public final class GeneralConstants { public static final ProductIdentity ON_THE_FLY_ANALYZER_VERSION = - ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 2, 0); + ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 3, 0); public static final boolean DEBUG = true; public static final boolean ETSI_BUILD = false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GlobalDeltaVisitor.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GlobalDeltaVisitor.java index daca17df6b..4f04e8109b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GlobalDeltaVisitor.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/GlobalDeltaVisitor.java @@ -17,6 +17,7 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.titan.designer.commonFilters.ResourceExclusionHelper; import org.eclipse.titan.designer.core.ProjectBasedBuilder; import org.eclipse.titan.designer.parsers.FileSaveTracker; @@ -83,10 +84,12 @@ public final class GlobalDeltaVisitor implements IResourceDeltaVisitor { /** * Reports the collected list of outdated files, to let the internal storage know, that their data is outdated.. * */ - public void reportOutdatedFiles() { + public WorkspaceJob[] reportOutdatedFiles() { + WorkspaceJob[] jobs = new WorkspaceJob[2]; if (!outdatedFiles.isEmpty()) { - GlobalParser.getProjectSourceParser(project).reportOutdating(outdatedFiles); - GlobalParser.getConfigSourceParser(project).reportOutdating(outdatedFiles); + jobs[0] = GlobalParser.getProjectSourceParser(project).reportOutdating(outdatedFiles); + jobs[1] = GlobalParser.getConfigSourceParser(project).reportOutdating(outdatedFiles); } + return jobs; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/ConvertXSD2TTCN.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/ConvertXSD2TTCN.java index 914bcbdc18..5946e28ea0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/ConvertXSD2TTCN.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/ConvertXSD2TTCN.java @@ -21,7 +21,6 @@ import org.eclipse.jface.action.IAction; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.path.PathConverter; import org.eclipse.titan.designer.consoles.TITANDebugConsole; @@ -97,7 +96,7 @@ public final class ConvertXSD2TTCN extends ExternalTitanAction { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - DirectoryDialog dialog = new DirectoryDialog(new Shell(Display.getDefault()), SWT.SAVE); + DirectoryDialog dialog = new DirectoryDialog(null, SWT.SAVE); dialog.setFilterPath(project.getLocation().toOSString()); String outFolder = dialog.open(); if (outFolder != null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/NatureConverter.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/NatureConverter.java index 8559a51ab3..a6811d1406 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/NatureConverter.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/actions/NatureConverter.java @@ -25,7 +25,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.utils.SelectionUtils; import org.eclipse.titan.designer.Activator; @@ -149,8 +148,7 @@ public final class NatureConverter extends AbstractHandler implements IObjectAct Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - Shell shell = new Shell(Display.getDefault()); - PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(shell, tempProject, GeneralConstants.PROJECT_PROPERTY_PAGE, null, null); + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(null, tempProject, GeneralConstants.PROJECT_PROPERTY_PAGE, null, null); if (dialog != null) { dialog.open(); } @@ -160,7 +158,7 @@ public final class NatureConverter extends AbstractHandler implements IObjectAct Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - if (MessageDialog.openConfirm(new Shell(Display.getDefault()), NATURE_REMOVAL_TITLE, NATURE_REMOVAL_MESSAGE + if (MessageDialog.openConfirm(null, NATURE_REMOVAL_TITLE, NATURE_REMOVAL_MESSAGE + tempProject.getName() + '?')) { natureIds.remove(index); description.setNatureIds(natureIds.toArray(new String[natureIds.size()])); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/application/LoadFromTpd.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/application/LoadFromTpd.java index bf91507a88..f090f47fa9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/application/LoadFromTpd.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/application/LoadFromTpd.java @@ -21,7 +21,6 @@ import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.wizards.projectFormat.TpdImporter; @@ -71,7 +70,7 @@ public class LoadFromTpd implements IApplication { } try { - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(true, false, new IRunnableWithProgress() { + new ProgressMonitorDialog(null).run(true, false, new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AnalyzerFactory.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AnalyzerFactory.java new file mode 100644 index 0000000000..853193723e --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AnalyzerFactory.java @@ -0,0 +1,45 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; +import org.eclipse.titan.designer.preferences.PreferenceConstantValues; +import org.eclipse.titan.designer.preferences.PreferenceConstants; +import org.eclipse.titan.designer.productUtilities.ProductConstants; + +/** + * Factory class to create instance of IBaseAnalyzer. + * + * @author Peter Olah + */ +public final class AnalyzerFactory { + + private AnalyzerFactory() { + } + + public static IBaseAnalyzer getAnalyzer(final CompilationTimeStamp timestamp) { + + SelectionAlgorithm selectionAlgorithm = SelectionAlgorithm.fromString(Platform.getPreferencesService().getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.MODULESELECTIONALGORITHM, PreferenceConstantValues.MODULESELECTIONORIGINAL, null)); + + if (selectionAlgorithm == null) { + selectionAlgorithm = SelectionAlgorithm.getDefaultValue(); + } + + switch (selectionAlgorithm) { + case MODULESELECTIONORIGINAL: + return new OriginalModuleSelection(); + case BROKENREFERENCESINVERTED: + return new BrokenPartsViaReferences(SelectionAlgorithm.BROKENREFERENCESINVERTED, timestamp); + } + + return null; + } + + +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandler.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandler.java new file mode 100644 index 0000000000..54d5c554e0 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandler.java @@ -0,0 +1,187 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.titan.designer.AST.ASTVisitor; +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; + +/** + * @author Peter Olah + */ +public abstract class AssignmentHandler extends ASTVisitor implements IAssignmentChecker { + // The assignment this definition is representing + protected Assignment assignment; + + /** + * An infected assignment is an assignment that needs to be re-analyzed. + * + * It is important to note that some assignments can be infected without spreading it. + */ + private boolean isInfected; + + /** + * A contagious assignment is infected and all assignments referencing it need to be re-analyzed too. + * + * It is important to note that some assignments can be infected without spreading it. + */ + private boolean isContagious; + + /** + * The list of reasons an assignment needs to be re-analyzed. + * + * Servers debugging purpose. + * */ + private List<String> reasons; + + /** + * References within the assignment, that are not able to spread the need for analysis. + * */ + private Set<String> nonContagiousReferences; + + /** + * References within the assignment, that are able to spread the need for analysis. + * */ + private Set<String> contagiousReferences; + + /** + * References within the assignment, that are referring to an infected and contagious assignment. + * */ + private Set<String> infectedReferences; + + protected AssignmentHandler(Assignment assignment) { + this.assignment = assignment; + reasons = new ArrayList<String>(); + nonContagiousReferences = new HashSet<String>(); + contagiousReferences = new HashSet<String>(); + infectedReferences = new HashSet<String>(); + isInfected = false; + isContagious = false; + } + + public Assignment getAssignment() { + return assignment; + } + + public boolean getIsInfected() { + return isInfected; + } + + public void setIsInfected(boolean isBroken) { + this.isInfected = isBroken; + } + + public boolean getIsContagious() { + return isContagious; + } + + public void setIsContagious(boolean isAbleToSpread) { + this.isContagious = isAbleToSpread; + } + + public void initStartParts() { + setIsInfected(true); + setIsContagious(true); + } + + public void addReason(String reason) { + reasons.add(reason); + } + + public List<String> getReasons() { + return reasons; + } + + public Set<String> getNonContagiousReferences() { + return nonContagiousReferences; + } + + public boolean doNonContagiousReferencesContains(String name) { + return nonContagiousReferences.contains(name); + } + + public void addNonContagiousReferences(Collection<? extends String> references) { + nonContagiousReferences.addAll(references); + } + + public void addNonContagiousReference(String reference) { + nonContagiousReferences.add(reference); + } + + public Set<String> getContagiousReferences() { + return contagiousReferences; + } + + public boolean isContagiousReferencesContains(String name) { + return contagiousReferences.contains(name); + } + + public void addContagiousReferences(Collection<? extends String> references) { + contagiousReferences.addAll(references); + } + + public void addContagiousReference(String reference) { + contagiousReferences.add(reference); + } + + public void removeFromContagiousReferences(String reference) { + contagiousReferences.remove(reference); + } + + public Set<String> getInfectedReferences() { + return infectedReferences; + } + + public void addInfectedReferences(Collection<? extends String> references) { + infectedReferences.addAll(references); + } + + public void addInfectedReference(String reference) { + infectedReferences.add(reference); + } + + @Override + public String toString() { + return assignment.getIdentifier().getDisplayName(); + } + + public boolean isVisibleIn(Module dependentModule) { + return assignment.getMyScope().getModuleScope().isVisible(CompilationTimeStamp.getBaseTimestamp(), dependentModule.getIdentifier(), assignment); + } + + @Override + public void check(AssignmentHandler definitionHandler) { + checkIsInfected(definitionHandler); + checkIsContagious(definitionHandler); + } + + public void checkIsInfected(AssignmentHandler other) { + String otherName = other.getAssignment().getIdentifier().getDisplayName(); + if (other.getIsInfected() && (doNonContagiousReferencesContains(otherName) || isContagiousReferencesContains(otherName))) { + addInfectedReference(otherName); + setIsInfected(true); + addReason("It uses " + otherName + "@" + other.getAssignment().getMyScope().getModuleScope().getIdentifier().getDisplayName() + " which is infected."); + } + } + + public void checkIsContagious(AssignmentHandler other) { + String otherName = other.getAssignment().getIdentifier().getDisplayName(); + if (other.getIsInfected() && isContagiousReferencesContains(otherName)) { + addInfectedReference(otherName); + setIsContagious(true); + addReason("It uses contagious reference " + otherName + "@" + other.getAssignment().getMyScope().getModuleScope().getIdentifier().getDisplayName() + " which is infected."); + } + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTGeneral.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTGeneral.java new file mode 100644 index 0000000000..a1c59161ed --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTGeneral.java @@ -0,0 +1,39 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import org.eclipse.titan.designer.AST.IVisitableNode; +import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; +import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; + +/** + * @author Peter Olah + */ +public final class AssignmentHandlerAFTGeneral extends AssignmentHandler { + + protected AssignmentHandlerAFTGeneral(Definition definition) { + super(definition); + } + + @Override + public int visit(IVisitableNode node) { + if (node instanceof StatementBlock) { + ReferenceCollector referenceCollector = new ReferenceCollector(); + node.accept(referenceCollector); + addNonContagiousReferences(referenceCollector.getReferencesAsString()); + return V_SKIP; + } + + if (node instanceof Reference) { + addContagiousReference(((Reference) node).getId().getDisplayName()); + } + + return V_CONTINUE; + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTRerences.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTRerences.java new file mode 100644 index 0000000000..99aa8ab1a7 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerAFTRerences.java @@ -0,0 +1,99 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.IVisitableNode; +import org.eclipse.titan.designer.AST.Identifier; +import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.ASN1.ASN1Assignment; +import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; + +/** + * + * @author Peter Olah + */ +public final class AssignmentHandlerAFTRerences extends ReferencesProcessor { + + public AssignmentHandlerAFTRerences(Assignment assignment) { + super(assignment); + } + + @Override + public void check(AssignmentHandler assignmentHandler) { + if (assignmentHandler instanceof AssignmentHandlerComponent) { + checkIsInfected((AssignmentHandlerComponent) assignmentHandler); + } else { + checkIsInfected(assignmentHandler); + } + checkIsContagious(assignmentHandler); + } + + private Set<String> computeIsInfected(Set<String> otherInfectedReferences) { + + Set<String> result = new HashSet<String>(); + + Set<String> intersectionWithNonContagiousReferences = new HashSet<String>(getNonContagiousReferences()); + intersectionWithNonContagiousReferences.retainAll(otherInfectedReferences); + + Set<String> intersectionWithContagiousReferences = new HashSet<String>(getContagiousReferences()); + intersectionWithContagiousReferences.retainAll(otherInfectedReferences); + + result.addAll(intersectionWithNonContagiousReferences); + result.addAll(intersectionWithContagiousReferences); + return result; + } + + public void checkIsInfected(AssignmentHandlerComponent other) { + if (!other.getIsInfected()) { + return; + } + + String otherName = other.getAssignment().getIdentifier().getDisplayName(); + if (other.getAssignment().getLastTimeChecked() == null) { + if (isContagiousReferencesContains(otherName)) { + setIsInfected(true); + addInfectedReference(otherName); + return; + } + } + Set<String> infectedReferences = computeIsInfected(other.getInfectedReferences()); + if (!infectedReferences.isEmpty() || isContagiousReferencesContains(otherName)) { + setIsInfected(true); + addReason("It uses " + otherName + "@" + other.getAssignment().getMyScope().getModuleScope().getIdentifier().getDisplayName() + " which is infected."); + } + } + + @Override + public int visit(IVisitableNode node) { + if (node instanceof ASN1Assignment) { + ASN1Assignment assignment = (ASN1Assignment) node; + if(assignment.getAssPard() != null) { + return V_SKIP; + } + } + if (node instanceof StatementBlock) { + ReferenceCollector referenceCollector = new ReferenceCollector(); + node.accept(referenceCollector); + Set<Reference> references = referenceCollector.getReferences();//TODO: broken if reference does not point anywhere + addNonContagiousReferences(computeReferences(references)); + if(containsErroneousReference(references)) { + setIsInfected(true); + } + return V_SKIP; + } + + if (node instanceof Reference) { + addContagiousReference(((Reference) node).getId().getDisplayName()); + } + return V_CONTINUE; + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerComponent.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerComponent.java new file mode 100644 index 0000000000..b277bc25a5 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerComponent.java @@ -0,0 +1,123 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.IVisitableNode; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; +import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeBody; +import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeReferenceList; + +/** + * + * @author Peter Olah + */ +public final class AssignmentHandlerComponent extends ReferencesProcessor { + + public AssignmentHandlerComponent(Assignment assignment) { + super(assignment); + componentDefinitions = new HashMap<Definition, Set<String>>(); + } + + private Map<Definition, Set<String>> componentDefinitions; + + public void collectDataFrom(ComponentTypeBody componentTypeBody) { + for (Definition tempDefinition : componentTypeBody.getDefinitions()) { + ReferenceCollector referenceCollector = new ReferenceCollector(); + tempDefinition.accept(referenceCollector); + Set<String> references = computeReferences(referenceCollector.getReferences()); + if (containsErroneousReference(referenceCollector.getReferences())) { + setIsInfected(true); + } + componentDefinitions.put(tempDefinition, references); + } + + processComponentTypeReferenceList(componentTypeBody.getAttributeExtensions()); + processComponentTypeReferenceList(componentTypeBody.getExtensions()); + } + + private void processComponentTypeReferenceList(ComponentTypeReferenceList componentTypeReferenceList) { + if (componentTypeReferenceList != null) { + ReferenceCollector referenceCollector = new ReferenceCollector(); + componentTypeReferenceList.accept(referenceCollector); + if (containsErroneousReference(referenceCollector.getReferences())) { + setIsInfected(true); + } + addContagiousReferences(computeReferences(referenceCollector.getReferences())); + } + } + + @Override + public Set<String> getNonContagiousReferences() { + Set<String> result = super.getNonContagiousReferences(); + + for (Map.Entry<Definition, Set<String>> entry : componentDefinitions.entrySet()) { + Set<String> references = entry.getValue(); + result.addAll(references); + } + + return result; + } + + @Override + public void check(AssignmentHandler assignmentHandler) { + checkIsInfected(assignmentHandler); + checkIsContagious(assignmentHandler); + } + + @Override + public void checkIsInfected(AssignmentHandler other) { + if (!other.getIsInfected()) { + return; + } + String otherName = other.getAssignment().getIdentifier().getDisplayName(); + if (other.getAssignment().getLastTimeChecked() == null) { + if (isContagiousReferencesContains(otherName)) { + setIsInfected(true); + addInfectedReference(otherName); + addReason("It uses " + otherName + "@" + other.getAssignment().getMyScope().getModuleScope().getIdentifier().getDisplayName() + " which is infected."); + return; + } + } + + Set<String> infectedFields = computeInfectedFields(otherName); + if (!infectedFields.isEmpty()) { + addContagiousReferences(infectedFields); + addInfectedReferences(infectedFields); + setIsInfected(true); + addReason("It uses " + otherName + "@" + other.getAssignment().getMyScope().getModuleScope().getIdentifier().getDisplayName() + " which is infected."); + } + } +//TODO ez lehetne boolean ? + private Set<String> computeInfectedFields(String definitionName) { + Set<String> result = new HashSet<String>(); + for (Map.Entry<Definition, Set<String>> entry : componentDefinitions.entrySet()) { + Set<String> references = entry.getValue(); + for (String referene : references) { + if (referene.equals(definitionName)) { + result.add(definitionName); + } + } + } + return result; + } + + @Override + public int visit(IVisitableNode node) { + if (node instanceof ComponentTypeBody) { + collectDataFrom((ComponentTypeBody) node); + return V_SKIP; + } + return V_CONTINUE; + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerFactory.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerFactory.java new file mode 100644 index 0000000000..344a212959 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/AssignmentHandlerFactory.java @@ -0,0 +1,45 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.IType; +import org.eclipse.titan.designer.AST.TTCN3.types.Component_Type; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; + +/** + * + * @author Peter Olah + */ +public final class AssignmentHandlerFactory { + + public static AssignmentHandler getDefinitionHandler(Assignment assignment) { + + switch (assignment.getAssignmentType()) { + case A_ALTSTEP: + case A_FUNCTION: + case A_FUNCTION_RTEMP: + case A_FUNCTION_RVAL: + case A_TESTCASE: + return new AssignmentHandlerAFTRerences(assignment); + case A_TYPE: + boolean compilationTimeStampIsNull = assignment.getLastTimeChecked() == null; + IType type = assignment.getType(CompilationTimeStamp.getBaseTimestamp()); + if (compilationTimeStampIsNull) { + assignment.resetLastTimeChecked(); + } + if (type instanceof Component_Type) { + return new AssignmentHandlerComponent(assignment); + } else { + return new AssignmentHandlerAFTRerences(assignment); + } + default: + return new AssignmentHandlerAFTRerences(assignment); + } + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsChecker.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsChecker.java new file mode 100644 index 0000000000..cbaeed601f --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsChecker.java @@ -0,0 +1,100 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.TTCN3.definitions.TTCN3Module; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; + +/** + * Helper class to check broken parts. + * + * @author Peter Olah + */ +public final class BrokenPartsChecker { + + private final SubProgressMonitor semanticMonitor; + + private final IProgressMonitor monitor; + + private final CompilationTimeStamp compilationCounter; + + private final SelectionMethodBase selectionMethod; + + public BrokenPartsChecker(final IProgressMonitor monitor, final CompilationTimeStamp compilationCounter, final SelectionMethodBase selectionMethod) { + this.compilationCounter = compilationCounter; + this.selectionMethod = selectionMethod; + this.monitor = monitor; + semanticMonitor = new SubProgressMonitor(this.monitor, 1); + } + + public void doChecking() { + monitor.subTask("Semantic checking"); + + switch (selectionMethod.getSelectionAlgorithm()) { + case MODULESELECTIONORIGINAL: + generalChecker(); + break; + case BROKENREFERENCESINVERTED: + BrokenPartsViaReferences brokenParts = (BrokenPartsViaReferences)selectionMethod; + Map<Module, List<Assignment>> moduleAndBrokenDefinitions = brokenParts.getModuleAndBrokenDefs(); + if (brokenParts.getAnalyzeOnlyDefinitions()) { + definitionsChecker(moduleAndBrokenDefinitions); + } else { + generalChecker(); + } + break; + default: + generalChecker(); + break; + } + + + + monitor.subTask("Doing post semantic checks"); + + for (Module module : selectionMethod.getModulesToCheck()) { + module.postCheck(); + } + + semanticMonitor.done(); + } + //TODO check if this can be merged with the following one + private void generalChecker() { + semanticMonitor.beginTask("Semantic check", selectionMethod.getModulesToCheck().size()); + // process the modules one-by-one + for (final Module module : selectionMethod.getModulesToCheck()) { + semanticMonitor.subTask("Semantically checking module: " + module.getName()); + module.check(compilationCounter); + semanticMonitor.worked(1); + } + } + + private void definitionsChecker(Map<Module, List<Assignment>> moduleAndBrokenDefs) { + semanticMonitor.beginTask("Semantic check", moduleAndBrokenDefs.size()); + + for (Map.Entry<Module, List<Assignment>> entry : moduleAndBrokenDefs.entrySet()) { + Module module = entry.getKey(); + + semanticMonitor.subTask("Semantically checking broken parts in module: " + module.getName()); + + if (module instanceof TTCN3Module) { + ((TTCN3Module) module).checkWithDefinitions(compilationCounter, entry.getValue()); + } else { + module.check(compilationCounter); + } + semanticMonitor.worked(1); + } + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsViaReferences.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsViaReferences.java new file mode 100644 index 0000000000..88000002d0 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/BrokenPartsViaReferences.java @@ -0,0 +1,431 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.swt.widgets.Display; +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Assignments; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.TTCN3.definitions.TTCN3Module; +import org.eclipse.titan.designer.consoles.TITANDebugConsole; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; +import org.eclipse.titan.designer.preferences.PreferenceConstants; +import org.eclipse.titan.designer.productUtilities.ProductConstants; + +/** + * @author Peter Olah + */ +public final class BrokenPartsViaReferences extends SelectionMethodBase implements IBaseAnalyzer { + private CompilationTimeStamp timestamp; + private Map<Module, List<Assignment>> moduleAndBrokenAssignments; + private int brokenModulesLimit; + private boolean analyzeOnlyAssignments; + + protected BrokenPartsViaReferences(SelectionAlgorithm selectionAlgorithm, final CompilationTimeStamp timestamp) { + super(selectionAlgorithm); + moduleAndBrokenAssignments = new HashMap<Module, List<Assignment>>(); + analyzeOnlyAssignments = false; + brokenModulesLimit = Platform.getPreferencesService().getInt(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.BROKENMODULESRATIO, 100, null); + this.timestamp = timestamp; + header = "\n**Selection with Broken parts via references is started at:"; + footer = "**Selection with Broken parts via references is ended at: "; + } + + public Map<Module, List<Assignment>> getModuleAndBrokenDefs() { + return moduleAndBrokenAssignments; + } + + public boolean getAnalyzeOnlyDefinitions() { + return analyzeOnlyAssignments; + } + + @Override + public void execute() { + if (writeDebugInfo) { + TITANDebugConsole.println(String.format(format, header, simpleDateFormat.format(new Date()))); + } + start = System.nanoTime(); + + List<Module> startModules = new ArrayList<Module>(); + Map<Module, List<Module>> invertedImports = buildInvertedImportStructure(allModules, startModules); + + computeAnalyzeOnlyDefinitionsFlag(allModules, startModules); + + if (getAnalyzeOnlyDefinitions()) { + Map<Module, List<AssignmentHandler>> result = collectBrokenParts(startModules, invertedImports); + if (writeDebugInfo) { + writeDebugInfo(result); + } + collectRealBrokenParts(result); + } else { + List<Module> modules = collectBrokenModulesViaInvertedImports(startModules, invertedImports); + modulesToCheck.addAll(modules); + } + + afterExecute(); + + end = System.nanoTime() - start; + if (writeDebugInfo) { + TITANDebugConsole.println(String.format(format, footer, simpleDateFormat.format(new Date()))); + infoAfterExecute(); + } + } + + public void computeAnalyzeOnlyDefinitionsFlag(List<Module> allModules, List<Module> startModules) { + float brokenModulesRatio = (float) ((startModules.size() * 100.0) / allModules.size()); + if (Float.compare(brokenModulesRatio, (float) brokenModulesLimit) < 0) { + analyzeOnlyAssignments = true; + } + } + + /** + * It is build an inverted import structure and identify startmodules, which CompilationTimeStamp is null. + * + * @param allModules + * the list of modules to be check. Initially all modules. + * @param startModules + * the list of modules to be check. Initially all modules, but the function will remove those that can be skipped. + * + * @return invertedImports contains the next:<br> + * - key: a module.<br> + * - values: in these modules the key module is used, so all values imported this module, it is an inverted "imported" connection.<br> + * If module A import B, C, D and module B import D, E then the next structure will be built:<br> + * A = [],<br> + * B = [A],<br> + * C = [A],<br> + * D = [A, B],<br> + * E = [B]<br> + */ + protected Map<Module, List<Module>> buildInvertedImportStructure(final List<Module> allModules, final List<Module> startModules) { + + Map<Module, List<Module>> invertedImports = new HashMap<Module, List<Module>>(); + + for (Module actualModule : allModules) { + // Collect injured modules directly into startModules, we will start the checking from these modules. + // Collect modules which have not been checked semantically. + if ((actualModule.getLastCompilationTimeStamp() == null || !semanticallyChecked.contains(actualModule.getName())) && !startModules.contains(actualModule) ) { + startModules.add(actualModule); + } + + // We have to add all module to get a correct inverted import structure. + // It covers the case when a module is a top-level module, so it has't got any import. + if (!invertedImports.containsKey(actualModule)) { + invertedImports.put(actualModule, new ArrayList<Module>()); + } + + for (Module actualImportedModule : actualModule.getImportedModules()) { + if (!invertedImports.containsKey(actualImportedModule)) { + List<Module> temp = new ArrayList<Module>(); + temp.add(actualModule); + invertedImports.put(actualImportedModule, temp); + } else { + List<Module> dependentModules = invertedImports.get(actualImportedModule); + + if (!dependentModules.contains(actualModule)) { + dependentModules.add(actualModule); + } + } + } + } + + return invertedImports; + } + + protected List<Module> collectBrokenModulesViaInvertedImports(final List<Module> startModules, final Map<Module, List<Module>> invertedImports) { + + List<Module> startModulesCopy = new ArrayList<Module>(startModules); + + List<Module> result = new ArrayList<Module>(); + + for (int s = 0; s < startModulesCopy.size(); ++s) { + Module startModule = startModulesCopy.get(s); + if (!result.contains(startModule)) { + result.add(startModule); + } + List<Module> whereStartModuleUsed = invertedImports.get(startModule); + for (int d = 0; d < whereStartModuleUsed.size(); ++d) { + Module dependentModule = whereStartModuleUsed.get(d); + if (!startModulesCopy.contains(dependentModule)) { + startModulesCopy.add(dependentModule); + } + } + } + return result; + } + + protected Map<Module, List<AssignmentHandler>> collectBrokenParts(final List<Module> startModules, Map<Module, List<Module>> invertedImports) { + + List<Module> startModulesCopy = new ArrayList<Module>(startModules); + + Map<Module, List<AssignmentHandler>> moduleAndBrokenAssignments = new HashMap<Module, List<AssignmentHandler>>(); + + processStartModules(startModulesCopy, moduleAndBrokenAssignments); + + for (int i = 0; i < startModulesCopy.size(); ++i) { + Module startModule = startModulesCopy.get(i); + List<AssignmentHandler> startAssignments; + if (moduleAndBrokenAssignments.containsKey(startModule)) { + startAssignments = moduleAndBrokenAssignments.get(startModule); + } else { + startAssignments = getAssignmentsFrom(startModule); + moduleAndBrokenAssignments.put(startModule, startAssignments); + } + + if (!startAssignments.isEmpty()) { + List<Module> whereStartModuleUsed = invertedImports.get(startModule); + for (int j = 0; j < whereStartModuleUsed.size(); ++j) { + Module dependentModule = whereStartModuleUsed.get(j); + List<AssignmentHandler> dependentAssignments; + if (moduleAndBrokenAssignments.containsKey(dependentModule)) { + dependentAssignments = moduleAndBrokenAssignments.get(dependentModule); + } else { + dependentAssignments = getAssignmentsFrom(dependentModule); + moduleAndBrokenAssignments.put(dependentModule, dependentAssignments); + } + + // We have to separate broken and not broken definition, because of postcheck. + List<AssignmentHandler> brokens = new ArrayList<AssignmentHandler>(); + List<AssignmentHandler> notBrokens = new ArrayList<AssignmentHandler>(); + + for (int s = 0; s < startAssignments.size(); ++s) { + AssignmentHandler startAssignment = startAssignments.get(s); + if (startAssignment.getIsContagious()) { + for (int d = 0; d < dependentAssignments.size(); ++d) { + AssignmentHandler dependentAssignment = dependentAssignments.get(d); + dependentAssignment.check(startAssignment); + if (dependentAssignment.getIsInfected()) { + if (!startModulesCopy.contains(dependentModule)) { + startModulesCopy.add(dependentModule); + } + + brokens.add(dependentAssignment); + } + } + } + } + + for (int d = 0; d < dependentAssignments.size(); ++d) { + AssignmentHandler dependentAssignment = dependentAssignments.get(d); + if (!dependentAssignment.getIsInfected()) { + notBrokens.add(dependentAssignment); + } + } + + // Have to post check of local definition of modules. + // A definition can reference an other definition too. + checkLocalAssignments(brokens, notBrokens); + + // If dependent module not added startModules, + // it means it has not got broken definition, + // so we have to delete it from moduleAndBrokenDefs. + if (!startModulesCopy.contains(dependentModule)) { + moduleAndBrokenAssignments.remove(dependentModule); + } + + } + } + + } + + return moduleAndBrokenAssignments; + } + + protected void collectRealBrokenParts(Map<Module, List<AssignmentHandler>> moduleAndAssignments + ) { + for (Map.Entry<Module, List<AssignmentHandler>> entry : moduleAndAssignments.entrySet()) { + List<Assignment> assignments = new ArrayList<Assignment>(); + for (AssignmentHandler assignmentHandler : entry.getValue()) { + if (assignmentHandler.getIsInfected()) { + assignments.add(assignmentHandler.getAssignment()); + } + } + if (!assignments.isEmpty()) { + Module module = entry.getKey(); + moduleAndBrokenAssignments.put(module, assignments); + modulesToCheck.add(module); + } + } + } + + public void processStartModules(final List<Module> startModules, Map<Module, List<AssignmentHandler>> moduleAndBrokenAssignments) { + for (Module startModule : startModules) { + if (startModule instanceof TTCN3Module && startModule.getLastCompilationTimeStamp() != null) { + Assignments startAssignments = startModule.getAssignments(); + List<AssignmentHandler> brokens = new ArrayList<AssignmentHandler>(); + List<AssignmentHandler> notBrokens = new ArrayList<AssignmentHandler>(); + for (int d = 0; d < startAssignments.getNofAssignments(); ++d) { + Assignment startAssignment = startAssignments.getAssignmentByIndex(d); + AssignmentHandler assignmentHandler = AssignmentHandlerFactory.getDefinitionHandler(startAssignment); + boolean wasNull = false; + if (startAssignment.getLastTimeChecked() == null) { + wasNull = true; + startAssignment.check(timestamp); + } + startAssignment.accept(assignmentHandler); + if (wasNull) { + assignmentHandler.initStartParts(); + assignmentHandler.addReason("Definition's CompilationTimeStamp is null, because of incremental parsing."); + brokens.add(assignmentHandler); + } else if (assignmentHandler.getIsInfected()) { + assignmentHandler.addReason("Definition contains an infected reference."); + brokens.add(assignmentHandler); + } else { + notBrokens.add(assignmentHandler); + } + } + + if (!brokens.isEmpty()) { + checkLocalAssignments(brokens, notBrokens); + if (!moduleAndBrokenAssignments.containsKey(startModule)) { + moduleAndBrokenAssignments.put(startModule, brokens); + } else { + moduleAndBrokenAssignments.get(startModule).addAll(brokens); + } + } + } else { + startModule.check(timestamp); + List<AssignmentHandler> startAssignments = getAssignmentsFrom(startModule); + for (AssignmentHandler assignmentHandler : startAssignments) { + assignmentHandler.initStartParts(); + assignmentHandler.addReason("Parent module's CompilationTimeStamp is null."); + } + if (!moduleAndBrokenAssignments.containsKey(startModule)) { + moduleAndBrokenAssignments.put(startModule, startAssignments); + } else { + moduleAndBrokenAssignments.get(startModule).addAll(startAssignments); + } + } + } + } + + public List<AssignmentHandler> getAssignmentsFrom(Module module) { + List<AssignmentHandler> assignmentHandlers = new ArrayList<AssignmentHandler>(); + Assignments assignments = module.getAssignmentsScope(); + for (int d = 0; d < assignments.getNofAssignments(); ++d) { + Assignment assignment = assignments.getAssignmentByIndex(d); + AssignmentHandler assignmentHandler = AssignmentHandlerFactory.getDefinitionHandler(assignment); + assignment.accept(assignmentHandler); + assignmentHandlers.add(assignmentHandler); + } + + return assignmentHandlers; + } + + protected void checkLocalAssignments(final List<AssignmentHandler> brokens, final List<AssignmentHandler> notBrokens) { + + if (brokens.isEmpty() || notBrokens.isEmpty()) { + return; + } + + HashMap<String, AssignmentHandler> brokenMap = new HashMap<String, AssignmentHandler>(brokens.size() + notBrokens.size()); + for(AssignmentHandler handler: brokens) { + brokenMap.put(handler.getAssignment().getIdentifier().getDisplayName(), handler); + } + + boolean proceed = true; + while (proceed) { + proceed = false; + + + for (int i = notBrokens.size() -1; i >=0; --i) { + AssignmentHandler notBroken = notBrokens.get(i); + boolean found = false; + for (String name : notBroken.getContagiousReferences()) { + if(brokenMap.containsKey(name)) { + notBroken.check(brokenMap.get(name)); + found = true; + break; + } + } + if(!found) { + for (String name : notBroken.getNonContagiousReferences()) { + if(brokenMap.containsKey(name)) { + notBroken.check(brokenMap.get(name)); + found = true; + break; + } + } + } + + if(found) { + proceed = true; + notBrokens.remove(i); + brokens.add(notBroken); + brokenMap.put(notBroken.getAssignment().getIdentifier().getDisplayName(), notBroken); + } + } + } + } + + protected void writeDebugInfo(final Map<Module, List<AssignmentHandler>> moduleAndAssignments) { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + + TITANDebugConsole.println(" Detailed info:"); + + for (Map.Entry<Module, List<AssignmentHandler>> entry : moduleAndAssignments.entrySet()) { + List<AssignmentHandler> values = entry.getValue(); + + TITANDebugConsole.println(" module: " + entry.getKey().getIdentifier().getDisplayName()); + + for (AssignmentHandler assignmentHandler : values) { + TITANDebugConsole.println(" " + assignmentHandler + " | " + assignmentHandler.getReasons()); + if(assignmentHandler.getIsInfected() || assignmentHandler.getIsContagious()) { + TITANDebugConsole.println(" " + (assignmentHandler.getIsInfected() ? "[+]" : "[-]") + " : infected"); + TITANDebugConsole.println(" " + (assignmentHandler.getIsContagious() ? "[+]" : "[-]") + " : contagious"); + TITANDebugConsole.println(" nonContagious references: " + assignmentHandler.getNonContagiousReferences()); + TITANDebugConsole.println(" contagious references: " + assignmentHandler.getContagiousReferences()); + TITANDebugConsole.println(" infected references: " + assignmentHandler.getInfectedReferences()); + } + } + } + + TITANDebugConsole.println(" in dot format:"); + TITANDebugConsole.println(" digraph {"); + TITANDebugConsole.println(" rankdir=LR;"); + + ArrayList<Module> modules = new ArrayList<Module>(moduleAndAssignments.keySet()); + Collections.sort(modules, new Comparator<Module>() { + + @Override + public int compare(Module o1, Module o2) { + return o1.getName().compareTo(o2.getName()); + } + + }); + + for (Module module : modules) { + String moduleName = module.getName(); + TITANDebugConsole.println(" subgraph cluster_" + moduleName + " {"); + TITANDebugConsole.println(" label=\" " + module.getIdentifier().getDisplayName() + "\";"); + + List<AssignmentHandler> values = moduleAndAssignments.get(module); + + for (AssignmentHandler assignmentHandler : values) { + for(String reference: assignmentHandler.getInfectedReferences()) { + TITANDebugConsole.println(" " + assignmentHandler.getAssignment().getIdentifier().getDisplayName() + "->" + reference + ";"); + } + } + TITANDebugConsole.println(" }"); + } + TITANDebugConsole.println(" }"); + + } + }); + } +} \ No newline at end of file diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IAssignmentChecker.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IAssignmentChecker.java new file mode 100644 index 0000000000..ebb650df26 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IAssignmentChecker.java @@ -0,0 +1,15 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +/** + * @author Peter Olah + */ +public interface IAssignmentChecker { + public void check(AssignmentHandler definitionChecker); +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IBaseAnalyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IBaseAnalyzer.java new file mode 100644 index 0000000000..883e359884 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/IBaseAnalyzer.java @@ -0,0 +1,18 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +/** + * Base interface of selection algorithm. + * All algorithm have to implement this interface. + * + * @author Peter Olah + */ +public interface IBaseAnalyzer { + public void execute(); +} \ No newline at end of file diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/OriginalModuleSelection.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/OriginalModuleSelection.java new file mode 100644 index 0000000000..c43539e134 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/OriginalModuleSelection.java @@ -0,0 +1,226 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.AST.TTCN3.definitions.ImportModule; +import org.eclipse.titan.designer.AST.TTCN3.definitions.TTCN3Module; +import org.eclipse.titan.designer.consoles.TITANDebugConsole; +import org.eclipse.titan.designer.preferences.PreferenceConstants; +import org.eclipse.titan.designer.productUtilities.ProductConstants; +import org.eclipse.ui.console.MessageConsoleStream; + +/** + * Original solution wrapped into class. + * + */ +public final class OriginalModuleSelection extends SelectionMethodBase implements IBaseAnalyzer { + private boolean doIncrementalParsing; + + public OriginalModuleSelection() { + super(SelectionAlgorithm.MODULESELECTIONORIGINAL); + doIncrementalParsing = Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEINCREMENTALPARSING, false, null); + header = "\n**Selection with Original algorithm is started at:"; + footer = "**Selection with Original algorithm is started at:"; + } + + @Override + public void execute() { + if (writeDebugInfo){ + TITANDebugConsole.println(String.format(format, header, simpleDateFormat.format(new Date()))); + } + start = System.nanoTime(); + + boolean foundSkippable = true; + while (foundSkippable) { + foundSkippable = calculateModulesToSkip(allModules, modulesToSkip); + } + + modulesToCheck.addAll(allModules); + + //TODO check if this can be removed + if (doIncrementalParsing) { + incrementalParsing(); + } + + end = System.nanoTime() - start; + if (writeDebugInfo) { + TITANDebugConsole.println(String.format(format, footer, simpleDateFormat.format(new Date()))); + infoAfterExecute(); + } + } + + /** + * Calculates the list of modules that can be skipped when analyzing this project semantically. + * <p> + * This function might not be able to detect all modules that can be skipped at once. It should be run as long as it reports that it could remove new modules from the list of modules to be + * checked. + * + * @param modulesToCheck + * the list of modules to be check. Initially all modules, but the function will remove those that can be skipped. + * @param modulesToSkip + * the list of modules that can be skipped, to be generated by the function. + * + * @return true if there were modules found that can be skipped from analyzing, false otherwise. + */ + private boolean calculateModulesToSkip(final List<Module> modulesToCheck, final List<Module> modulesToSkip) { + if (modulesToCheck.isEmpty()) { + return false; + } + + boolean foundSkippable = false; + // proven to need checking + List<Module> failed = new ArrayList<Module>(); + List<Module> modulesToCheckCopy = new ArrayList<Module>(); + modulesToCheckCopy.addAll(modulesToCheck); + MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); + + for (Iterator<Module> iterator = modulesToCheckCopy.iterator(); iterator.hasNext();) { + Module module = iterator.next(); + if (module == null) { + continue; + } + if (failed.contains(module) || modulesToSkip.contains(module)) { + continue; + } + + if (module.getLastCompilationTimeStamp() == null || !semanticallyChecked.contains(module.getName())) { + if (writeDebugInfo) { + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it was not yet analyzed.", stream); + } + failed.add(module); + continue; + } + + /** + * The modules that are reachable from the starting one. + */ + List<Module> reachableModules = new ArrayList<Module>(); + reachableModules.add(module); + + boolean valid = true; + for (int i = 0; i < reachableModules.size() && valid; i++) { + Module module2 = reachableModules.get(i); + if (module2 == null) { + valid = false; + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it reaches a module that could not be parsed.", stream); + continue; + } + if (failed.contains(module2)) { + valid = false; + continue; + } + if (module2.getLastCompilationTimeStamp() != null || !semanticallyChecked.contains(module2.getName())) { + if (module2.hasUnhandledImportChanges()) { + valid = false; + failed.add(module2); + if (writeDebugInfo) { + TITANDebugConsole.println(" ** Module " + module2.getName() + " can not be skipped as it has unhandled import changes.", stream); + if (module != module2) { + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it depends on " + module2.getName() + " which has unhandled import changes.", stream); + } + } + continue; + } + List<Module> importedModules = module2.getImportedModules(); + if (!importedModules.isEmpty()) { + boolean allElements = true; + Module module3; + for (int j = 0; j < importedModules.size() && allElements; j++) { + module3 = importedModules.get(j); + if (module3 == null) { + // erroneous + // import + allElements = false; + if (writeDebugInfo) { + if (module2 instanceof TTCN3Module) { + final List<ImportModule> impModules = ((TTCN3Module) module2).getImports(); + if (j < impModules.size()) { + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it imports `" + impModules.get(j).getName() + "' that could not be parsed.", stream); + } + } + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it imports a module that could not be parsed.", stream); + } + } else if (failed.contains(module3)) { + allElements = false; + if (writeDebugInfo) { + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it depends on " + module3.getName() + " which needs to be checked.", stream); + } + } else if (modulesToSkip.contains(module3)) { + // already decided, that it can be skipped + } else if (module3.getLastCompilationTimeStamp() == null|| !semanticallyChecked.contains(module3.getName())) { + // imports a module that was not checked, so + // this must also be re-checked + allElements = false; + if (writeDebugInfo) { + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it depends on " + module3.getName() + " which was not yet analyzed.", stream); + } + } else { + if (!reachableModules.contains(module3)) { + reachableModules.add(module3); + } + } + } + + if (!allElements) { + valid = false; + } + } + } else { + // The module was not yet checked. + valid = false; + TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it depends on " + module2.getName() + " which was not yet checked.", stream); + } + } + + if (valid) { + modulesToSkip.addAll(reachableModules); + modulesToCheck.removeAll(reachableModules); + foundSkippable = true; + } else { + failed.add(module); + } + } + + if (writeDebugInfo) { + TITANDebugConsole.println(" ** Found " + modulesToCheck.size() + " modules that needs to be checked and " + modulesToSkip.size() + " modules to skip.", stream); + } + + return foundSkippable; + } + + // original solution + public void incrementalParsing() + { + // the modules that can be reached directly must + // be checked as the used state of the + // definitions might have changed + List<Module> modulesToCheck2 = new ArrayList<Module>(); + for (Module module2 : modulesToCheck) { + if (module2.getLastCompilationTimeStamp() != null && semanticallyChecked.contains(module2.getName())) { + List<Module> importedModules = module2.getImportedModules(); + if (importedModules != null && !importedModules.isEmpty()) { + for (Module module3 : importedModules) { + if (module3 != null && !modulesToCheck.contains(module3) && !modulesToCheck2.contains(module3)) { + modulesToCheck2.add(module3); + } + } + } + } + } + + modulesToCheck.addAll(modulesToCheck2); + modulesToSkip.removeAll(modulesToCheck2); + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferenceCollector.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferenceCollector.java new file mode 100644 index 0000000000..22f9c74c73 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferenceCollector.java @@ -0,0 +1,47 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.titan.designer.AST.ASTVisitor; +import org.eclipse.titan.designer.AST.IVisitableNode; +import org.eclipse.titan.designer.AST.Reference; + +/** + * @author Peter Olah + */ +public final class ReferenceCollector extends ASTVisitor { + + private Set<Reference> references; + + public Set<Reference> getReferences() { + return references; + } + + public Set<String> getReferencesAsString() { + Set<String> result = new HashSet<String>(); + for (Reference reference : references) { + result.add(reference.getId().getDisplayName()); + } + return result; + } + + public ReferenceCollector() { + references = new HashSet<Reference>(); + } + + @Override + public int visit(IVisitableNode node) { + if (node instanceof Reference) { + references.add(((Reference) node)); + } + return V_CONTINUE; + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferencesProcessor.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferencesProcessor.java new file mode 100644 index 0000000000..330eeb4807 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/ReferencesProcessor.java @@ -0,0 +1,58 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.parsers.CompilationTimeStamp; + +/** + * @author Peter Olah + */ +public abstract class ReferencesProcessor extends AssignmentHandler { + + public ReferencesProcessor(Assignment assignment) { + super(assignment); + } + + public Set<String> computeReferences(final Set<Reference> references) { + Set<String> result = new HashSet<String>(); + for (Reference reference : references) { + Assignment assignment = reference.getRefdAssignment(CompilationTimeStamp.getBaseTimestamp(), false); + + if (assignment != null && assignment.getIdentifier() != null) { + // the name of the assignment might differ from the reference in incremental parsing mode + result.add(assignment.getIdentifier().getDisplayName()); + + } else { + // if semantic error occurs, assignment will be null + // have to get reference id + result.add(reference.getId().getDisplayName()); + } + } + return result; + } + + public boolean containsErroneousReference(final Set<Reference> references) { + for (Reference reference : references) { + if(reference.getIsErroneous(CompilationTimeStamp.getBaseTimestamp())) { + return true; + } + + Assignment assignment = reference.getRefdAssignment(CompilationTimeStamp.getBaseTimestamp(), false); + if(assignment == null) { + return true; + } + } + + return false; + } +} diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionAlgorithm.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionAlgorithm.java new file mode 100644 index 0000000000..7c1f0f158c --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionAlgorithm.java @@ -0,0 +1,42 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import org.eclipse.titan.designer.preferences.PreferenceConstantValues; + +/** + * This is a helper class to map string of selection algorithm to enum value. + * + * @author Peter Olah + */ +public enum SelectionAlgorithm { + + MODULESELECTIONORIGINAL(PreferenceConstantValues.MODULESELECTIONORIGINAL), + BROKENREFERENCESINVERTED(PreferenceConstantValues.BROKENPARTSVIAREFERENCES); + + private String readableName; + + private SelectionAlgorithm(String name) { + readableName = name; + } + + public static SelectionAlgorithm fromString(String name) { + if (name != null) { + for (SelectionAlgorithm s : SelectionAlgorithm.values()) { + if (name.equalsIgnoreCase(s.readableName)) { + return s; + } + } + } + return null; + } + + public static SelectionAlgorithm getDefaultValue() { + return SelectionAlgorithm.MODULESELECTIONORIGINAL; + } +} \ No newline at end of file diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionMethodBase.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionMethodBase.java new file mode 100644 index 0000000000..91e833f8f8 --- /dev/null +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/brokenpartsanalyzers/SelectionMethodBase.java @@ -0,0 +1,103 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * 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.titan.designer.brokenpartsanalyzers; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.titan.designer.AST.Module; +import org.eclipse.titan.designer.consoles.TITANDebugConsole; +import org.eclipse.titan.designer.preferences.PreferenceConstants; +import org.eclipse.titan.designer.productUtilities.ProductConstants; + + +/** + * Base class of selection methods. + * It is responsible for store input, result and other things. + * + * @author Peter Olah + */ +public abstract class SelectionMethodBase { + + private final SelectionAlgorithm selectionAlgorithm; + + public SelectionAlgorithm getSelectionAlgorithm(){ + return selectionAlgorithm; + } + + protected List<Module> allModules; + + protected List<Module> modulesToCheck; + + public List<Module> getModulesToCheck() { + return modulesToCheck; + } + + protected List<Module> modulesToSkip; + + public List<Module> getModulesToSkip() { + return modulesToSkip; + } + + protected List<String> semanticallyChecked; + + protected long start; + + protected long end; + + protected boolean writeDebugInfo; + + protected SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss.SSS");; + + protected String format = "%s %s"; + + protected String header; + + protected String footer; + + public void setModules(final List<Module> allModules, final List<String> semanticallyChecked){ + modulesToCheck = new ArrayList<Module>(); + modulesToSkip = new ArrayList<Module>(); + this.allModules = new ArrayList<Module>(allModules); + this.semanticallyChecked = semanticallyChecked; + } + + protected SelectionMethodBase(SelectionAlgorithm selectionAlgorithm) { + this.selectionAlgorithm = selectionAlgorithm; + writeDebugInfo = Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null); + } + + protected void afterExecute() { + if (selectionAlgorithm != SelectionAlgorithm.MODULESELECTIONORIGINAL) { + for (Module module : allModules) { + if (!modulesToCheck.contains(module) && !modulesToSkip.contains(module)) { + modulesToSkip.add(module); + } + } + } + } + + protected void infoAfterExecute() { + TITANDebugConsole.println("**Selection time is: " + ( end * (1e-9) ) + " seconds " + "(" + end + " nanoseconds)."); + TITANDebugConsole.println("**Nr. of broken modules: " + modulesToCheck.size()); + TITANDebugConsole.println("**Broken modules name: " + modulesToCheck); + TITANDebugConsole.println(); + } + + public void setSkippedFromSemanticChecking() + { + for (Module module : modulesToSkip) { + module.setSkippedFromSemanticChecking(true); + } + for (Module module : modulesToCheck) { + module.setSkippedFromSemanticChecking(false); + } + } +} \ No newline at end of file diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/commonFilters/ResourceExclusionHelper.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/commonFilters/ResourceExclusionHelper.java index 55e132a49e..4e07028293 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/commonFilters/ResourceExclusionHelper.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/commonFilters/ResourceExclusionHelper.java @@ -112,7 +112,6 @@ public final class ResourceExclusionHelper { try { return "true".equalsIgnoreCase(file.getPersistentProperty(EXCLUDED_FILE_QUALIFIER)); } catch (CoreException e) { - ErrorReporter.logExceptionStackTrace("Error while checking persistent property of file: " + file.getName(), e); return false; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/CompilerVersionInformationCollector.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/CompilerVersionInformationCollector.java index 326785d7e1..54fa4f8df2 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/CompilerVersionInformationCollector.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/CompilerVersionInformationCollector.java @@ -24,6 +24,7 @@ import org.eclipse.titan.common.utils.Cygwin; import org.eclipse.titan.designer.actions.ExternalTitanAction; import org.eclipse.titan.designer.consoles.TITANConsole; import org.eclipse.titan.designer.consoles.TITANDebugConsole; +import org.eclipse.titan.designer.license.License; import org.eclipse.titan.designer.license.LicenseValidator; import org.eclipse.titan.designer.preferences.PreferenceConstants; import org.eclipse.titan.designer.productUtilities.ProductConstants; @@ -137,8 +138,9 @@ public final class CompilerVersionInformationCollector { PreferenceConstants.DISPLAYDEBUGINFORMATION, false, null); String ttcn3Dir = PathConverter.convert(path, reportDebugInformation, TITANDebugConsole.getConsole()); - - env.put(TTCN3_LICENSE_FILE_KEY, LicenseValidator.getResolvedLicenseFilePath(false)); + if( License.isLicenseNeeded() ) { + env.put(TTCN3_LICENSE_FILE_KEY, LicenseValidator.getResolvedLicenseFilePath(false)); + } env.put(TTCN3_DIR_KEY, ttcn3Dir); String temp = env.get(LD_LIBRARY_PATH_KEY); if (temp == null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/OutputAnalyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/OutputAnalyzer.java index bc63b69b15..eb648151de 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/OutputAnalyzer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/OutputAnalyzer.java @@ -49,6 +49,7 @@ public final class OutputAnalyzer { private IProject project; private boolean processedErrorMessages; + private int externalErrorCode = 0; static final Pattern BASE_TITAN_ERROR_PATTERN = Pattern.compile("[ ]*(.+):(.+):[ ]+(error|warning|note):[ ]+(.+)"); private final Matcher baseTITANErrorMatcher = BASE_TITAN_ERROR_PATTERN.matcher(""); @@ -70,6 +71,9 @@ public final class OutputAnalyzer { private final Matcher baseGCCErrorMatcher1 = BASE_GCC_ERROR_PATTERN_1.matcher(""); static final Pattern BASE_GCC_ERROR_PATTERN_2 = Pattern.compile("[ ]*(.+):(\\d+):(\\d+):[ ]+(.+)"); private final Matcher baseGCCErrorMatcher2 = BASE_GCC_ERROR_PATTERN_2.matcher(""); + + static final Pattern BASE_LINKER_ERROR_PATTERN_1 = Pattern.compile("^collect2:[ ]+error:[ ]+ld[ ]+returned[ ]+([1-9])[ ]+exit.*"); + private final Matcher baseLinkerErrorMatcher1 = BASE_LINKER_ERROR_PATTERN_1.matcher(""); private static final String ERROR = "error"; private static final String WARNING = "warning"; @@ -99,6 +103,14 @@ public final class OutputAnalyzer { public boolean hasProcessedErrorMessages() { return processedErrorMessages; } + + /** + * @return the error code from the external operation + * */ + public int getExternalErrorCode() { + return externalErrorCode; + } + /** * Disposes the objects that were buffered to speed up marker creation. @@ -185,6 +197,10 @@ public final class OutputAnalyzer { return addTITANMarker(baseGCCErrorMatcher2.group(1), Integer.parseInt(baseGCCErrorMatcher2.group(2)), Integer.parseInt(baseGCCErrorMatcher2.group(3)), Integer.parseInt(baseGCCErrorMatcher2.group(2)), Integer.parseInt(baseGCCErrorMatcher2.group(3)) + 1, WARNING, baseGCCErrorMatcher2.group(4)); + } else if (baseLinkerErrorMatcher1.reset(line).matches()) { + processedErrorMessages = true; + externalErrorCode = Integer.parseInt(baseLinkerErrorMatcher1.group(1)); + return true; } return false; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/ProjectBasedBuilder.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/ProjectBasedBuilder.java index 2b1c7b885c..5c55e3ba31 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/ProjectBasedBuilder.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/ProjectBasedBuilder.java @@ -212,6 +212,59 @@ public final class ProjectBasedBuilder { } } + /** + * @return a list of all projects referencing transitively the actual project. + * */ + public List<IProject> getAllReferencingProjects() { + List<IProject> referenceChain = new ArrayList<IProject>(); + List<IProject> knownProjects = new ArrayList<IProject>(); + + getAllReferencingProjects(referenceChain, project, knownProjects); + + return knownProjects; + } + + /** + * Calculates and returns a list of all projects referencing transitively the provided one. + * + * @param referenceChain + * a reference chain used to detect project reference + * cycles. + * @param actualProject + * the project being checked. + * @param knownProjects + * the projects already known, they shall not be added + * any more to the list. + * */ + private void getAllReferencingProjects(final List<IProject> referenceChain, final IProject actualProject, final List<IProject> knownProjects) { + if (knownProjects.contains(actualProject)) { + return; + } + + if (referenceChain.contains(actualProject)) { + knownProjects.add(actualProject); + return; + } + + IProject[] referencingProjects = ProjectBasedBuilder.getProjectBasedBuilder(actualProject).getReferencingProjects(); + + if (referencingProjects.length == 0) { + knownProjects.add(actualProject); + } + + int size = referenceChain.size(); + referenceChain.add(actualProject); + for (IProject temporalProject : referencingProjects) { + getAllReferencingProjects(referenceChain, temporalProject, knownProjects); + } + + referenceChain.remove(size); + + if (!knownProjects.contains(actualProject)) { + knownProjects.add(actualProject); + } + } + public IProject[] getReferencingProjects() { return project.getReferencingProjects(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANBuilder.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANBuilder.java index 72d92aee32..924b28a6eb 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANBuilder.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANBuilder.java @@ -1149,7 +1149,7 @@ public final class TITANBuilder extends IncrementalProjectBuilder { } internalMonitor.done(); - if (buildJob.foundErrors()) { + if (buildJob.foundErrors() || internalMonitor.isCanceled()) { if (getProject() != null && (kind == FULL_BUILD || kind == INCREMENTAL_BUILD)) { final IProject project2 = getProject(); WorkspaceJob op = new WorkspaceJob("Touching the project") { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANInstallationValidator.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANInstallationValidator.java index 19c84fa7db..8e7b1c8c5d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANInstallationValidator.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANInstallationValidator.java @@ -38,7 +38,7 @@ public final class TITANInstallationValidator { super.buttonPressed(buttonId); if (buttonId == 1) { - PreferencesUtil.createPreferenceDialogOn(new Shell(Display.getDefault()), + PreferencesUtil.createPreferenceDialogOn(null, "org.eclipse.titan.designer.preferences.pages.TITANPreferencePage", null, null).open(); } } @@ -48,8 +48,8 @@ public final class TITANInstallationValidator { private TITANInstallationValidator() { } - public static boolean check(final boolean force_dialog) { - if (!force_dialog && wasChecked) { + public static boolean check(final boolean forceDialog) { + if (!forceDialog && wasChecked) { return wasCorrect; } @@ -64,7 +64,7 @@ public final class TITANInstallationValidator { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - InstallationErrorDialog dialog = new InstallationErrorDialog(new Shell(Display.getDefault()), + InstallationErrorDialog dialog = new InstallationErrorDialog(null, "Checking for installed TITAN failed", "The installation path of TITAN is not set.\n\n" + CORRECTION_STRING); dialog.open(); @@ -86,7 +86,7 @@ public final class TITANInstallationValidator { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - InstallationErrorDialog dialog = new InstallationErrorDialog(new Shell(Display.getDefault()), + InstallationErrorDialog dialog = new InstallationErrorDialog(null, "Checking for installed TITAN failed", "No TITAN was found at " + installationPath + "\n\n" + CORRECTION_STRING); dialog.open(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANJob.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANJob.java index ab4d8c646e..109b74409e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANJob.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/core/TITANJob.java @@ -31,7 +31,6 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.utils.Cygwin; import org.eclipse.titan.designer.Activator; @@ -42,6 +41,7 @@ import org.eclipse.titan.designer.actions.ExternalTitanAction; import org.eclipse.titan.designer.consoles.TITANConsole; import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.titan.designer.graphics.ImageCache; +import org.eclipse.titan.designer.license.License; import org.eclipse.titan.designer.license.LicenseValidator; import org.eclipse.titan.designer.preferences.PreferenceConstants; import org.eclipse.titan.designer.productUtilities.ProductConstants; @@ -136,7 +136,9 @@ public class TITANJob extends WorkspaceJob { Map<String, String> env = pb.environment(); String ttcn3Dir = CompilerVersionInformationCollector.getResolvedInstallationPath(false); - env.put(TTCN3_LICENSE_FILE_KEY, LicenseValidator.getResolvedLicenseFilePath(false)); + if(License.isLicenseNeeded()) { + env.put(TTCN3_LICENSE_FILE_KEY, LicenseValidator.getResolvedLicenseFilePath(false)); + } env.put(TTCN3_DIR_KEY, ttcn3Dir); String temp = env.get(LD_LIBRARY_PATH_KEY); if (temp == null) { @@ -313,6 +315,12 @@ public class TITANJob extends WorkspaceJob { TITANConsole.println(line,stream); } int exitval = proc.waitFor(); + + if ((exitval == 0) && (analyzer.hasProcessedErrorMessages())) { + //make returns error if there was a linker error, but does not propagate the error code + exitval = analyzer.getExternalErrorCode(); + } + if (exitval != 0) { TITANConsole.println(FAILURE + exitval,stream); if (!analyzer.hasProcessedErrorMessages()) { @@ -418,19 +426,19 @@ public class TITANJob extends WorkspaceJob { } if (errorOutput == null || errorOutput.length() == 0) { if (cygwin) { - MessageDialog.openError(new Shell(Display.getDefault()), name + FAILED, builder.toString()); + MessageDialog.openError(null, name + FAILED, builder.toString()); ErrorReporter.logError(builder.toString()); } else { - MessageDialog.openError(new Shell(Display.getDefault()), name + FAILED, + MessageDialog.openError(null, name + FAILED, MessageFormat.format(CHECK_PERMISSION, builder.toString())); ErrorReporter.logError(MessageFormat.format(CHECK_PERMISSION, builder.toString())); } } else { if (cygwin) { - MessageDialog.openError(new Shell(Display.getDefault()), name + FAILED, builder.toString()); + MessageDialog.openError(null, name + FAILED, builder.toString()); ErrorReporter.logError(builder.toString()); } else { - MessageDialog.openError(new Shell(Display.getDefault()), name + FAILED, + MessageDialog.openError(null, name + FAILED, MessageFormat.format(ERRORS_FOUND, builder.toString(), errorOutput)); ErrorReporter.logError(MessageFormat.format(ERRORS_FOUND, builder.toString(), errorOutput)); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/declarationsearch/IdentifierFinderVisitor.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/declarationsearch/IdentifierFinderVisitor.java index 9e6b40d1ec..620f4ffb8e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/declarationsearch/IdentifierFinderVisitor.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/declarationsearch/IdentifierFinderVisitor.java @@ -16,6 +16,7 @@ import org.eclipse.titan.designer.AST.IVisitableNode; import org.eclipse.titan.designer.AST.Identifier; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Reference; +import org.eclipse.titan.designer.AST.ASN1.ASN1Assignment; /** * This class is similar to {@link ASTLocationChainVisitor} except it aborts as @@ -23,6 +24,7 @@ import org.eclipse.titan.designer.AST.Reference; * * @author Szabolcs Beres */ +//FIXME why identifierFinderVisitor if it searches for references ? public class IdentifierFinderVisitor extends ASTVisitor { private IReferencingElement reference = null; private ISubReference subReference = null; @@ -35,6 +37,13 @@ public class IdentifierFinderVisitor extends ASTVisitor { @Override public int visit(IVisitableNode node) { + if (node instanceof ASN1Assignment) { + ASN1Assignment assignment = (ASN1Assignment) node; + if(assignment.getAssPard() != null) { + return V_SKIP; + } + } + if (node instanceof ILocateableNode) { final Location loc = ((ILocateableNode) node).getLocation(); if (loc == null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/DeclarationCollector.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/DeclarationCollector.java index 66dd5391c3..c87e04e2da 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/DeclarationCollector.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/DeclarationCollector.java @@ -17,26 +17,19 @@ import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.TTCN3.definitions.Definition; import org.eclipse.titan.designer.AST.TTCN3.definitions.Group; -import org.eclipse.titan.designer.parsers.ProjectSourceParser; /** * @author Kristof Szabados * */ public final class DeclarationCollector { - /** - * A project parser, used by the collector to reach other modules from - * the given project. Can be null !!! - */ - private final ProjectSourceParser projectSourceParser; /** the reference to identify. */ private final Reference refrence; private final List<DeclarationCollectionHelper> collected; - public DeclarationCollector(final Reference reference, final ProjectSourceParser projectSourceParser) { + public DeclarationCollector(final Reference reference) { this.refrence = reference; - this.projectSourceParser = projectSourceParser; collected = new ArrayList<DeclarationCollectionHelper>(); } @@ -58,10 +51,6 @@ public final class DeclarationCollector { return collected; } - public ProjectSourceParser getProjectParser() { - return projectSourceParser; - } - public void addDeclaration(final String description, final Location location, final Scope scope) { collected.add(new DeclarationCollectionHelper(description, location, scope)); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OccurencesMarker.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OccurencesMarker.java index 72282212c9..cc23ed98a1 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OccurencesMarker.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OccurencesMarker.java @@ -212,12 +212,14 @@ public abstract class OccurencesMarker { Map<Annotation, Position> annotationMap = new HashMap<Annotation, Position>(); for (Hit hit : result) { - int hitOffset = hit.identifier.getLocation().getOffset(); - int hitEndOffset = hit.identifier.getLocation().getEndOffset(); - if( hitOffset>=0 && hitEndOffset>=0 && hitEndOffset>=hitOffset ) { - final Annotation annotationToAdd = new Annotation(ANNOTATION_TYPE, false, "Occurence of " + hit.identifier.getDisplayName()); - final Position position = new Position(hitOffset, hitEndOffset - hitOffset); - annotationMap.put(annotationToAdd, position); + if (hit.identifier != null) { + int hitOffset = hit.identifier.getLocation().getOffset(); + int hitEndOffset = hit.identifier.getLocation().getEndOffset(); + if( hitOffset>=0 && hitEndOffset>=0 && hitEndOffset>=hitOffset ) { + final Annotation annotationToAdd = new Annotation(ANNOTATION_TYPE, false, "Occurence of " + hit.identifier.getDisplayName()); + final Position position = new Position(hitOffset, hitEndOffset - hitOffset); + annotationMap.put(annotationToAdd, position); + } } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OpenDeclarationHelper.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OpenDeclarationHelper.java index 2244fa0ffa..69dd576f6e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OpenDeclarationHelper.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/OpenDeclarationHelper.java @@ -97,7 +97,7 @@ public final class OpenDeclarationHelper { return null; } - DeclarationCollector declarationCollector = new DeclarationCollector(reference, projectSourceParser); + DeclarationCollector declarationCollector = new DeclarationCollector(reference); scope.addDeclaration(declarationCollector); return declarationCollector; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ProposalCollector.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ProposalCollector.java index ec0de21f82..6b582dcff4 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ProposalCollector.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ProposalCollector.java @@ -103,7 +103,7 @@ public final class ProposalCollector { * @param targetIdentifierType * the type identifiers should use to display their * content - * @param context_id + * @param contextId * the identifier of the context where the proposals will * be inserted * @param contextType @@ -116,9 +116,9 @@ public final class ProposalCollector { * @param offset * the offset on which the reference starts * */ - public ProposalCollector(final Identifier_type targetIdentifierType, final String context_id, final TemplateContextType contextType, + public ProposalCollector(final Identifier_type targetIdentifierType, final String contextId, final TemplateContextType contextType, final IDocument doc, final Reference ref, final int offset) { - this(targetIdentifierType, null, context_id, contextType, doc, ref, offset); + this(targetIdentifierType, null, contextId, contextType, doc, ref, offset); } /** @@ -131,7 +131,7 @@ public final class ProposalCollector { * @param projectSourceParser * the projects parser or null. Used to collect * definitions from imported modules too. - * @param context_id + * @param contextId * the identifier of the context where the proposals will * be inserted * @param contextType @@ -144,11 +144,11 @@ public final class ProposalCollector { * @param offset * the offset on which the reference starts * */ - public ProposalCollector(final Identifier_type targetIdentifierType, final ProjectSourceParser projectSourceParser, final String context_id, + public ProposalCollector(final Identifier_type targetIdentifierType, final ProjectSourceParser projectSourceParser, final String contextId, final TemplateContextType contextType, final IDocument doc, final Reference ref, final int offset) { this.targetIdentifierType = targetIdentifierType; this.projectSourceParser = projectSourceParser; - this.contextId = context_id; + this.contextId = contextId; reference = ref; List<ISubReference> subreferences = ref.getSubreferences(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/OpenDeclaration.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/OpenDeclaration.java index 5c7d8b82aa..098758839f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/OpenDeclaration.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/OpenDeclaration.java @@ -20,8 +20,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.ASN1.definitions.ASN1Module; @@ -134,7 +132,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct } if (ResourceExclusionHelper.isExcluded(file)) { - MessageDialog.openError(new Shell(Display.getDefault()), "Open Declaration does not work within excluded resources", + MessageDialog.openError(null, "Open Declaration does not work within excluded resources", "This module is excluded from build. To use the Open Declaration " + "feature please click on the 'Toggle exclude from build state' in the context menu of the Project Explorer. "); return; @@ -187,7 +185,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct } OpenDeclarationLabelProvider labelProvider = new OpenDeclarationLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(null, labelProvider); dialog.setTitle("Open"); dialog.setMessage("Select the element to open"); dialog.setElements(collected.toArray()); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/ReconcilingStrategy.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/ReconcilingStrategy.java index 3585e8de16..c401d4dd06 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/ReconcilingStrategy.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/asn1editor/ReconcilingStrategy.java @@ -74,11 +74,11 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci fullReconciliation(true); } - private void fullReconciliation(final boolean is_initial) { + private void fullReconciliation(final boolean isInitial) { GlobalIntervalHandler.putInterval(document, null); IPreferencesService prefs = Platform.getPreferencesService(); if (prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEONTHEFLYPARSING, true, null)) { - analyze(is_initial); + analyze(isInitial); } else { Display.getDefault().asyncExec(new Runnable() { @Override @@ -95,7 +95,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci } } - void analyze(final boolean is_initial) { + void analyze(final boolean isInitial) { final IFile editedFile = (IFile) editor.getEditorInput().getAdapter(IFile.class); if (editedFile == null || ResourceExclusionHelper.isExcluded(editedFile)) { return; @@ -117,8 +117,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(project); projectSourceParser.reportOutdating(editedFile); - if (is_initial || !editor.isSemanticCheckingDelayed()) { - projectSourceParser.setFullSemanticAnalysisNeeded(); + if (isInitial || !editor.isSemanticCheckingDelayed()) { projectSourceParser.analyzeAll(); ProjectConfigurationParser projectConfigurationParser = GlobalParser.getConfigSourceParser(project); projectConfigurationParser.analyzeAll(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/OpenDeclaration.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/OpenDeclaration.java index 3b34f58a55..21e0c5c1f8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/OpenDeclaration.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/OpenDeclaration.java @@ -23,8 +23,6 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.Interval; import org.eclipse.titan.common.parsers.cfg.CfgDefinitionInformation; @@ -184,7 +182,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct */ public Object openCollectionListDialog(final List<?> collected) { OpenDeclarationLabelProvider labelProvider = new OpenDeclarationLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(null, labelProvider); dialog.setTitle("Open"); dialog.setMessage("Select the element to open"); dialog.setElements(collected.toArray()); @@ -269,8 +267,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct if (reference == null) { return false; } - DeclarationCollector declarationCollector = new DeclarationCollector(reference, GlobalParser.getProjectSourceParser(file - .getProject())); + DeclarationCollector declarationCollector = new DeclarationCollector(reference); ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(file.getProject()); String exactModuleName = refParser.getExactModuleName(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/GeneralOptionsSubPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/GeneralOptionsSubPage.java index 59abb6782c..f055f0745f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/GeneralOptionsSubPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/GeneralOptionsSubPage.java @@ -26,7 +26,6 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; @@ -559,7 +558,7 @@ public final class GeneralOptionsSubPage { loggingPage.createLoggingSection(); } - ParamDialog d = new ParamDialog(new Shell(Display.getDefault()), selectedLogEntry, null); + ParamDialog d = new ParamDialog(null, selectedLogEntry, null); if (d.open() == Window.OK) { PluginSpecificParam psp = createPluginSpecificParamNode(d.getName(), d.getValue()); paramViewer.setInput(selectedLogEntry); @@ -597,7 +596,7 @@ public final class GeneralOptionsSubPage { StructuredSelection selection = (StructuredSelection) paramViewer.getSelection(); PluginSpecificParam psp = (PluginSpecificParam) selection.getFirstElement(); - ParamDialog d = new ParamDialog(new Shell(Display.getDefault()), selectedLogEntry, psp); + ParamDialog d = new ParamDialog(null, selectedLogEntry, psp); if (d.open() == Window.OK) { if (psp.getParam() != null) { ConfigTreeNodeUtilities.removeFromChain(loggingSectionHandler.getLastSectionRoot(), psp.getParam() diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/ParamDialog.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/ParamDialog.java index 5bb0e56828..3aebceb44a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/ParamDialog.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/configeditor/pages/logging/ParamDialog.java @@ -46,7 +46,7 @@ public class ParamDialog extends TitleAreaDialog { public ParamDialog(final Shell parentShell, final LogParamEntry logentry, final PluginSpecificParam param) { super(parentShell); - setShellStyle(parentShell.getStyle() | SWT.RESIZE | SWT.PRIMARY_MODAL); + setShellStyle(getShellStyle() | SWT.RESIZE | SWT.PRIMARY_MODAL); isAddition = param == null; this.logentry = logentry; this.param = param; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/AddImport.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/AddImport.java index f241f3a2f9..bc43c6ae2d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/AddImport.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/AddImport.java @@ -20,7 +20,6 @@ import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.TextEdit; @@ -129,7 +128,7 @@ public final class AddImport implements IEditorActionDelegate { resultToInsert = collected.get(0); } else { OpenDeclarationLabelProvider labelProvider = new OpenDeclarationLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(null, labelProvider); dialog.setTitle("Add Import"); dialog.setMessage("Choose element to generate an import statement for."); dialog.setElements(collected.toArray()); @@ -186,7 +185,7 @@ public final class AddImport implements IEditorActionDelegate { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), "Study feature", + MessageDialog.openWarning(null, "Study feature", "Adding a missing importation is still under study"); } }); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/OpenDeclaration.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/OpenDeclaration.java index 61c6d21936..585807d2e0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/OpenDeclaration.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/OpenDeclaration.java @@ -7,8 +7,6 @@ ******************************************************************************/ package org.eclipse.titan.designer.editors.ttcn3editor; -import java.util.List; - import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -19,22 +17,14 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Module; -import org.eclipse.titan.designer.AST.ASN1.definitions.ASN1Module; import org.eclipse.titan.designer.commonFilters.ResourceExclusionHelper; import org.eclipse.titan.designer.consoles.TITANDebugConsole; import org.eclipse.titan.designer.core.TITANNature; import org.eclipse.titan.designer.declarationsearch.Declaration; import org.eclipse.titan.designer.declarationsearch.IdentifierFinderVisitor; -import org.eclipse.titan.designer.editors.DeclarationCollectionHelper; -import org.eclipse.titan.designer.editors.DeclarationCollector; -import org.eclipse.titan.designer.editors.OpenDeclarationHelper; -import org.eclipse.titan.designer.editors.OpenDeclarationLabelProvider; import org.eclipse.titan.designer.parsers.GlobalParser; import org.eclipse.titan.designer.parsers.ProjectSourceParser; import org.eclipse.titan.designer.preferences.PreferenceConstants; @@ -45,7 +35,6 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.AbstractTextEditor; @@ -106,79 +95,6 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct this.targetEditor = targetEditor; } - private void getDeclarationWithoutVisitor(final int offset, final boolean reportDebugInformation, final IFile file) { - DeclarationCollector declarationCollector = OpenDeclarationHelper.findVisibleDeclarations(targetEditor, new TTCN3ReferenceParser( - false), ((TTCN3Editor) targetEditor).getDocument(), offset, false); - - if (declarationCollector == null) { - return; - } - - DeclarationCollectionHelper declaration = null; - List<DeclarationCollectionHelper> collected = declarationCollector.getCollected(); - if (collected.isEmpty()) { - if (reportDebugInformation) { - TITANDebugConsole.println("No visible elements found"); - } - ProjectSourceParser projectSourceParser1 = GlobalParser.getProjectSourceParser(file.getProject()); - for (String moduleName2 : projectSourceParser1.getKnownModuleNames()) { - Module module2 = projectSourceParser1.getModuleByName(moduleName2); - if (module2 != null && module2 instanceof ASN1Module) { - module2.getAssignments().addDeclaration(declarationCollector); - } - } - - if (declarationCollector.getCollectionSize() == 0) { - targetEditor.getEditorSite().getActionBars().getStatusLineManager().setErrorMessage(NOTTTCN3DECLARATION); - return; - } - - if (reportDebugInformation) { - TITANDebugConsole.println("Elements were only found in not visible modules"); - } - - OpenDeclarationLabelProvider labelProvider = new OpenDeclarationLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); - dialog.setTitle("Open"); - dialog.setMessage("Select the element to open"); - dialog.setElements(collected.toArray()); - if (dialog.open() == Window.OK) { - if (reportDebugInformation) { - TITANDebugConsole.println("Selected: " + dialog.getFirstResult()); - } - declaration = (DeclarationCollectionHelper) dialog.getFirstResult(); - } - } else { - declaration = collected.get(0); - } - if (reportDebugInformation) { - for (DeclarationCollectionHelper foundDeclaration : collected) { - TITANDebugConsole.println("Assignment:" + foundDeclaration.location.getFile() + ": " - + foundDeclaration.location.getOffset() + " - " - + foundDeclaration.location.getEndOffset()); - } - } - - if (declaration != null) { - selectAndRevealDeclaration(declaration.location); - } - } - - private void getDeclarationVisitor(final Module module, final IdentifierFinderVisitor visitor, final boolean reportDebugInformation) { - - module.accept(visitor); - final Declaration decl = visitor.getReferencedDeclaration(); - if (decl == null) { - if (reportDebugInformation) { - TITANDebugConsole.println("No visible elements found"); - } - return; - } - - selectAndRevealDeclaration(decl.getIdentifier().getLocation()); - - } - @Override public Object execute(ExecutionEvent event) throws ExecutionException { targetEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); @@ -207,7 +123,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct } if (ResourceExclusionHelper.isExcluded(file)) { - MessageDialog.openError(new Shell(Display.getDefault()), "Open Declaration does not work within excluded resources", + MessageDialog.openError(null, "Open Declaration does not work within excluded resources", "This module is excluded from build. To use the Open Declaration " + "feature please click on the 'Toggle exclude from build state' in the context menu of the Project Explorer. "); return; @@ -228,8 +144,6 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct offset = ((TTCN3Editor) targetEditor).getCarretOffset(); } - IdentifierFinderVisitor visitor = new IdentifierFinderVisitor(offset); - ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(file.getProject()); final String ttcn3ModuleName = projectSourceParser.containedModule(file); @@ -243,19 +157,18 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct return; } - // ToDo: In case of minimize memory usage, the code reverts to - // non visitor type of get declaration. - // Think it over. - // if - // (Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, - // PreferenceConstants.MINIMISEMEMORYUSAGE, true, null)) { - // - // getDeclarationWithoutVisitor(offset, reportDebugInformation, - // file); + IdentifierFinderVisitor visitor = new IdentifierFinderVisitor(offset); + module.accept(visitor); + final Declaration decl = visitor.getReferencedDeclaration(); + if (decl == null) { + if (reportDebugInformation) { + TITANDebugConsole.println("No visible elements found"); + } + return; + } + + selectAndRevealDeclaration(decl.getIdentifier().getLocation()); - // } else { - getDeclarationVisitor(module, visitor, reportDebugInformation); - // } return; } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/Reconciler.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/Reconciler.java index 92d51c460e..648b81ab99 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/Reconciler.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/Reconciler.java @@ -656,6 +656,7 @@ public class Reconciler implements IReconciler { * reimplement this method. */ protected final void initialProcess() { + dirtyRegionQueue.clear(); reconcilingStrategy.initialReconcile(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ReconcilingStrategy.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ReconcilingStrategy.java index b42f814494..8e9baace26 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ReconcilingStrategy.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcn3editor/ReconcilingStrategy.java @@ -193,18 +193,15 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci WorkspaceJob op = new WorkspaceJob("reparse information update") { @Override public IStatus runInWorkspace(final IProgressMonitor monitor) { - WorkspaceJob temp_lastIncrementalSyntaxCheck = lastIncrementalSyntaxCheck; - if (temp_lastIncrementalSyntaxCheck != null) { + WorkspaceJob tempLastIncrementalSyntaxCheck = lastIncrementalSyntaxCheck; + if (tempLastIncrementalSyntaxCheck != null) { try { - temp_lastIncrementalSyntaxCheck.join(); + tempLastIncrementalSyntaxCheck.join(); } catch (InterruptedException e) { ErrorReporter.logExceptionStackTrace(e); } } - sourceParser.addModulesToBeSemanticallyAnalyzed(reparser.moduleToBeReanalysed); - if (reparser.fullAnalysysNeeded) { - sourceParser.setFullSemanticAnalysisNeeded(); - } + return Status.OK_STATUS; } }; @@ -219,10 +216,6 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci TITANDebugConsole.println("Refreshing the syntax took " + (System.nanoTime() - parserStart) * (1e-9) + " secs"); } - if (!reparser.fullAnalysysNeeded) { - return; - } - op = new WorkspaceJob(FOLDING_UPDATE) { @Override public IStatus runInWorkspace(final IProgressMonitor monitor) { @@ -255,10 +248,10 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci return; } - final WorkspaceJob temp_lastIncrementalSyntaxCheck = lastIncrementalSyntaxCheck; - if (temp_lastIncrementalSyntaxCheck != null) { + final WorkspaceJob tempLastIncrementalSyntaxCheck = lastIncrementalSyntaxCheck; + if (tempLastIncrementalSyntaxCheck != null) { try { - temp_lastIncrementalSyntaxCheck.join(); + tempLastIncrementalSyntaxCheck.join(); } catch (InterruptedException e) { ErrorReporter.logExceptionStackTrace(e); } @@ -306,13 +299,13 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci fullReconciliation(true); } - private void fullReconciliation(final boolean is_initial) { + private void fullReconciliation(final boolean isInitial) { actualCode = new StringBuilder(document.get()); GlobalIntervalHandler.putInterval(document, null); IPreferencesService prefs = Platform.getPreferencesService(); if (prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEONTHEFLYPARSING, true, null)) { - analyze(is_initial); + analyze(isInitial); } else { Display.getDefault().asyncExec(new Runnable() { @Override @@ -328,7 +321,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci } } - public void analyze(final boolean is_initial) { + public void analyze(final boolean isInitial) { final IFile editedFile = (IFile) editor.getEditorInput().getAdapter(IFile.class); if (editedFile == null || ResourceExclusionHelper.isExcluded(editedFile)) { return; @@ -348,10 +341,10 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci }); final ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(project); - if (is_initial || !editor.isSemanticCheckingDelayed()) { + if (isInitial || !editor.isSemanticCheckingDelayed()) { final boolean minimizeMemoryUsage = Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.MINIMISEMEMORYUSAGE, false, null); - if (!is_initial || minimizeMemoryUsage) { + if (!isInitial || minimizeMemoryUsage) { projectSourceParser.reportOutdating(editedFile); } projectSourceParser.analyzeAll(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/Configuration.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/Configuration.java index 7cb606b8c2..393be4653b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/Configuration.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/Configuration.java @@ -108,14 +108,7 @@ public final class Configuration extends TextSourceViewerConfiguration { @Override public ITextHover getTextHover(final ISourceViewer sourceViewer, final String contentType, final int stateMask) { - // IPreferencesService prefs = Platform.getPreferencesService(); - // if (prefs.getBoolean(Activator.PLUGIN_ID, - // PreferenceConstants.TREATTTCNPPASTTCN, false, null)) { return new org.eclipse.titan.designer.editors.ttcn3editor.TextHover(sourceViewer, editor); - // } - - // return new - // org.eclipse.titan.designer.editors.TextHover(sourceViewer); } @Override @@ -130,17 +123,9 @@ public final class Configuration extends TextSourceViewerConfiguration { strategy.setEditor(editor); IPreferencesService prefs = Platform.getPreferencesService(); - // if (prefs.getBoolean(Activator.PLUGIN_ID, - // PreferenceConstants.TREATTTCNPPASTTCN, false, null)) - // { reconciler = new MonoReconciler(strategy, prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEINCREMENTALPARSING, false, null)); reconciler.setProgressMonitor(new NullProgressMonitor()); - // } else { - // reconciler = new MonoReconciler(strategy, false); - // reconciler.setProgressMonitor(new - // NullProgressMonitor()); - // } editor.setReconciler(reconciler); int timeout = prefs.getInt(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.RECONCILERTIMEOUT, 1, null); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/OpenDeclaration.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/OpenDeclaration.java index 69ce720f36..dd374519fe 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/OpenDeclaration.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/OpenDeclaration.java @@ -17,8 +17,6 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Module; @@ -127,7 +125,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct } if (ResourceExclusionHelper.isExcluded(file)) { - MessageDialog.openError(new Shell(Display.getDefault()), "Open Declaration does not work within excluded resources", + MessageDialog.openError(null, "Open Declaration does not work within excluded resources", "This module is excluded from build. To use the Open Declaration " + "feature please click on the 'Toggle exclude from build state' in the context menu of the Project Explorer. "); return; @@ -144,8 +142,6 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct offset = ((TTCNPPEditor) targetEditor).getCarretOffset(); } - IdentifierFinderVisitor visitor = new IdentifierFinderVisitor(offset); - ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(file.getProject()); final String ttcn3ModuleName = projectSourceParser.containedModule(file); @@ -159,6 +155,7 @@ public final class OpenDeclaration extends AbstractHandler implements IEditorAct return; } + IdentifierFinderVisitor visitor = new IdentifierFinderVisitor(offset); module.accept(visitor); final Declaration decl = visitor.getReferencedDeclaration(); if (decl == null) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/ReconcilingStrategy.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/ReconcilingStrategy.java index c50b9cb614..3acc10d93c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/ReconcilingStrategy.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/editors/ttcnppeditor/ReconcilingStrategy.java @@ -137,10 +137,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci final ProjectSourceParser sourceParser = GlobalParser.getProjectSourceParser(project); sourceParser.updateSyntax(editedFile, reparser); - sourceParser.addModulesToBeSemanticallyAnalyzed(reparser.moduleToBeReanalysed); - if (reparser.fullAnalysysNeeded) { - sourceParser.setFullSemanticAnalysisNeeded(); - } + if (!editor.isSemanticCheckingDelayed()) { sourceParser.analyzeAll(); @@ -180,13 +177,13 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci fullReconciliation(true); } - private void fullReconciliation(final boolean is_initial) { + private void fullReconciliation(final boolean isInitial) { actualCode = new StringBuilder(document.get()); GlobalIntervalHandler.putInterval(document, null); IPreferencesService prefs = Platform.getPreferencesService(); if (prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEONTHEFLYPARSING, true, null)) { - analyze(is_initial); + analyze(isInitial); } else { Display.getDefault().asyncExec(new Runnable() { @Override @@ -199,7 +196,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci } } - public void analyze(final boolean is_initial) { + public void analyze(final boolean isInitial) { final IFile editedFile = (IFile) editor.getEditorInput().getAdapter(IFile.class); if (editedFile == null || ResourceExclusionHelper.isExcluded(editedFile)) { return; @@ -219,8 +216,7 @@ public final class ReconcilingStrategy implements IReconcilingStrategy, IReconci }); final ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(project); - projectSourceParser.setFullSemanticAnalysisNeeded(); - if (is_initial || !editor.isSemanticCheckingDelayed()) { + if (isInitial || !editor.isSemanticCheckingDelayed()) { projectSourceParser.reportOutdating(editedFile); projectSourceParser.analyzeAll(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/license/LicenseValidator.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/license/LicenseValidator.java index ebc7db3103..239c361286 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/license/LicenseValidator.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/license/LicenseValidator.java @@ -52,7 +52,7 @@ public final class LicenseValidator { super.buttonPressed(buttonId); if (buttonId == 1) { - PreferencesUtil.createPreferenceDialogOn(new Shell(Display.getDefault()), + PreferencesUtil.createPreferenceDialogOn(null, "org.eclipse.titan.designer.preferences.pages.TITANPreferencePage", null, null).open(); } } @@ -134,7 +134,7 @@ public final class LicenseValidator { } LicenseErrorDialog.isDialogOpen = true; - LicenseErrorDialog dialog = new LicenseErrorDialog(new Shell(Display.getDefault()), title, message); + LicenseErrorDialog dialog = new LicenseErrorDialog(null, title, message); dialog.open(); LicenseErrorDialog.isDialogOpen = false; } @@ -159,6 +159,9 @@ public final class LicenseValidator { * @return the resolved license file path * */ public static String getResolvedLicenseFilePath(final boolean force) { + if(!License.isLicenseNeeded()){ + return ""; + } final IPreferencesService preferenceService = Platform.getPreferencesService(); boolean reportDebugInformation = preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, false, null); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/nativewin32actions/NativeWIN32TITANJob.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/nativewin32actions/NativeWIN32TITANJob.java index a73ff5e788..bc07cfd9e9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/nativewin32actions/NativeWIN32TITANJob.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/nativewin32actions/NativeWIN32TITANJob.java @@ -17,6 +17,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.titan.designer.core.TITANJob; +import org.eclipse.titan.designer.license.License; import org.eclipse.titan.designer.preferences.PreferenceConstants; import org.eclipse.titan.designer.productUtilities.ProductConstants; @@ -60,10 +61,13 @@ public final class NativeWIN32TITANJob extends TITANJob { final IPreferencesService service = Platform.getPreferencesService(); final String pathOfTITAN = service.getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.TITAN_INSTALLATION_PATH, "", null); - final String licenseFilePath = service.getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.LICENSE_FILE_PATH, "", - null); + final Map<String, String> env = pb.environment(); - env.put(TTCN3_LICENSE_FILE_KEY, licenseFilePath); + if(License.isLicenseNeeded()) { + final String licenseFilePath = + service.getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.LICENSE_FILE_PATH, "", null); + env.put(TTCN3_LICENSE_FILE_KEY, licenseFilePath); + } env.put(TTCN3_DIR_KEY, pathOfTITAN); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceParser.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceParser.java index 6445abb04f..3ca4a07530 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceParser.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceParser.java @@ -710,44 +710,6 @@ public final class ProjectSourceParser { return op; } - /** - * Internal function. - * <p> - * Does the analysis of the projects in an incremental fashion. - no - * syntax check (this should have already been done.) - does the - * semantic checking based on data collected at syntax checking time, - * and previous semantic checking. - * - * @param monitor - * the progress monitor to provide feedback to the user - * about the progress. - * */ - private IStatus internalIncrementalAnalysis(final IProgressMonitor monitor) { - if (!checkConfigurationRequirements(project, GeneralConstants.ONTHEFLY_SEMANTIC_MARKER)) { - return Status.OK_STATUS; - } - - // Do the analyzes in the determined order. - CompilationTimeStamp compilationCounter = CompilationTimeStamp.getNewCompilationCounter(); - - IProgressMonitor internalMonitor = monitor == null ? new NullProgressMonitor() : monitor; - internalMonitor.beginTask("Analysis of projects", 1); - IPreferencesService preferenceService = Platform.getPreferencesService(); - boolean reportDebugInformation = preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null); - if (reportDebugInformation) { - TITANDebugConsole.println("On-the-fly analyzation of project " + project.getName() + " started"); - } - - syntacticAnalyzer.internalDoAnalyzeSyntactically(new SubProgressMonitor(internalMonitor, 1)); - semanticAnalyzer.analyzeSemanticallyIncrementally(new SubProgressMonitor(internalMonitor, 1), compilationCounter); - - internalMonitor.done(); - lastTimeChecked = compilationCounter; - - return Status.OK_STATUS; - } - /** * Internal function. * <p> @@ -872,11 +834,7 @@ public final class ProjectSourceParser { } } - List<Module> modulesSkippedGlobally = new ArrayList<Module>(); - for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { - GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).semanticAnalyzer.internalDoAnalyzeSemantically( - new SubProgressMonitor(internalMonitor, 1), compilationCounter, modulesSkippedGlobally); - } + ProjectSourceSemanticAnalyzer.analyzeMultipleProjectsSemantically(tobeSemanticallyAnalyzed, internalMonitor, compilationCounter); } finally { for (int i = 0; i < tobeAnalyzed.size(); i++) { GlobalParser.getProjectSourceParser(tobeAnalyzed.get(i)).analyzesRunning = false; @@ -1071,11 +1029,7 @@ public final class ProjectSourceParser { } } - if (semanticAnalyzer.getFullAnalysisNeeded()) { - result = internalDoAnalyzeWithReferences(monitor); - } else { - result = internalIncrementalAnalysis(monitor); - } + result = internalDoAnalyzeWithReferences(monitor); boolean reportDebugInformation = preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null); @@ -1300,20 +1254,4 @@ public final class ProjectSourceParser { fullAnalyzersRunning.decrementAndGet(); } } - - /** Sets whether full analysis is needed or not. */ - public void setFullSemanticAnalysisNeeded() { - semanticAnalyzer.setFullAnalysisNeeded(); - } - - /** - * Adds a list of modules that must be analyzed in case of incremental - * analysis. - * - * @param modules - * the list of modules to be added. - * */ - public void addModulesToBeSemanticallyAnalyzed(final Set<String> modules) { - semanticAnalyzer.addModulesToBeReanalyzed(modules); - } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSemanticAnalyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSemanticAnalyzer.java index 4c2be7eff5..36703a79f0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSemanticAnalyzer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSemanticAnalyzer.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -25,7 +24,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.TITANMarker; @@ -36,8 +34,10 @@ import org.eclipse.titan.designer.AST.MarkerHandler; import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.ModuleImportationChain; import org.eclipse.titan.designer.AST.ASN1.Ass_pard; -import org.eclipse.titan.designer.AST.TTCN3.definitions.ImportModule; -import org.eclipse.titan.designer.AST.TTCN3.definitions.TTCN3Module; +import org.eclipse.titan.designer.brokenpartsanalyzers.AnalyzerFactory; +import org.eclipse.titan.designer.brokenpartsanalyzers.BrokenPartsChecker; +import org.eclipse.titan.designer.brokenpartsanalyzers.IBaseAnalyzer; +import org.eclipse.titan.designer.brokenpartsanalyzers.SelectionMethodBase; import org.eclipse.titan.designer.consoles.TITANDebugConsole; import org.eclipse.titan.designer.core.ProjectBasedBuilder; import org.eclipse.titan.designer.core.TITANNature; @@ -67,18 +67,6 @@ public class ProjectSourceSemanticAnalyzer { /** The names of the modules, which were checked the last time. */ private Set<String> semanticallyUptodateModules; - /** - * The list of modules that should be re-analyzed if incremental - * semantic processing is enabled. - */ - private Set<String> moduleToBeReanalysed = new HashSet<String>(); - - /** - * tells whether a full analysis is required even if incremental - * processing is enabled. - */ - private boolean fullAnalysisNeeded = true; - /** holds the list of modules which had the same module identifiers */ private final Set<IFile> duplicationHolders = new HashSet<IFile>(); @@ -91,32 +79,12 @@ public class ProjectSourceSemanticAnalyzer { semanticallyUptodateModules = new HashSet<String>(); } - boolean getFullAnalysisNeeded() { - return fullAnalysisNeeded; - } - - /** Sets whether full analysis is needed or not. */ - public void setFullAnalysisNeeded() { - fullAnalysisNeeded = true; - } - - /** - * Adds a list of modules that must be analyzed in case of incremental - * analysis. - * - * @param modules - * the list of modules to be added. - * */ - public void addModulesToBeReanalyzed(final Set<String> modules) { - moduleToBeReanalysed.addAll(modules); - } - /** * Checks whether the internal data belonging to the provided file is * semantically out-dated. * * @param file - * the file to check. + * the file to check. * * @return true if the data was reported to be out-dated since the last * analysis. @@ -136,9 +104,9 @@ public class ProjectSourceSemanticAnalyzer { * Returns the module with the provided name, or null. * * @param name - * the name of the module to return. + * the name of the module to return. * @param uptodateOnly - * allow finding only the up-to-date modules. + * allow finding only the up-to-date modules. * * @return the module having the provided name * */ @@ -177,7 +145,7 @@ public class ProjectSourceSemanticAnalyzer { * Checks the only actual project. * * @param moduleName - * the name of the module to be checked. + * the name of the module to be checked. * * @return true if the module is checked, false otherwise. * */ @@ -189,11 +157,11 @@ public class ProjectSourceSemanticAnalyzer { * Handles the renaming of a module. * * @param oldname - * the old name of the module. + * the old name of the module. * @param newName - * the new name of the module. + * the new name of the module. * @param file - * the file in which the change happened. + * the file in which the change happened. * */ void renameModule(final String oldname, final String newName, final IFile file) { if (moduleMap.containsKey(oldname)) { @@ -226,9 +194,9 @@ public class ProjectSourceSemanticAnalyzer { * </p> * * @param outdatedFile - * the file which seems to have changed + * the file which seems to have changed * @param useOnTheFlyParsing - * true if on-the-fly parsing is enabled. + * true if on-the-fly parsing is enabled. * */ public void reportOutdating(final IFile outdatedFile, final boolean useOnTheFlyParsing) { if (!useOnTheFlyParsing) { @@ -240,7 +208,6 @@ public class ProjectSourceSemanticAnalyzer { String moduleName = sourceParser.containedModule(outdatedFile); if (moduleName == null) { // The module was just added - fullAnalysisNeeded = true; return; } @@ -263,7 +230,6 @@ public class ProjectSourceSemanticAnalyzer { synchronized (semanticallyUptodateModules) { semanticallyUptodateModules.remove(moduleName); } - fullAnalysisNeeded = true; } /** @@ -274,7 +240,7 @@ public class ProjectSourceSemanticAnalyzer { * <p> * * @param outdatedFile - * the file which seems to have changed + * the file which seems to have changed * */ public void reportSemanticOutdating(final IFile outdatedFile) { outdateDuplicationHolders(); @@ -287,7 +253,6 @@ public class ProjectSourceSemanticAnalyzer { synchronized (semanticallyUptodateModules) { semanticallyUptodateModules.remove(moduleName); } - fullAnalysisNeeded = true; } /** @@ -298,16 +263,15 @@ public class ProjectSourceSemanticAnalyzer { semanticallyUptodateModules.clear(); } duplicationHolders.clear(); - fullAnalysisNeeded = true; } /** * Removes data related to modules, that were deleted or moved. * * @param file - * the file that was changed. + * the file that was changed. * @param moduleName - * the name of the module in that file. + * the name of the module in that file. **/ void removedReferencestoRemovedFiles(final IFile file, final String moduleName) { outdateDuplicationHolders(); @@ -317,18 +281,16 @@ public class ProjectSourceSemanticAnalyzer { } moduleMap.remove(moduleName); - synchronized (outdatedModuleMap) { outdatedModuleMap.remove(moduleName); } - fullAnalysisNeeded = true; } /** * Removes a module from the set of semantically analyzed modules. * * @param moduleName - * the name of the module to be removed. + * the name of the module to be removed. * */ void removeModule(final String moduleName) { synchronized (outdatedModuleMap) { @@ -359,7 +321,7 @@ public class ProjectSourceSemanticAnalyzer { * Adds a module to the set of semantically analyzed modules. * * @param module - * the module to be added. + * the module to be added. * @return true if it was successfully added, false otherwise. * */ public boolean addModule(final Module module) { @@ -405,343 +367,130 @@ public class ProjectSourceSemanticAnalyzer { /** * Internal function. * <p> - * Does the semantic checking of the modules parsed in this project. It - * is important to call this function after the + * Does the semantic checking of the modules located in multiple projects. + * It is important to call this function after the * {@link #internalDoAnalyzeSyntactically(IProgressMonitor, CompilationTimeStamp)} - * function, as the out-dated markers will be cleared here. + * function was executed on all involved projects, as the out-dated markers will be cleared here. * + * @param tobeSemanticallyAnalyzed the list of projects to be analyzed. * @param monitor * the progress monitor to provide feedback to the user * about the progress. * @param compilationCounter - * the timestamp of the actual build cycle. - * @param modulesSkippedGlobally - * the modules skipped in any earlier projects. + * the timestamp of the actual build cycle. * * @return the status of the operation when it finished. * */ - synchronized IStatus internalDoAnalyzeSemantically(final IProgressMonitor monitor, final CompilationTimeStamp compilationCounter, - final List<Module> modulesSkippedGlobally) { - if (!project.isAccessible() || !TITANNature.hasTITANNature(project)) { - return Status.CANCEL_STATUS; + static IStatus analyzeMultipleProjectsSemantically(final List<IProject> tobeSemanticallyAnalyzed, final IProgressMonitor monitor, final CompilationTimeStamp compilationCounter) { + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + if (!tobeSemanticallyAnalyzed.get(i).isAccessible() || !TITANNature.hasTITANNature(tobeSemanticallyAnalyzed.get(i))) { + return Status.CANCEL_STATUS; + } } + + final long semanticCheckStart = System.nanoTime(); + final IPreferencesService preferenceService = Platform.getPreferencesService(); - analyzeSemantically(monitor, compilationCounter, modulesSkippedGlobally); - - MarkerHandler.removeAllOnTheFlyMarkedMarkers(project); - - return Status.OK_STATUS; - } - - /** - * Internal function. - * <p> - * Does the incremental semantic checking of the modules parsed in this - * project. It is important to call this function after the - * {@link #internalDoAnalyzeSyntactically(IProgressMonitor, CompilationTimeStamp)} - * function, as the out-dated markers will be cleared here. - * - * @param monitor - * the progress monitor to provide feedback to the user - * about the progress. - * @param compilationCounter - * the timestamp of the actual build cycle. - * @param modulesSkippedGlobally - * the modules skipped in any earlier projects. - * - * @return the status of the operation when it finished. - * */ - synchronized IStatus analyzeSemanticallyIncrementally(final IProgressMonitor monitor, final CompilationTimeStamp compilationCounter) { - long semanticCheckStart = System.nanoTime(); - - // remove the out-dated modules, which could not be refreshed - // (they are most probably excluded from analysis) - synchronized (outdatedModuleMap) { - outdatedModuleMap.clear(); + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + ProjectSourceSemanticAnalyzer semanticAnalyzer = GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).getSemanticAnalyzer(); + synchronized (semanticAnalyzer.outdatedModuleMap) { + semanticAnalyzer.outdatedModuleMap.clear(); + } } - + // Semantic checking starts here - monitor.beginTask("On-the-fly semantic checking of project: " + project.getName(), 5); + monitor.beginTask("On-the-fly semantic checking of everything ", 1); monitor.subTask("Checking the importations of the modules"); - - try { - // report the unsupported constructs in the project, - // should be empty - if (!sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.isEmpty()) { - String option = Platform.getPreferencesService().getString(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.REPORTUNSUPPORTEDCONSTRUCTS, GeneralConstants.ERROR, null); - for (IFile file : sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.keySet()) { - List<TITANMarker> markers = sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.get(file); + + try{ + final String option = preferenceService.getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.REPORTUNSUPPORTEDCONSTRUCTS, GeneralConstants.ERROR, null); + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + // report the unsupported constructs in the project + ProjectSourceSyntacticAnalyzer syntacticAnalyzer = GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).getSyntacticAnalyzer(); + for (IFile file : syntacticAnalyzer.unsupportedConstructMap.keySet()) { + List<TITANMarker> markers = syntacticAnalyzer.unsupportedConstructMap.get(file); if (markers != null && file.isAccessible()) { for (TITANMarker marker : markers) { - Location location = new Location(file, marker.getLine(), marker.getOffset(), - marker.getEndOffset()); + Location location = new Location(file, marker.getLine(), marker.getOffset(), marker.getEndOffset()); location.reportConfigurableSemanticProblem(option, marker.getMessage()); } } } } - + // clean the instantiated parameterized assignments, // from their instances Ass_pard.resetAllInstanceCounters(); - monitor.worked(1); - monitor.subTask("Calculating the list of modules to be checked"); - - List<Module> modulesToCheck = new ArrayList<Module>(); - for (String name : moduleToBeReanalysed) { - Module module = moduleMap.get(name); - if (module != null) { - modulesToCheck.add(module); - } - } - - List<Module> modulesToSkip = new ArrayList<Module>(); - for (String modulename : moduleMap.keySet()) { - if (!moduleToBeReanalysed.contains(modulename)) { - Module module = moduleMap.get(modulename); - if (module != null) { - modulesToSkip.add(module); + // collect all modules and semantically checked modules to work on. + final List<Module> allModules = new ArrayList<Module>(); + final List<String> semanticallyChecked = new ArrayList<String>(); + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + ProjectSourceSemanticAnalyzer semanticAnalyzer = GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).getSemanticAnalyzer(); + for (Module moduleToCheck : semanticAnalyzer.moduleMap.values()) { + if (moduleToCheck != null) { + allModules.add(moduleToCheck); } } - } - - for (Module module2 : modulesToCheck) { - module2.setSkippedFromSemanticChecking(false); - } - for (Module module2 : modulesToSkip) { - module2.setSkippedFromSemanticChecking(true); - } - - monitor.worked(1); - monitor.subTask("Semantic checking"); - final SubProgressMonitor semanticMonitor = new SubProgressMonitor(monitor, 1); - semanticMonitor.beginTask("Semantic check", modulesToCheck.size()); - - // process the modules one-by-one - for (final Module module2 : modulesToCheck) { - MarkerHandler.markAllSemanticMarkersForRemoval((IFile) module2.getLocation().getFile()); - semanticMonitor.subTask("Semantically checking module: " + module2.getName()); - module2.check(compilationCounter); - semanticMonitor.worked(1); - } - - semanticMonitor.done(); - monitor.subTask("Doing post semantic checks"); - - for (Module module2 : modulesToCheck) { - module2.postCheck(); - } - - monitor.worked(1); - monitor.subTask("Cleanup operations"); - - synchronized (semanticallyUptodateModules) { - semanticallyUptodateModules.clear(); - semanticallyUptodateModules.addAll(moduleMap.keySet()); - } - - moduleToBeReanalysed.clear(); - - for (Module module2 : modulesToCheck) { - MarkerHandler.removeAllOnTheFlyMarkedMarkers(module2.getLocation().getFile()); - } - - IPreferencesService preferenceService = Platform.getPreferencesService(); - if (preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, - null)) { - MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" **Incremental on-the-fly semantic checking of project " + project.getName() + " (" - + semanticallyUptodateModules.size() + " modules) took " - + (System.nanoTime() - semanticCheckStart) * (1e-9) + " seconds",stream); - TITANDebugConsole.println(" **Checked " + modulesToCheck.size() + " modules", stream); - } - monitor.worked(1); - } catch (Exception e) { - // This catch is extremely important, as it is supposed - // to protect the project parser, from whatever might go - // wrong inside the analysis. - ErrorReporter.logExceptionStackTrace(e); - } - - fullAnalysisNeeded = false; - sourceParser.setLastTimeChecked(compilationCounter); - monitor.done(); - - ProjectStructureDataCollector collector = GlobalProjectStructureTracker.getDataCollector(project); - for (Module module : moduleMap.values()) { - collector.addKnownModule(module.getIdentifier()); - module.extractStructuralInformation(collector); - } - - return Status.OK_STATUS; - } - - /** - * Internal function. Does the actual semantic checking of the modules. - * - * @param monitor - * the progress monitor to provide feedback to the user - * about the progress. - * @param compilationCounter - * the timestamp of the actual build cycle. - * @param modulesSkippedGlobally - * the modules skipped in any earlier projects. - * - * */ - private void analyzeSemantically(final IProgressMonitor monitor, final CompilationTimeStamp compilationCounter, - final List<Module> modulesSkippedGlobally) { - long semanticCheckStart = System.nanoTime(); - IPreferencesService preferenceService = Platform.getPreferencesService(); - - // remove the out-dated modules, which could not be refreshed - // (they are most probably excluded from analysis) - synchronized (outdatedModuleMap) { - outdatedModuleMap.clear(); - } - - // Semantic checking starts here - monitor.beginTask("On-the-fly semantic checking of project: " + project.getName(), 1); - monitor.subTask("Checking the importations of the modules"); - - try { - // report the unsupported constructs in the project - if (!sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.isEmpty()) { - String option = preferenceService.getString(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.REPORTUNSUPPORTEDCONSTRUCTS, GeneralConstants.ERROR, null); - for (IFile file : sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.keySet()) { - List<TITANMarker> markers = sourceParser.getSyntacticAnalyzer().unsupportedConstructMap.get(file); - if (markers != null && file.isAccessible()) { - for (TITANMarker marker : markers) { - Location location = new Location(file, marker.getLine(), marker.getOffset(), - marker.getEndOffset()); - location.reportConfigurableSemanticProblem(option, marker.getMessage()); + synchronized (semanticAnalyzer.semanticallyUptodateModules) { + for (String modulename : semanticAnalyzer.semanticallyUptodateModules) { + if (semanticAnalyzer.moduleMap.containsKey(modulename)) { + Module module = semanticAnalyzer.moduleMap.get(modulename); + if (module != null) { + semanticallyChecked.add(module.getName()); + } } } } } - // clean the instantiated parameterized assignments, - // from their instances - Ass_pard.resetAllInstanceCounters(); - - Module module; - - // check and build the import hierarchy of the modules - ModuleImportationChain referenceChain = new ModuleImportationChain(CIRCULARIMPORTCHAIN, false); - for (String modulename : moduleMap.keySet()) { - module = moduleMap.get(modulename); - if (module != null) { + int nofModulesTobeChecked = 0; + if(allModules.size() > semanticallyChecked.size()) { + // check and build the import hierarchy of the modules + ModuleImportationChain referenceChain = new ModuleImportationChain(CIRCULARIMPORTCHAIN, false); + for(Module module : allModules) { module.checkImports(compilationCounter, referenceChain, new ArrayList<Module>()); referenceChain.clear(); } - } - monitor.subTask("Calculating the list of modules to be checked"); + monitor.subTask("Calculating the list of modules to be checked"); - // To know the correct elements - List<String> semanticallyChecked = new ArrayList<String>(); - synchronized (semanticallyUptodateModules) { - for (String modulename : semanticallyUptodateModules) { - if (moduleMap.containsKey(modulename)) { - module = moduleMap.get(modulename); - if (module != null) { - semanticallyChecked.add(module.getName()); - } - } - } - } + IBaseAnalyzer selectionMethod = AnalyzerFactory.getAnalyzer(compilationCounter); + SelectionMethodBase selectionMethodBase = (SelectionMethodBase)selectionMethod; + selectionMethodBase.setModules(allModules, semanticallyChecked); + selectionMethod.execute(); - List<Module> modulesToCheck = new ArrayList<Module>(); - for (Module moduleToCheck : moduleMap.values()) { - if (moduleToCheck != null) { - modulesToCheck.add(moduleToCheck); - } - } - - List<Module> modulesToSkip = new ArrayList<Module>(); - boolean foundSkippable = true; - while (foundSkippable) { - foundSkippable = calculateModulesToSkip(modulesToCheck, modulesToSkip, modulesSkippedGlobally); - } + selectionMethodBase.setSkippedFromSemanticChecking(); - if (preferenceService - .getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.USEINCREMENTALPARSING, false, null)) { - // the modules that can be reached directly must - // be checked as the used state of the - // definitions might have changed - List<Module> modulesToCheck2 = new ArrayList<Module>(); - for (Module module2 : modulesToCheck) { - if (module2.getLastCompilationTimeStamp() != null && semanticallyChecked.contains(module2.getName())) { - List<Module> importedModules = module2.getImportedModules(); - if (importedModules != null && !importedModules.isEmpty()) { - for (Module module3 : importedModules) { - if (module3 != null && !modulesToCheck.contains(module3) - && !modulesToCheck2.contains(module3)) { - modulesToCheck2.add(module3); - } - } - } - } + BrokenPartsChecker brokenPartsChecker = new BrokenPartsChecker(monitor, compilationCounter, selectionMethodBase); + brokenPartsChecker.doChecking(); + + // re-enable the markers on the skipped modules. + for (Module module2 : selectionMethodBase.getModulesToSkip()) { + MarkerHandler.reEnableAllMarkers((IFile) module2.getLocation().getFile()); } - modulesToCheck.addAll(modulesToCheck2); - modulesToSkip.removeAll(modulesToCheck2); - } - - for (Module module2 : modulesToSkip) { - module2.setSkippedFromSemanticChecking(true); - } - for (Module module2 : modulesSkippedGlobally) { - module2.setSkippedFromSemanticChecking(true); - } - for (Module module2 : modulesToCheck) { - module2.setSkippedFromSemanticChecking(false); - } - - monitor.subTask("Semantic checking"); - final SubProgressMonitor semanticMonitor = new SubProgressMonitor(monitor, 1); - semanticMonitor.beginTask("Semantic check", modulesToCheck.size()); - - // process the modules one-by-one - for (final Module module2 : modulesToCheck) { - semanticMonitor.subTask("Semantically checking module: " + module2.getName()); - module2.check(compilationCounter); - semanticMonitor.worked(1); + nofModulesTobeChecked = selectionMethodBase.getModulesToCheck().size(); + } else { + //re-enable all markers + for (Module module2 : allModules) { + MarkerHandler.reEnableAllMarkers((IFile) module2.getLocation().getFile()); + } } - semanticMonitor.done(); - monitor.subTask("Doing post semantic checks"); - - for (Module module2 : modulesToCheck) { - module2.postCheck(); + if (preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null)) { + MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); + TITANDebugConsole.println(" ** Had to start checking at " + nofModulesTobeChecked + " modules. ", stream); + TITANDebugConsole.println(" **On-the-fly semantic checking of projects (" + allModules.size() + " modules) took " + (System.nanoTime() - semanticCheckStart) * (1e-9) + " seconds", stream); } - monitor.subTask("Cleanup operations"); - - synchronized (semanticallyUptodateModules) { - semanticallyUptodateModules.clear(); - semanticallyUptodateModules.addAll(moduleMap.keySet()); - } - - // re-enable the markers on the skipped modules. - for (Module module2 : modulesToSkip) { - MarkerHandler.reEnableAllMarkers((IFile) module2.getLocation().getFile()); - } - - modulesSkippedGlobally.addAll(modulesToSkip); - - moduleToBeReanalysed.clear(); - - if (preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, - null)) { - MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Has to start checking at " + modulesToCheck.size() + " modules. ", stream); - TITANDebugConsole.println(" **On-the-fly semantic checking of project " + project.getName() + " (" - + semanticallyUptodateModules.size() + " modules) took " - + (System.nanoTime() - semanticCheckStart) * (1e-9) + " seconds", stream); - TITANDebugConsole.println(" **Checked " + modulesToCheck.size() + " modules",stream); + + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + ProjectSourceSemanticAnalyzer semanticAnalyzer = GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).getSemanticAnalyzer(); + synchronized (semanticAnalyzer.semanticallyUptodateModules) { + semanticAnalyzer.semanticallyUptodateModules.clear(); + semanticAnalyzer.semanticallyUptodateModules.addAll(semanticAnalyzer.moduleMap.keySet()); + } } } catch (Exception e) { // This catch is extremely important, as it is supposed @@ -749,190 +498,20 @@ public class ProjectSourceSemanticAnalyzer { // wrong inside the analysis. ErrorReporter.logExceptionStackTrace(e); } - - fullAnalysisNeeded = false; - sourceParser.setLastTimeChecked(compilationCounter); monitor.done(); - ProjectStructureDataCollector collector = GlobalProjectStructureTracker.getDataCollector(project); - for (Module module : moduleMap.values()) { - collector.addKnownModule(module.getIdentifier()); - module.extractStructuralInformation(collector); - } - } - - /** - * Calculates the list of modules that can be skipped when analyzing - * this project semantically. - * <p> - * This function might not be able to detect all modules that can be - * skipped at once. It should be run as long as it reports that it could - * remove new modules from the list of modules to be checked. - * - * @param modulesToCheck - * the list of modules to be check. Initially all - * modules, but the function will remove those that can - * be skipped. - * @param modulesToSkip - * the list of modules that can be skipped, to be - * generated by the function. - * @param modulesSkippedGlobally - * the list of modules that were already found to not - * need to be checked in this semantic checking cycle, by - * an other project. - * - * @return true if there were modules found that can be skipped from - * analyzing, false otherwise. - * */ - private boolean calculateModulesToSkip(final List<Module> modulesToCheck, final List<Module> modulesToSkip, - final List<Module> modulesSkippedGlobally) { - if (modulesToCheck.isEmpty()) { - return false; - } - - IPreferencesService preferenceService = Platform.getPreferencesService(); - boolean displayDebugInfo = preferenceService.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null); - - boolean foundSkippable = false; - // proven to need checking - List<Module> failed = new ArrayList<Module>(); - List<Module> modulesToCheckCopy = new ArrayList<Module>(); - modulesToCheckCopy.addAll(modulesToCheck); - MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - - for (Iterator<Module> iterator = modulesToCheckCopy.iterator(); iterator.hasNext();) { - Module module = iterator.next(); - if (failed.contains(module) || modulesToSkip.contains(module) || modulesSkippedGlobally.contains(module)) { - continue; - } - - if (module == null || module.getLastCompilationTimeStamp() == null || !sourceParser.isSemanticallyChecked(module)) { - if (displayDebugInfo && module != null) { - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it was not yet analyzed.",stream); - } - failed.add(module); - continue; - } - - /** - * The modules that are reachable from the starting one. - */ - List<Module> reachableModules = new ArrayList<Module>(); - reachableModules.add(module); - - boolean valid = true; - for (int i = 0; i < reachableModules.size() && valid; i++) { - Module module2 = reachableModules.get(i); - if (module2 == null) { - valid = false; - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it reaches a module that could not be parsed.", stream); - continue; - } - if (failed.contains(module2)) { - valid = false; - continue; - } - if (module2.getLastCompilationTimeStamp() != null && sourceParser.isSemanticallyChecked(module2)) { - if (module2.hasUnhandledImportChanges()) { - valid = false; - failed.add(module2); - if (displayDebugInfo) { - TITANDebugConsole.println(" ** Module " + module2.getName() - + " can not be skipped as it has unhandled import changes.", stream); - if (module != module2) { - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it depends on " - + module2.getName() - + " which has unhandled import changes.",stream); - } - } - continue; - } - List<Module> importedModules = module2.getImportedModules(); - if (!importedModules.isEmpty()) { - boolean allElements = true; - Module module3; - for (int j = 0; j < importedModules.size() && allElements; j++) { - module3 = importedModules.get(j); - if (module3 == null) { - // erroneous - // import - allElements = false; - if (displayDebugInfo) { - if (module2 instanceof TTCN3Module) { - final List<ImportModule> impModules = ((TTCN3Module) module2) - .getImports(); - if (j < impModules.size()) { - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it imports `" - + impModules.get(j).getName() - + "' that could not be parsed.", stream); - } - } - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Module " - + module.getName() - + " can not be skipped as it imports a module that could not be parsed.",stream); - } - } else if (failed.contains(module3)) { - allElements = false; - if (displayDebugInfo) { - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it depends on " - + module3.getName() - + " which needs to be checked.",stream); - } - } else if (modulesToSkip.contains(module3) || modulesSkippedGlobally.contains(module3)) { - // already decided, that it can be skipped - } else if (!sourceParser.isSemanticallyChecked(module3)) { - // imports a module that was not checked, so this must also be re-checked - allElements = false; - if (displayDebugInfo) { - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Module " + module.getName() - + " can not be skipped as it depends on " + module3.getName() - + " which was not yet analyzed.", stream); - } - } else { - if (!reachableModules.contains(module3)) { - reachableModules.add(module3); - } - } - } - - if (!allElements) { - valid = false; - } - } - } else { - // The module was not yet checked. - valid = false; - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Module " + module.getName() + " can not be skipped as it depends on " - + module2.getName() + " which was not yet checked.",stream); - } - } - - if (valid) { - modulesToSkip.addAll(reachableModules); - modulesToCheck.removeAll(reachableModules); - foundSkippable = true; - } else { - failed.add(module); + for (int i = 0; i < tobeSemanticallyAnalyzed.size(); i++) { + GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).setLastTimeChecked(compilationCounter); + + ProjectStructureDataCollector collector = GlobalProjectStructureTracker.getDataCollector(tobeSemanticallyAnalyzed.get(i)); + for (Module module : GlobalParser.getProjectSourceParser(tobeSemanticallyAnalyzed.get(i)).getSemanticAnalyzer().moduleMap.values()) { + collector.addKnownModule(module.getIdentifier()); + module.extractStructuralInformation(collector); } + + MarkerHandler.removeAllOnTheFlyMarkedMarkers(tobeSemanticallyAnalyzed.get(i)); } - - if (displayDebugInfo) { - //MessageConsoleStream stream = TITANDebugConsole.getConsole().newMessageStream(); - TITANDebugConsole.println(" ** Found " + modulesToCheck.size() + " modules that needs to be checked and " + modulesToSkip.size() - + " modules to skip.",stream); - } - - return foundSkippable; + + return Status.OK_STATUS; } -} +} \ No newline at end of file diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSyntacticAnalyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSyntacticAnalyzer.java index e0803c60a4..1c8353cfda 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSyntacticAnalyzer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ProjectSourceSyntacticAnalyzer.java @@ -343,7 +343,6 @@ public final class ProjectSourceSyntacticAnalyzer { reparser.updateLocation(((TTCN3Module) module).getLocation()); MarkerHandler.markAllOnTheFlyMarkersForRemoval(file, reparser.getDamageStart(), reparser.getDamageEnd()); } catch (ReParseException e) { - reparser.fullAnalysysNeeded = true; syntacticallyOutdated = true; uptodateFiles.remove(file); @@ -373,14 +372,11 @@ public final class ProjectSourceSyntacticAnalyzer { ErrorReporter.logExceptionStackTrace(e); } } else { - reparser.fullAnalysysNeeded = true; reportOutdating(file); } } else if (highlySyntaxErroneousFiles.contains(file)) { - reparser.fullAnalysysNeeded = true; reportOutdating(file); } else { - reparser.fullAnalysysNeeded = true; MarkerHandler.markAllMarkersForRemoval(file); TemporalParseData temp = fileBasedTTCN3Analysis(file); postFileBasedGeneralAnalysis(temp); @@ -927,15 +923,15 @@ public final class ProjectSourceSyntacticAnalyzer { // add annotations on inactive code if (module != null && module instanceof TTCN3Module && document != null && editors != null) { - final TTCN3Module ttcn_module = (TTCN3Module) module; + final TTCN3Module ttcnModule = (TTCN3Module) module; final List<ISemanticTITANEditor> editors2 = editors; - final List<Location> icl_list = ttcn_module.getInactiveCodeLocations(); + final List<Location> icList = ttcnModule.getInactiveCodeLocations(); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { for (ISemanticTITANEditor editor : editors2) { if (editor instanceof TTCNPPEditor) { - ((TTCNPPEditor) editor).updateInactiveCodeAnnotations(icl_list); + ((TTCNPPEditor) editor).updateInactiveCodeAnnotations(icList); } } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/ASN1Analyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/ASN1Analyzer.java index 74ee8efb91..403b2c568a 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/ASN1Analyzer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/ASN1Analyzer.java @@ -12,25 +12,18 @@ import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.UnbufferedCharStream; import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.Interval; import org.eclipse.titan.common.parsers.SyntacticErrorStorage; import org.eclipse.titan.common.parsers.TITANMarker; import org.eclipse.titan.designer.AST.ASN1.definitions.ASN1Module; import org.eclipse.titan.designer.parsers.ISourceAnalyzer; -import org.eclipse.titan.designer.parsers.asn1parser.Asn1Lexer; -import org.eclipse.titan.designer.parsers.asn1parser.ASN1Listener; -import org.eclipse.titan.designer.parsers.asn1parser.Asn1Parser; -import org.eclipse.titan.designer.parsers.asn1parser.ModuleLevelTokenStreamTracker; -import org.eclipse.titan.designer.parsers.asn1parser.TokenWithIndexAndSubTokensFactory; /** * ASN1 Analyzer @@ -91,8 +84,8 @@ public class ASN1Analyzer implements ISourceAnalyzer { reader = new StringReader(code); } else if (file != null) { try { - reader = new BufferedReader(new InputStreamReader(file.getContents(), StandardCharsets.UTF_8)); - } catch (CoreException e) { + reader = new BufferedReader(new InputStreamReader(file.getContents(), file.getCharset())); + } catch (Exception e) { ErrorReporter.logExceptionStackTrace("Could not get the contents of `" + file.getName() + "'", e); } } else { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/Asn1Parser.g4 b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/Asn1Parser.g4 index 3d7bdbed22..100f3f27b6 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/Asn1Parser.g4 +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/asn1parser/Asn1Parser.g4 @@ -184,32 +184,32 @@ locals [Token col, ASN1Type type, Reference reference, ObjectClass_Definition ob { $type = $a.type; $assignment = new Type_Assignment($identifier, null, $type); - $assignment.setLocation(new Location(actualFile, $a.start, $a.start)); + $assignment.setLocation(new Location(actualFile, $a.start, $a.stop)); } | b = pr_FromObjs { $reference = $b.fromObj; $col = $b.start; $type = new Referenced_Type($reference); - $type.setLocation(new Location(actualFile, $b.start, $b.start)); + $type.setLocation(new Location(actualFile, $b.start, $b.stop)); $assignment = new Type_Assignment($identifier, null, $type); - $assignment.setLocation(new Location(actualFile, $col, $col)); + $assignment.setLocation(new Location(actualFile, $col, $b.stop)); } | c = pr_UpperFromObj { $reference = $c.fromObj; $col = $c.start; $type = new Referenced_Type($reference); - $type.setLocation(new Location(actualFile, $c.start, $c.start)); + $type.setLocation(new Location(actualFile, $c.start, $c.stop)); $assignment = new Type_Assignment($identifier, null, $type); - $assignment.setLocation(new Location(actualFile, $col, $col)); + $assignment.setLocation(new Location(actualFile, $col, $c.stop)); } | d = pr_ObjectClassDefn { $objectClass_Definition = $d.objectClass_Definition; $col = $d.start; $assignment = new ObjectClass_Assignment($identifier, null, $objectClass_Definition); - $assignment.setLocation(new Location(actualFile, $d.start, $d.start)); + $assignment.setLocation(new Location(actualFile, $d.start, $d.stop)); } ) EOF @@ -323,7 +323,7 @@ locals [ASN1Assignment assignment] ( a = pr_Assignment { $assignment = $a.assignment; if($assignment != null) { - $assignment.setLocation(new Location(actualFile, $a.start, $a.start)); + $assignment.setLocation(new Location(actualFile, $a.start, $a.stop)); $assignments.addAssignment($assignment); } } @@ -350,11 +350,11 @@ locals [ImportModule importModule] pr_Assignment returns [ASN1Assignment assignment] locals [Token endcol, Token col]: ( - a = pr_ValueAssignment { $assignment = $a.assignment; $col = $a.start; $endcol = $a.start; } -| b = pr_ValueSetTypeAssignment { $assignment = $b.assignment; $col = $b.start; $endcol = $b.start; } -| c = pr_UndefAssignment { $assignment = $c.assignment; $col = $c.start; $endcol = $c.start; } -| d = pr_ObjectClassAssignment { $assignment = $d.assignment; $col = $d.start; $endcol = $d.start; } -| e = pr_TypeAssignment { $assignment = $e.assignment; $col = $e.start; $endcol = $e.start; } + a = pr_ValueAssignment { $assignment = $a.assignment; $col = $a.start; $endcol = $a.stop; } +| b = pr_ValueSetTypeAssignment { $assignment = $b.assignment; $col = $b.start; $endcol = $b.stop; } +| c = pr_UndefAssignment { $assignment = $c.assignment; $col = $c.start; $endcol = $c.stop; } +| d = pr_ObjectClassAssignment { $assignment = $d.assignment; $col = $d.start; $endcol = $d.stop; } +| e = pr_TypeAssignment { $assignment = $e.assignment; $col = $e.start; $endcol = $e.stop; } ) { if ($assignment != null) { @@ -407,7 +407,7 @@ locals [Identifier identifier, Ass_pard formalParameters, ASN1Type type, Referen { $reference = $uo.fromObj; $type = new Referenced_Type($reference); - $type.setLocation(new Location(actualFile, $uo.start, $uo.start)); + $type.setLocation(new Location(actualFile, $uo.start, $uo.stop)); $assignment = new Type_Assignment($identifier, $formalParameters, $type); } @@ -417,7 +417,7 @@ locals [Identifier identifier, Ass_pard formalParameters, ASN1Type type, Referen { $reference = $fo.fromObj; $type = new Referenced_Type($reference); - $type.setLocation(new Location(actualFile, $fo.start, $fo.start)); + $type.setLocation(new Location(actualFile, $fo.start, $fo.stop)); $assignment = new Type_Assignment($identifier, $formalParameters, $type); } ) @@ -433,7 +433,7 @@ locals [Token endCol, Identifier identifier, Ass_pard formalParameters, ObjectCl cd = pr_ObjectClassDefn { $objectClass_Definition = $cd.objectClass_Definition; - $endCol = $cd.start; + $endCol = $cd.stop; $assignment = new ObjectClass_Assignment($identifier, $formalParameters, $objectClass_Definition); } ) @@ -523,11 +523,11 @@ locals [Token endcol, Identifier identifier, Reference reference, Reference refe a10 = pr_Type_reg { $type = $a10.type; } ASSIGNMENT ( - a11 = pr_Value_reg { $value = $a11.value; $endcol = $a11.start; } - | a12 = pr_NullValue { $value = $a12.value; $endcol = $a12.start; } + a11 = pr_Value_reg { $value = $a11.value; $endcol = $a11.stop; } + | a12 = pr_NullValue { $value = $a12.value; $endcol = $a12.stop; } | block1 = BLOCK { $value = new Undefined_Block_Value(new Block($block1)); $endcol = $block1;} - | a14 = pr_ReferencedValue_reg{ $value = $a14.value; $endcol = $a14.start; } - | a15 = pr_LowerIdValue { $value = $a15.value; $endcol = $a15.start; } + | a14 = pr_ReferencedValue_reg{ $value = $a14.value; $endcol = $a14.stop; } + | a15 = pr_LowerIdValue { $value = $a15.value; $endcol = $a15.stop; } ) { $assignment = new Value_Assignment($identifier, $formalParameters, $type, $value); @@ -537,7 +537,7 @@ locals [Token endcol, Identifier identifier, Reference reference, Reference refe ASSIGNMENT a21 = pr_Value { $value = $a21.value; } { - $endcol = $a21.start; + $endcol = $a21.stop; $type = new Referenced_Type($reference); $assignment = new Value_Assignment($identifier, $formalParameters, $type, $value); } @@ -545,7 +545,7 @@ locals [Token endcol, Identifier identifier, Reference reference, Reference refe ASSIGNMENT a31 = pr_Value { $value = $a31.value; } { - $endcol = $a31.start; + $endcol = $a31.stop; $type = new Referenced_Type($reference); $assignment = new Value_Assignment($identifier, $formalParameters, $type, $value); } @@ -555,13 +555,13 @@ locals [Token endcol, Identifier identifier, Reference reference, Reference refe ( a41 = pr_Value_reg { $value = $a41.value; }//value_assignment { - $endcol = $a41.start; + $endcol = $a41.stop; $type = new Referenced_Type($reference); $assignment = new Value_Assignment( $identifier, $formalParameters, $type, $value); } | a42 = pr_NullValue { $value = $a42.value; } //value_assignment { - $endcol = $a42.start; + $endcol = $a42.stop; $type = new Referenced_Type($reference); $assignment = new Value_Assignment($identifier, $formalParameters, $type, $value); } @@ -604,10 +604,10 @@ locals [ASN1Type subType, NamedType_Helper namedType_Helper, Constraint constrai { if($set != null) { $type = new SetOf_Type($subType); - $type.setLocation(new Location(actualFile, $set, $c.start != null ? $c.start : $d.start)); + $type.setLocation(new Location(actualFile, $set, $c.stop != null ? $c.stop : $d.stop)); } else if($sequence != null) { $type = new SequenceOf_Type($subType); - $type.setLocation(new Location(actualFile, $sequence, $c.start != null ? $c.start : $d.start)); + $type.setLocation(new Location(actualFile, $sequence, $c.stop != null ? $c.stop : $d.stop)); } if ($constraint != null && $type != null) { $constraints = new Constraints(); @@ -625,7 +625,7 @@ locals [ASN1Type subType, NamedType_Helper namedType_Helper, Constraint constrai )? // pr_BuiltinType_reg, pr_ConstrainedType { if ( $type != null ) { - $type.setLocation(new Location(actualFile, $builtin.start, $builtin.start)); + $type.setLocation(new Location(actualFile, $builtin.start, $builtin.stop)); $type.addConstraints($constraints); } } @@ -634,7 +634,7 @@ locals [ASN1Type subType, NamedType_Helper namedType_Helper, Constraint constrai { $constraints = $f.constraints; if ( $type != null ) { - $type.setLocation(new Location(actualFile, $ref.start, $ref.start)); + $type.setLocation(new Location(actualFile, $ref.start, $ref.stop)); $type.addConstraints($constraints); } } @@ -661,7 +661,7 @@ locals [Token end, Block withBlock] CLASS block1 = BLOCK { $end = $block1; } ( - block2 = pr_WithSyntaxSpec { $withBlock = $block2.block; $end = $block2.start; } + block2 = pr_WithSyntaxSpec { $withBlock = $block2.block; $end = $block2.stop; } )? ) { @@ -731,7 +731,7 @@ locals [FieldSpecification fieldSpecification] startCol = pr_FieldSpec { $fieldSpecification = $startCol.fieldSpecification; } { if ($fieldSpecification != null) { - $fieldSpecification.setLocation(new Location(actualFile, $startCol.start, $startCol.start)); + $fieldSpecification.setLocation(new Location(actualFile, $startCol.start, $startCol.stop)); $fieldSpecifications.addFieldSpecification($fieldSpecification); } } @@ -739,7 +739,7 @@ locals [FieldSpecification fieldSpecification] COMMA endCol = pr_FieldSpec { $fieldSpecification = $endCol.fieldSpecification; } { if($fieldSpecification != null) { - $fieldSpecification.setLocation(new Location(actualFile, $endCol.start, $endCol.start)); + $fieldSpecification.setLocation(new Location(actualFile, $endCol.start, $endCol.stop)); $fieldSpecifications.addFieldSpecification($fieldSpecification); } } @@ -901,8 +901,8 @@ pr_special_Value_subrule returns [Value value] @init { $value = null; }: ( // Originally pr_FixedTypeFieldValue, but moved to a separate branch not to have invalid lookaheads a = pr_BuiltinValue { $value = $a.value; } -| pr_ReferencedValue_reg -| b = pr_BuiltinValue { $value = $b.value; } +| b = pr_ReferencedValue_reg { $value = $b.value; } +| c = pr_BuiltinValue { $value = $c.value; } ); pr_special_Value_endCorrectingSubrule: @@ -1255,10 +1255,10 @@ locals [Type subType, NamedType_Helper namedType_Helper, Constraint constraint, { if ($set != null) { $type = new SetOf_Type($subType); - $type.setLocation(new Location(actualFile, $set, $namedTypecol.start != null ? $namedTypecol.start : $subTypecol.start)); + $type.setLocation(new Location(actualFile, $set, $namedTypecol.stop != null ? $namedTypecol.stop : $subTypecol.stop)); } else if ($sequence != null) { $type = new SequenceOf_Type($subType); - $type.setLocation(new Location(actualFile, $sequence, $namedTypecol.start != null ? $namedTypecol.start : $subTypecol.start)); + $type.setLocation(new Location(actualFile, $sequence, $namedTypecol.stop != null ? $namedTypecol.stop : $subTypecol.stop)); } if ($constraint != null && $type != null) { $constraints = new Constraints(); @@ -1272,12 +1272,12 @@ locals [Type subType, NamedType_Helper namedType_Helper, Constraint constraint, builtin = pr_BuiltinType_reg { $type = $builtin.type; - $type.setLocation(new Location(actualFile, $builtin.start, $builtin.start)); + $type.setLocation(new Location(actualFile, $builtin.start, $builtin.stop)); } | referenced = pr_ReferencedType { $type = $referenced.type; - $type.setLocation(new Location(actualFile, $referenced.start, $referenced.start)); + $type.setLocation(new Location(actualFile, $referenced.start, $referenced.stop)); } )//pr_NakedType_reg ( @@ -1371,7 +1371,7 @@ locals [Reference reference] ) { $value = new Referenced_Value($reference); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); }; pr_BuiltinType_reg returns [ASN1Type type] @@ -1404,7 +1404,7 @@ locals [Reference reference] ) { $type = new Referenced_Type($reference); - $type.setLocation(new Location(actualFile, $a.start, $a.start)); + $type.setLocation(new Location(actualFile, $a.start, $a.stop)); }; pr_Constraints returns[Constraints constraints] @@ -1654,7 +1654,7 @@ pr_SelectionType returns [Selection_Type type] { Identifier identifier = new Identifier(Identifier_type.ID_ASN, $start.getText(), new Location(actualFile, $start, $start)); $type = new Selection_Type(identifier, $a.type); - $type.setLocation(new Location(actualFile, $start, $a.start)); + $type.setLocation(new Location(actualFile, $start, $a.stop)); }; pr_EnumeratedType returns [ASN1_Enumerated_Type type] @@ -1900,7 +1900,7 @@ pr_ChoiceValue returns [Choice_Value value] identifier = new Identifier(Identifier_type.ID_ASN, $start.getText(), new Location(actualFile, $start, $start)); if ($a.value != null) { $value = new Choice_Value(identifier, $a.value); - $value.setLocation(new Location(actualFile, $start, $a.start)); + $value.setLocation(new Location(actualFile, $start, $a.stop)); } }; @@ -2032,7 +2032,7 @@ pr_UpperFromObj returns [InformationFromObj fromObj] ) { $fromObj = new InformationFromObj($a.reference, $b.fieldName); - $fromObj.setLocation(new Location(actualFile, $a.start, $b.start)); + $fromObj.setLocation(new Location(actualFile, $a.start, $b.stop)); }; pr_DefdUpper returns [Reference reference] @@ -2049,7 +2049,7 @@ pr_DefdUpper returns [Reference reference] ) { if($reference != null){ - $reference.setLocation(new Location(actualFile, $a.start, $block != null ? $block:$a.start)); + $reference.setLocation(new Location(actualFile, $a.start, $block != null ? $block:$a.stop)); } }; @@ -2222,14 +2222,14 @@ pr_Lower_FromObjs returns [InformationFromObj fromObj] ) { $fromObj = new InformationFromObj($a.reference, $b.fieldName); - $fromObj.setLocation(new Location(actualFile, $a.start, $b.start)); + $fromObj.setLocation(new Location(actualFile, $a.start, $b.stop)); }; pr_Upper_FromObjs returns[InformationFromObj fromObj] locals [Token end, Defined_Reference ref, FieldName fieldName] @init { $ref = null; $fieldName = null; $fromObj = null; }: ( - a = pr_SimplDefdUpper {$ref = $a.reference; $end = $a.start;} + a = pr_SimplDefdUpper {$ref = $a.reference; $end = $a.stop;} ( block = BLOCK //if there is block then pr_PardUpper_FromObjs, if not pr_SimplUpper_FromObjs { @@ -2239,8 +2239,8 @@ locals [Token end, Defined_Reference ref, FieldName fieldName] )? DOT ( - b1 = pr_FieldNameLower { $end = $b1.start; $fieldName = $b1.fieldName; } - | b2 = pr_FieldNameUpper { $end = $b2.start; $fieldName = $b2.fieldName; } + b1 = pr_FieldNameLower { $end = $b1.stop; $fieldName = $b1.fieldName; } + | b2 = pr_FieldNameUpper { $end = $b2.stop; $fieldName = $b2.fieldName; } ( DOT ( @@ -2566,7 +2566,7 @@ locals [Token referenceEnd, Identifier identifier, ASN1Type type, boolean is_uni | pr_RefdLower_reg | DOT ( - d41 = pr_FieldNameLower { $fieldName = $d41.fieldName; $referenceEnd = $d41.start; } + d41 = pr_FieldNameLower { $fieldName = $d41.fieldName; $referenceEnd = $d41.stop; } | d42 = pr_FieldNameUpper { $fieldName = $d42.fieldName; } ( DOT @@ -2624,7 +2624,7 @@ locals [Token referenceEnd, Identifier identifier, ASN1Type type, boolean is_uni ) | DOT ( - a2 = pr_FieldNameLower { $fieldName = $a2.fieldName; $referenceEnd = $a2.start; } + a2 = pr_FieldNameLower { $fieldName = $a2.fieldName; $referenceEnd = $a2.stop; } | a21 = pr_FieldNameUpper { $fieldName = $a21.fieldName; } ( DOT ( @@ -2699,7 +2699,7 @@ locals [Values values] { if ($values != null) { $value = new SequenceOf_Value($values); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); } }; @@ -2747,7 +2747,7 @@ locals [Values values] { if ($values != null) { $value = new SetOf_Value($values); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); } }; @@ -2769,7 +2769,7 @@ locals [NamedValues namedValues] { if ($namedValues != null) { $value = new Sequence_Value($namedValues); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); } }; @@ -2802,7 +2802,7 @@ locals [Value value] { Identifier identifier = new Identifier(Identifier_type.ID_ASN, $a.getText(), new Location(actualFile, $a, $a)); $namedValue = new NamedValue(identifier, $value); - $namedValue.setLocation(new Location(actualFile, $a, $b.start == null ? $a : $b.start)); + $namedValue.setLocation(new Location(actualFile, $a, $b.start == null ? $a : $b.stop)); }; pr_special_SetValue returns [Set_Value value] @@ -2823,7 +2823,7 @@ locals [NamedValues namedValues] { if ($namedValues != null) { $value = new Set_Value($namedValues); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); } }; @@ -2838,7 +2838,7 @@ pr_ObjectIdentifierValue returns[ObjectIdentifier_Value value] @init { $value = new ObjectIdentifier_Value(); }: a = pr_ObjIdComponentList[$value] { - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); }; pr_ObjIdComponentList [ObjectIdentifier_Value value] @@ -2871,7 +2871,7 @@ locals [Value value] $value = $c.value; if ($value != null) { $objidComponent = new ObjectIdentifierComponent($value); - $objidComponent.setLocation(new Location(actualFile, $c.start, $c.start)); + $objidComponent.setLocation(new Location(actualFile, $c.start, $c.stop)); } } ); @@ -2885,7 +2885,7 @@ locals [Value value] { if ($value != null) { $objidComponent = new ObjectIdentifierComponent($value); - $objidComponent.setLocation(new Location(actualFile, $b.start, $b.start)); + $objidComponent.setLocation(new Location(actualFile, $b.start, $b.stop)); } } ); @@ -2898,7 +2898,7 @@ locals [Reference reference] ) { $value = new Referenced_Value($reference); - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); }; pr_NameAndNumberForm returns[ObjectIdentifierComponent objidComponent] @@ -2946,7 +2946,7 @@ pr_RelativeOIDValue returns[RelativeObjectIdentifier_Value value = new RelativeO @init { $value = new RelativeObjectIdentifier_Value(); } : a = pr_RelativeOIDComponentList[$value] { - $value.setLocation(new Location(actualFile, $a.start, $a.start)); + $value.setLocation(new Location(actualFile, $a.start, $a.stop)); }; pr_RelativeOIDComponentList [RelativeObjectIdentifier_Value value] @@ -2972,7 +2972,7 @@ locals [Value value] $value = $b.value; if ($value != null) { $objidComponent = new ObjectIdentifierComponent($value); - $objidComponent.setLocation(new Location(actualFile, $b.start, $b.start));} + $objidComponent.setLocation(new Location(actualFile, $b.start, $b.stop));} } ); @@ -3053,7 +3053,10 @@ locals [NamedType_Helper helper, CompField field] { $helper = $a.helper; $field = new CompField($helper.identifier, $helper.type, false, null); - $componentTypeList.addComponentType(new RegularComponentType($field)); + $field.setLocation(new Location(actualFile, $a.start, $a.stop)); + RegularComponentType componentType = new RegularComponentType($field); + componentType.setLocation(new Location(actualFile, $a.start, $a.stop)); + $componentTypeList.addComponentType(componentType); } ( COMMA @@ -3061,7 +3064,10 @@ locals [NamedType_Helper helper, CompField field] { $helper = $b.helper; $field = new CompField($helper.identifier, $helper.type, false, null); - $componentTypeList.addComponentType(new RegularComponentType($field)); + $field.setLocation(new Location(actualFile, $a.start, $b.stop)); + RegularComponentType componentType2 = new RegularComponentType($field); + componentType2.setLocation(new Location(actualFile, $a.start, $b.stop)); + $componentTypeList.addComponentType(componentType2); } )* ); @@ -3115,7 +3121,10 @@ locals [ComponentTypeList componentTypeList, NamedType_Helper helper] { $helper = $b.helper; CompField compField = new CompField($helper.identifier, $helper.type, false, null); - $extensionAddition = new RegularComponentType(compField); + compField.setLocation(new Location(actualFile, $b.start, $b.stop)); + RegularComponentType componentType = new RegularComponentType(compField); + componentType.setLocation(new Location(actualFile, $b.start, $b.stop)); + $extensionAddition = componentType; } ); @@ -3242,7 +3251,9 @@ locals [CompField compField, ASN1Type type] { $compField = $a.compField; if($compField != null){ + $compField.setLocation(new Location(actualFile, $a.start, $a.stop)); $componentType = new RegularComponentType($compField); + $componentType.setLocation(new Location(actualFile, $a.start, $a.stop)); } } | COMPONENTS @@ -3252,7 +3263,8 @@ locals [CompField compField, ASN1Type type] $type = $b.type; if ($type != null) { $componentType = new ComponentsOfComponentType($type); - $componentType.setLocation(new Location(actualFile, $b.start, $b.start)); + $componentType.setLocation(new Location(actualFile, $b.start, $b.stop)); + $componentType.setLocation(new Location(actualFile, $b.start, $b.stop)); } } ); @@ -3301,7 +3313,7 @@ pr_special_ObjectSetSpec returns [ObjectSet_definition definition] EOF ) { - if ($definition != null) { $definition.setLocation(new Location(actualFile, $a.start, $a.start)); } + if ($definition != null) { $definition.setLocation(new Location(actualFile, $a.start, $a.stop)); } }; pr_ObjectSetSpec returns [ObjectSet_definition definition] @@ -3348,7 +3360,7 @@ locals [IObjectSet_Element element] ) { if ($definition != null) { - $definition.setLocation(new Location(actualFile, $a.start, $a.start == null ? $b.start : $a.start)); + $definition.setLocation(new Location(actualFile, $a.start, $a.stop == null ? $b.stop : $a.stop)); } }; @@ -3361,7 +3373,7 @@ locals [Reference reference] { $reference = $b.reference; Referenced_ObjectSet temp = new Referenced_ObjectSet($reference); - temp.setLocation(new Location(actualFile, $b.start, $b.start)); + temp.setLocation(new Location(actualFile, $b.start, $b.stop)); $element = temp; } ); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3Analyzer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3Analyzer.java index 99af224682..8bda4977ea 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3Analyzer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3Analyzer.java @@ -134,7 +134,7 @@ public class TTCN3Analyzer implements ISourceAnalyzer { return; } - parse4( reader, rootInt, aFile ); + parse( reader, rootInt, aFile ); } /** @@ -153,7 +153,7 @@ public class TTCN3Analyzer implements ISourceAnalyzer { return; } - parse4( bufferedReader, fileLength, null ); + parse( bufferedReader, fileLength, null ); } /** @@ -162,10 +162,11 @@ public class TTCN3Analyzer implements ISourceAnalyzer { * @param aFileLength file length * @param aEclipseFile Eclipse dependent resource file */ - private void parse4( final Reader aReader, final int aFileLength, IFile aEclipseFile ) { + private void parse( final Reader aReader, final int aFileLength, IFile aEclipseFile ) { CharStream charStream = new UnbufferedCharStream( aReader ); Ttcn3Lexer lexer = new Ttcn3Lexer( charStream ); + lexer.setCommentTodo( true ); lexer.setTokenFactory( new CommonTokenFactory( true ) ); lexer.initRootInterval( aFileLength ); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3ReparseUpdater.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3ReparseUpdater.java index 7244f377f9..328d263004 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3ReparseUpdater.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/TTCN3ReparseUpdater.java @@ -10,7 +10,6 @@ package org.eclipse.titan.designer.parsers.ttcn3parser; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -75,12 +74,6 @@ public final class TTCN3ReparseUpdater { */ private boolean namechanged = false; - /** stores the list of modules that need to be re-analyzed when incremental semantic checking is used.*/ - public HashSet<String> moduleToBeReanalysed = new HashSet<String>(); - - /** Indicates whether a full semantic analyzes is required even if using incremental ones would be allowed.*/ - public boolean fullAnalysysNeeded = false; - public TTCN3ReparseUpdater(final IFile file, final String code, int firstLine, int lineShift, int startOffset, int endOffset, int shift) { this.file = file; this.code = code; @@ -395,7 +388,13 @@ public final class TTCN3ReparseUpdater { insideString = true; nextPos++; while (nextPos < rangeEnd && ('\"' != substring.charAt(nextPos) || '\"' == substring.charAt(nextPos - 1))) { - nextPos++; + if('\"' != substring.charAt(nextPos)) { + nextPos++; + } else if (nextPos + 1 < rangeEnd && '\"' == substring.charAt(nextPos + 1)) { + nextPos += 2; + } else { + break; + } } if (nextPos < rangeEnd) { insideString = false; @@ -425,7 +424,7 @@ public final class TTCN3ReparseUpdater { if (insideSingleComment || insideMultiComment || insideString) { return Integer.MAX_VALUE; } - return ++result; + return result; } /** @@ -553,6 +552,9 @@ public final class TTCN3ReparseUpdater { unsupportedConstructs.addAll(parser.getUnsupportedConstructs()); int result = measureIntervallDamage(); + if(!parser.isErrorListEmpty()){ + ++result; + } return result; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3BaseLexer.g4 b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3BaseLexer.g4 index 445e2716f7..78858a0474 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3BaseLexer.g4 +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3BaseLexer.g4 @@ -17,6 +17,8 @@ lexer grammar Ttcn3BaseLexer; @header { import java.util.ArrayList; import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -104,58 +106,56 @@ import org.eclipse.titan.designer.AST.Location; public Location getLastPPDirectiveLocation() { return lastPPDirectiveLocation; } + + /** + * true, if todo/fixme markers can be placed by the lexer, + * typically it is set if full parsing is done + * false otherwise + */ + private boolean mCommentTodo = false; + + public void setCommentTodo( boolean aCommentTodo ) { + mCommentTodo = aCommentTodo; + } //TODO: we will need it later for the performance /** Used to preload the class, also loading the TTCN-3 lexer. */ public static void preLoad() { } - protected void detectTasks(final String param, final boolean multiLine) { - int todoIndex; - int fixmeIndex; - int newLineIndex; - int lastIndex = 0; - todoIndex = param.indexOf("TODO"); - fixmeIndex = param.indexOf("FIXME"); - int linecount = 0; - - while (todoIndex != -1 || fixmeIndex != -1) { - int start; - if (todoIndex > 0) { - if (fixmeIndex > 0 && fixmeIndex < todoIndex) { - start = fixmeIndex; - } else { - start = todoIndex; - } - } else { - start = fixmeIndex; - } - newLineIndex = param.indexOf('\n', lastIndex); - if (newLineIndex == -1 || newLineIndex > start) { - if (newLineIndex == -1) { - if(multiLine) { - newLineIndex = param.length() - 2; - } else { - newLineIndex = param.length(); - } - } - - String text = param.substring(start, newLineIndex); - if (start == todoIndex) { - createTaskMarker(new TITANMarker(text, actualLine + linecount + _tokenStartLine, -1, -1, - IMarker.SEVERITY_INFO, IMarker.PRIORITY_NORMAL)); - } else { - createTaskMarker(new TITANMarker(text, actualLine + linecount + _tokenStartLine, -1, -1, - IMarker.SEVERITY_INFO, IMarker.PRIORITY_HIGH)); + /** pattern for matching todo/fixme in a comment line */ + final static Pattern PATTERN_TODO_FIXME = Pattern.compile("((TODO|FIXME).*?)\\s*(?=(TODO|FIXME|$))"); + + /** + * Extracts todo and fixme information from comment text + * @param aCommentText the full text of the comment token + * @param aMultiLine type of comment. true: / * ... * /, false: / / ... \n + */ + private void detectTasks( final String aCommentText, final boolean aMultiLine ) { + if ( !mCommentTodo ) { + return; + } + // remove comment boundary characters + String commentText; + if ( aMultiLine ) { + commentText = aCommentText.substring( 2, aCommentText.length() - 2 ); + } else { + commentText = aCommentText.substring( 2 ); + } + + String commentLines[] = commentText.split("\\r?\\n"); + for( int i = 0; i < commentLines.length; i++ ) { + String commentLine = commentLines[ i ]; + Matcher m = PATTERN_TODO_FIXME.matcher(commentLine); + while ( m.find() ) { + String text = m.group( 1 ); + if ( text != null ) { + createTaskMarker( new TITANMarker( text, actualLine + i + _tokenStartLine, -1, -1, + IMarker.SEVERITY_INFO, text.startsWith("TODO") ? IMarker.PRIORITY_NORMAL : IMarker.PRIORITY_HIGH ) ); } } - - linecount++; - lastIndex = newLineIndex + 1; - todoIndex = param.indexOf("TODO", lastIndex); - fixmeIndex = param.indexOf("FIXME", lastIndex); } - } + } } /*------------------------------------------- Keywords -------------------------------------------*/ diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 index 3330fc3dac..fe65c80f48 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 @@ -913,7 +913,7 @@ pr_NestedFunctionTypeDef returns[Type type = null] ReturnType_Helper helper = null; Type returnType = null; boolean returnsTemplate = false; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; Configuration_Helper confighelper = new Configuration_Helper(); }: ( col = pr_FunctionKeyword @@ -926,7 +926,7 @@ pr_NestedFunctionTypeDef returns[Type type = null] if( helper != null ) { returnType = helper.type; returnsTemplate = helper.returnsTemplate; - template_restriction = helper.templateRestriction; + templateRestriction = helper.templateRestriction; } } )? @@ -934,7 +934,7 @@ pr_NestedFunctionTypeDef returns[Type type = null] { if(parList == null) { parList = new FormalParameterList(new ArrayList<FormalParameter>()); } parList.setLocation(getLocation( $start1.start, $end1.stop)); - $type = new Function_Type(parList, confighelper.runsonReference, confighelper.runsOnSelf, returnType, returnsTemplate, template_restriction); + $type = new Function_Type(parList, confighelper.runsonReference, confighelper.runsOnSelf, returnType, returnsTemplate, templateRestriction); $type.setLocation(getLocation( $start, getStopToken())); }; @@ -1292,18 +1292,18 @@ pr_ValueOrRange returns[ParsedSubType parsedSubType = null]: pr_RangeDef returns[ParsedSubType parsedSubType = null] @init { - boolean min_exclusive = false; - boolean max_exclusive = false; + boolean minExclusive = false; + boolean maxExclusive = false; }: -( ( pr_ExcludeBound { min_exclusive = true; } )? +( ( pr_ExcludeBound { minExclusive = true; } )? min = pr_LowerBound RANGEOP - ( pr_ExcludeBound { max_exclusive = true; } )? + ( pr_ExcludeBound { maxExclusive = true; } )? max = pr_UpperBound ) { if ( $min.value != null && $max.value != null ) { - $parsedSubType = new Range_ParsedSubType( $min.value, min_exclusive, $max.value, max_exclusive ); + $parsedSubType = new Range_ParsedSubType( $min.value, minExclusive, $max.value, maxExclusive ); } }; @@ -1667,7 +1667,7 @@ pr_FunctionTypeDef returns[Def_Type def_type = null] ReturnType_Helper helper = null; Type returnType = null; boolean returnsTemplate = false; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; Configuration_Helper confighelper = new Configuration_Helper(); }: ( col = pr_FunctionKeyword @@ -1681,7 +1681,7 @@ pr_FunctionTypeDef returns[Def_Type def_type = null] if(helper != null) { returnType = helper.type; returnsTemplate = helper.returnsTemplate; - template_restriction = helper.templateRestriction; + templateRestriction = helper.templateRestriction; } } )? @@ -1690,7 +1690,7 @@ pr_FunctionTypeDef returns[Def_Type def_type = null] if($i.identifier != null) { if(parList == null) { parList = new FormalParameterList(new ArrayList<FormalParameter>()); } parList.setLocation(getLocation( $start1.start, $end1.stop)); - Type type = new Function_Type(parList, confighelper.runsonReference, confighelper.runsOnSelf, returnType, returnsTemplate, template_restriction); + Type type = new Function_Type(parList, confighelper.runsonReference, confighelper.runsOnSelf, returnType, returnsTemplate, templateRestriction); type.setLocation(getLocation( $col.start, getStopToken())); $def_type = new Def_Type($i.identifier, type); } @@ -1751,21 +1751,21 @@ pr_TestcaseTypeDef returns[Def_Type def_type = null] pr_TemplateDef returns[Def_Template def_template = null] @init { - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; Template_definition_helper helper = new Template_definition_helper(); - Reference derived_reference = null; + Reference derivedReference = null; TemplateBody body = null; }: ( col = pr_TemplateKeyword - ( t = pr_TemplateRestriction { template_restriction = $t.template_restriction; } )? + ( t = pr_TemplateRestriction { templateRestriction = $t.templateRestriction; } )? pr_BaseTemplate[helper] - ( d = pr_DerivedDef { derived_reference = $d.reference; } )? + ( d = pr_DerivedDef { derivedReference = $d.reference; } )? pr_AssignmentChar b = pr_TemplateBody ) { if(helper.identifier != null && helper.type != null && $b.body != null) { - $def_template = new Def_Template(template_restriction, helper.identifier, helper.type, helper.formalParList, derived_reference, $b.body.getTemplate()); + $def_template = new Def_Template(templateRestriction, helper.identifier, helper.type, helper.formalParList, derivedReference, $b.body.getTemplate()); $def_template.setLocation(getLocation( $col.start, $b.stop)); $def_template.setCommentLocation(lexer.getLastCommentLocation()); } @@ -2360,7 +2360,7 @@ pr_FunctionDef returns[Def_Function def_func = null] ReturnType_Helper returnHelper = null; Type returnType = null; boolean returnsTemplate = false; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; Location commentLocation = lexer.getLastCommentLocation(); if (commentLocation != null) { lexer.clearLastCommentLocation(); @@ -2377,7 +2377,7 @@ pr_FunctionDef returns[Def_Function def_func = null] if(returnHelper != null) { returnType = returnHelper.type; returnsTemplate = returnHelper.returnsTemplate; - template_restriction = returnHelper.templateRestriction; + templateRestriction = returnHelper.templateRestriction; } } )? @@ -2387,7 +2387,7 @@ pr_FunctionDef returns[Def_Function def_func = null] if($i.identifier != null && statementBlock != null) { if(parameters == null) { parameters = new FormalParameterList(new ArrayList<FormalParameter>()); } parameters.setLocation(getLocation( $start1.start, $end.stop)); - $def_func = new Def_Function($i.identifier, parameters, runsonHelper.runsonReference, returnType, returnsTemplate, template_restriction, statementBlock); + $def_func = new Def_Function($i.identifier, parameters, runsonHelper.runsonReference, returnType, returnsTemplate, templateRestriction, statementBlock); $def_func.setLocation(getLocation( $col.start, $s.stop)); $def_func.setCommentLocation(commentLocation); } @@ -2421,16 +2421,16 @@ pr_ReturnType returns[ReturnType_Helper helper] @init { $helper = new ReturnType_Helper(); boolean returnsTemplate = false; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; }: ( col = RETURN - ( tr = pr_TemplateOptRestricted { returnsTemplate = true; template_restriction = $tr.template_restriction; } )? + ( tr = pr_TemplateOptRestricted { returnsTemplate = true; templateRestriction = $tr.templateRestriction; } )? t = pr_Type ) { $helper.type = $t.type; $helper.returnsTemplate = returnsTemplate; - $helper.templateRestriction = template_restriction; + $helper.templateRestriction = templateRestriction; }; pr_RunsOnSpec [Configuration_Helper helper]: @@ -2849,15 +2849,15 @@ pr_SystemKeyword: pr_TestcaseInstanceOp returns[Value value = null] @init { - Value dereferedValue = null; - boolean isDerefered = false; + Value dereferredValue = null; + boolean isDereferred = false; Reference temporalReference = null; ParsedActualParameters parameters = null; Value timerValue = null; }: ( col = EXECUTE pr_LParen - ( dv = pr_DereferOp { dereferedValue = $dv.value; isDerefered = true; } + ( dv = pr_DereferOp { dereferredValue = $dv.value; isDereferred = true; } | tr = pr_FunctionRef { temporalReference = $tr.reference; } ) parstart = pr_LParen @@ -2874,8 +2874,8 @@ pr_TestcaseInstanceOp returns[Value value = null] } parameters.setLocation(getLocation( $parstart.start, $parend.stop)); - if(isDerefered) { - $value = new ExecuteDereferedExpression(dereferedValue, parameters, timerValue); + if(isDereferred) { + $value = new ExecuteDereferedExpression(dereferredValue, parameters, timerValue); } else if(temporalReference != null) { Location temporalLocation = temporalReference.getLocation(); ISubReference subReference = temporalReference.removeLastSubReference(); @@ -2891,15 +2891,15 @@ pr_TestcaseInstanceOp returns[Value value = null] pr_TestcaseInstanceStatement returns[Statement statement = null] @init { - Value dereferedValue = null; - boolean isDerefered = false; + Value dereferredValue = null; + boolean isDereferred = false; Reference temporalReference = null; ParsedActualParameters parameters = null; Value timerValue = null; }: ( col = EXECUTE pr_LParen - ( dv = pr_DereferOp { dereferedValue = $dv.value; isDerefered = true; } + ( dv = pr_DereferOp { dereferredValue = $dv.value; isDereferred = true; } | tr = pr_FunctionRef { temporalReference = $tr.reference; } ) parstart = pr_LParen @@ -2916,8 +2916,8 @@ pr_TestcaseInstanceStatement returns[Statement statement = null] } parameters.setLocation(getLocation( $parstart.start, $parend.stop)); - if(isDerefered) { - $statement = new Referenced_Testcase_Instance_Statement(dereferedValue, parameters, timerValue); + if(isDereferred) { + $statement = new Referenced_Testcase_Instance_Statement(dereferredValue, parameters, timerValue); $statement.setLocation(getLocation( $col, $endcol.stop)); } else if(temporalReference != null) { Location temporalLocation = temporalReference.getLocation(); @@ -3547,7 +3547,7 @@ pr_ExtFunctionDef returns [Def_Extfunction def_extfunction = null] FormalParameterList parameters = null; Type returnType = null; boolean returnsTemplate = false; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; }: ( col = pr_ExtKeyword pr_FunctionKeyword @@ -3560,7 +3560,7 @@ pr_ExtFunctionDef returns [Def_Extfunction def_extfunction = null] if(helper != null) { returnType = helper.type; returnsTemplate = helper.returnsTemplate; - template_restriction = helper.templateRestriction; + templateRestriction = helper.templateRestriction; } } )? @@ -3569,7 +3569,7 @@ pr_ExtFunctionDef returns [Def_Extfunction def_extfunction = null] if($i.identifier != null) { if(parameters == null) { parameters = new FormalParameterList(new ArrayList<FormalParameter>()); } parameters.setLocation(getLocation( $start1.start, $enda.stop)); - $def_extfunction = new Def_Extfunction($i.identifier, parameters, returnType, returnsTemplate, template_restriction); + $def_extfunction = new Def_Extfunction($i.identifier, parameters, returnType, returnsTemplate, templateRestriction); $def_extfunction.setLocation(getLocation( $start, getStopToken())); } }; @@ -3827,12 +3827,12 @@ pr_VarInstance returns[List<Definition> definitions] @init { $definitions = new ArrayList<Definition>(); List<Identifier> identifiers = null; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; }: ( col = pr_VarKeyword - ( tr = pr_TemplateOptRestricted { template_restriction = $tr.template_restriction; } + ( tr = pr_TemplateOptRestricted { templateRestriction = $tr.templateRestriction; } t = pr_Type - pr_TempVarList[ $definitions, $t.type, template_restriction ] + pr_TempVarList[ $definitions, $t.type, templateRestriction ] | t2 = pr_Type pr_VarList[ $definitions, $t2.type ] ) @@ -3850,14 +3850,14 @@ pr_VarInstance returns[List<Definition> definitions] } }; -pr_TempVarList [List<Definition> definitions, Type type, TemplateRestriction.Restriction_type template_restriction]: -( pr_SingleTempVarInstance[definitions, type, template_restriction] +pr_TempVarList [List<Definition> definitions, Type type, TemplateRestriction.Restriction_type templateRestriction]: +( pr_SingleTempVarInstance[definitions, type, templateRestriction] ( pr_Comma - pr_SingleTempVarInstance[definitions, type, template_restriction] + pr_SingleTempVarInstance[definitions, type, templateRestriction] )* ); -pr_SingleTempVarInstance [List<Definition> definitions, Type type, TemplateRestriction.Restriction_type template_restriction] +pr_SingleTempVarInstance [List<Definition> definitions, Type type, TemplateRestriction.Restriction_type templateRestriction] @init { TemplateBody body = null; ArrayDimensions dimensions = null; @@ -3878,7 +3878,7 @@ pr_SingleTempVarInstance [List<Definition> definitions, Type type, TemplateRestr } } - Definition definition = new Def_Var_Template( $template_restriction, $i.identifier, tempType, body != null ? body.getTemplate() : null ); + Definition definition = new Def_Var_Template( $templateRestriction, $i.identifier, tempType, body != null ? body.getTemplate() : null ); definition.setLocation(getLocation( $start, getStopToken())); $definitions.add(definition); } @@ -4156,8 +4156,8 @@ pr_ConnectStatement returns[Connect_Statement statement = null]: ) { if($h.helper != null) { - $statement = new Connect_Statement( $h.helper.componentReference1, $h.helper.portReference1, - $h.helper.componentReference2, $h.helper.portReference2 ); + $statement = new Connect_Statement( $h.helper.componentReference1, new PortReference($h.helper.portReference1), + $h.helper.componentReference2, new PortReference($h.helper.portReference2) ); $statement.setLocation(getLocation( $col.start, $h.stop)); } }; @@ -4209,7 +4209,7 @@ pr_DisconnectStatement returns[Disconnect_Statement statement = null] if(helper != null && helper.componentReference1 != null && helper.portReference1 != null && helper.componentReference2 != null && helper.portReference2 != null) { - $statement = new Disconnect_Statement(helper.componentReference1, helper.portReference1, helper.componentReference2, helper.portReference2); + $statement = new Disconnect_Statement(helper.componentReference1, new PortReference(helper.portReference1), helper.componentReference2, new PortReference(helper.portReference2)); $statement.setLocation(getLocation( $col.start, $h.stop)); } else { reportUnsupportedConstruct( "Disconnect operation on multiple connections is not currently supported", $col.start, $col.stop ); @@ -4267,8 +4267,8 @@ pr_MapStatement returns[Map_Statement statement = null]: ) { if($h.helper != null) { - $statement = new Map_Statement( $h.helper.componentReference1, $h.helper.portReference1, - $h.helper.componentReference2, $h.helper.portReference2 ); + $statement = new Map_Statement( $h.helper.componentReference1, new PortReference($h.helper.portReference1), + $h.helper.componentReference2, new PortReference($h.helper.portReference2) ); $statement.setLocation(getLocation( $col.start, $h.stop)); } }; @@ -4290,7 +4290,7 @@ pr_UnmapStatement returns[Unmap_Statement statement = null] if(helper != null && helper.componentReference1 != null && helper.portReference1 != null && helper.componentReference2 != null && helper.portReference2 != null) { - $statement = new Unmap_Statement(helper.componentReference1, helper.portReference1, helper.componentReference2, helper.portReference2); + $statement = new Unmap_Statement(helper.componentReference1, new PortReference(helper.portReference1), helper.componentReference2, new PortReference(helper.portReference2)); $statement.setLocation(getLocation( $col.start, $h.stop)); } else { reportUnsupportedConstruct( "Unmap operation on multiple mappings is not currently supported", $col.start, $col.stop ); @@ -4304,7 +4304,7 @@ pr_UnmapKeyword: pr_StartTCStatement returns[Statement statement = null] @init { Value component = null; - Value dereferedValue = null; + Value dereferredValue = null; Reference functionref = null; ParsedActualParameters parameters = null; }: @@ -4312,13 +4312,13 @@ pr_StartTCStatement returns[Statement statement = null] pr_Dot START pr_LParen - ( ( dv = pr_DereferOp { dereferedValue = $dv.value; } + ( ( dv = pr_DereferOp { dereferredValue = $dv.value; } a1=pr_LParen ( p = pr_FunctionActualParList { parameters = $p.parsedParameters; } )? a2=pr_RParen { if(parameters == null) { parameters = new ParsedActualParameters(); } parameters.setLocation(getLocation( $a1.start, $a2.stop)); - $statement = new Start_Referenced_Component_Statement( component, dereferedValue, parameters ); + $statement = new Start_Referenced_Component_Statement( component, dereferredValue, parameters ); } ) | f = pr_FunctionInstance @@ -4755,7 +4755,7 @@ pr_ParamSpec returns[Parameter_Redirect redirect = null]: pr_ParamAssignmentList returns[Parameter_Redirect redirect = null]: ( col = pr_LParen - ( assignments = pr_AssignmentList { $redirect = new AssignmentList_Parameter_Redirect($assignments.parameter_assignments); } + ( assignments = pr_AssignmentList { $redirect = new AssignmentList_Parameter_Redirect($assignments.parameterAssignments); } | entries = pr_VariableList { $redirect = new VariableList_Parameter_Redirect($entries.entries); } ) endcol = pr_RParen @@ -4766,14 +4766,14 @@ pr_ParamAssignmentList returns[Parameter_Redirect redirect = null]: } }; -pr_AssignmentList returns[Parameter_Assignments parameter_assignments = null]: +pr_AssignmentList returns[Parameter_Assignments parameterAssignments = null]: ( p = pr_VariableAssignment - { $parameter_assignments = new Parameter_Assignments(); - if( $p.param_assignment != null ) { $parameter_assignments.add( $p.param_assignment ); } + { $parameterAssignments = new Parameter_Assignments(); + if( $p.param_assignment != null ) { $parameterAssignments.add( $p.param_assignment ); } } ( pr_Comma p = pr_VariableAssignment - { if( $p.param_assignment != null ) { $parameter_assignments.add( $p.param_assignment ); } } + { if( $p.param_assignment != null ) { $parameterAssignments.add( $p.param_assignment ); } } )* ); @@ -4996,7 +4996,7 @@ pr_AnyKeyword: pr_TimerStatements returns[Statement statement = null] @init { Value timerValue = null; - Value dereferedValue = null; + Value dereferredValue = null; ParsedActualParameters parameters = null; }: ( r = pr_TimerRef @@ -5006,7 +5006,7 @@ pr_TimerStatements returns[Statement statement = null] | START ( pr_LParen ( tv = pr_TimerValue { timerValue = $tv.value; } - | dv = pr_DereferOp { dereferedValue = $dv.value; } + | dv = pr_DereferOp { dereferredValue = $dv.value; } a1=pr_LParen ( p = pr_FunctionActualParList { parameters = $p.parsedParameters; } )? a2=pr_RParen @@ -5016,10 +5016,10 @@ pr_TimerStatements returns[Statement statement = null] ) pr_RParen )? - { if(dereferedValue != null) { + { if(dereferredValue != null) { Value component = new Referenced_Value( $r.reference ); component.setLocation( getLocation( $r.start, $r.stop ) ); - $statement = new Start_Referenced_Component_Statement( component, dereferedValue, parameters ); + $statement = new Start_Referenced_Component_Statement( component, dereferredValue, parameters ); } else { $statement = new Unknown_Start_Statement( $r.reference, timerValue ); } @@ -5336,15 +5336,15 @@ pr_Macro returns[Macro_Value value = null]: pr_FormalValuePar returns[FormalParameter parameter = null] @init { - Assignment_type assignment_type = Assignment_type.A_PAR_VAL; + Assignment_type assignmentType = Assignment_type.A_PAR_VAL; boolean isLazy = false; TemplateInstance default_value = null; Location commentLocation = lexer.getLastCommentLocation(); }: -( ( IN { assignment_type = Assignment_type.A_PAR_VAL_IN; } +( ( IN { assignmentType = Assignment_type.A_PAR_VAL_IN; } ( TITANSPECIFICLAZY { isLazy = true; } )? - | INOUT { assignment_type = Assignment_type.A_PAR_VAL_INOUT; } - | OUT { assignment_type = Assignment_type.A_PAR_VAL_OUT; } + | INOUT { assignmentType = Assignment_type.A_PAR_VAL_INOUT; } + | OUT { assignmentType = Assignment_type.A_PAR_VAL_OUT; } | TITANSPECIFICLAZY { isLazy = true; } )? t = pr_Type @@ -5362,7 +5362,7 @@ pr_FormalValuePar returns[FormalParameter parameter = null] )? ) { - $parameter = new FormalParameter(TemplateRestriction.Restriction_type.TR_NONE, assignment_type, $t.type, $i.identifier, default_value, isLazy); + $parameter = new FormalParameter(TemplateRestriction.Restriction_type.TR_NONE, assignmentType, $t.type, $i.identifier, default_value, isLazy); $parameter.setCommentLocation(commentLocation); $parameter.setLocation(getLocation( $start, getStopToken())); lexer.clearLastCommentLocation(); @@ -5387,19 +5387,19 @@ pr_FormalTimerPar returns[FormalParameter parameter = null] }; pr_FormalTemplatePar returns[FormalParameter parameter = null] - locals [ Assignment_type assignment_type ] + locals [ Assignment_type assignmentType ] @init { - $assignment_type = Assignment_type.A_PAR_TEMP_IN; - TemplateRestriction.Restriction_type template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + $assignmentType = Assignment_type.A_PAR_TEMP_IN; + TemplateRestriction.Restriction_type templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; boolean isLazy = false; TemplateInstance default_value = null; }: -( ( IN { $assignment_type = Assignment_type.A_PAR_TEMP_IN; } - | OUT { $assignment_type = Assignment_type.A_PAR_TEMP_OUT; } - | INOUT { $assignment_type = Assignment_type.A_PAR_TEMP_INOUT; } +( ( IN { $assignmentType = Assignment_type.A_PAR_TEMP_IN; } + | OUT { $assignmentType = Assignment_type.A_PAR_TEMP_OUT; } + | INOUT { $assignmentType = Assignment_type.A_PAR_TEMP_INOUT; } )? - tr = pr_TemplateOptRestricted { template_restriction = $tr.template_restriction; } - ( { $assignment_type == Assignment_type.A_PAR_TEMP_IN }? TITANSPECIFICLAZY { isLazy = true; } )? + tr = pr_TemplateOptRestricted { templateRestriction = $tr.templateRestriction; } + ( { $assignmentType == Assignment_type.A_PAR_TEMP_IN }? TITANSPECIFICLAZY { isLazy = true; } )? t = pr_Type i = pr_Identifier ( pr_AssignmentChar @@ -5415,27 +5415,27 @@ pr_FormalTemplatePar returns[FormalParameter parameter = null] )? ) { - $parameter = new FormalParameter(template_restriction, $assignment_type, $t.type, $i.identifier, default_value, isLazy); + $parameter = new FormalParameter(templateRestriction, $assignmentType, $t.type, $i.identifier, default_value, isLazy); $parameter.setLocation(getLocation( $start, getStopToken())); }; -pr_TemplateOptRestricted returns[TemplateRestriction.Restriction_type template_restriction] +pr_TemplateOptRestricted returns[TemplateRestriction.Restriction_type templateRestriction] @init { - $template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + $templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; }: ( pr_TemplateKeyword - ( t = pr_TemplateRestriction { $template_restriction = $t.template_restriction; } )? -| OMIT { $template_restriction = TemplateRestriction.Restriction_type.TR_OMIT; } + ( t = pr_TemplateRestriction { $templateRestriction = $t.templateRestriction; } )? +| OMIT { $templateRestriction = TemplateRestriction.Restriction_type.TR_OMIT; } ); -pr_TemplateRestriction returns[TemplateRestriction.Restriction_type template_restriction] +pr_TemplateRestriction returns[TemplateRestriction.Restriction_type templateRestriction] @init { - $template_restriction = TemplateRestriction.Restriction_type.TR_NONE; + $templateRestriction = TemplateRestriction.Restriction_type.TR_NONE; }: ( pr_LParen - ( OMIT { $template_restriction = TemplateRestriction.Restriction_type.TR_OMIT; } - | VALUE { $template_restriction = TemplateRestriction.Restriction_type.TR_VALUE; } - | PRESENT { $template_restriction = TemplateRestriction.Restriction_type.TR_PRESENT; } + ( OMIT { $templateRestriction = TemplateRestriction.Restriction_type.TR_OMIT; } + | VALUE { $templateRestriction = TemplateRestriction.Restriction_type.TR_VALUE; } + | PRESENT { $templateRestriction = TemplateRestriction.Restriction_type.TR_PRESENT; } ) pr_RParen ); @@ -5976,7 +5976,7 @@ pr_BasicStatements returns[Statement statement = null] | s3 = pr_String2TtcnStatement { $statement = $s3.statement; } | s4 = pr_Int2EnumStatement { $statement = $s4.statement; } | s5 = pr_LoopConstruct { $statement = $s5.statement; } -| s6 = pr_ConditionalConstruct { $statement = $s6.if_statement; } +| s6 = pr_ConditionalConstruct { $statement = $s6.ifStatement; } | s7 = pr_SelectCaseConstruct { $statement = $s7.statement; } | ( ( TITANSPECIFICTRY { exc_handling = StatementBlock.ExceptionHandling_type.EH_TRY; } | TITANSPECIFICCATCH @@ -6793,10 +6793,10 @@ pr_DoWhileStatement returns[Statement dowhile_statement = null ]: $dowhile_statement.setLocation(getLocation( $col, $endcol.stop)); }; -pr_ConditionalConstruct returns[If_Statement if_statement = null] +pr_ConditionalConstruct returns[If_Statement ifStatement = null] @init { - If_Clauses if_clauses = new If_Clauses(); - If_Clause if_clause = null; + If_Clauses ifClauses = new If_Clauses(); + If_Clause ifClause = null; StatementBlock statementblock2 = null; }: ( IF @@ -6804,18 +6804,18 @@ pr_ConditionalConstruct returns[If_Statement if_statement = null] v = pr_BooleanExpression pr_RParen sb = pr_StatementBlock - ( ei = pr_ElseIfClause { if($ei.if_clause != null) { if_clauses.addIfClause($ei.if_clause); }} )* + ( ei = pr_ElseIfClause { if($ei.ifClause != null) { ifClauses.addIfClause($ei.ifClause); }} )* ( e = pr_ElseClause { statementblock2 = $e.statementblock; } )? ) { - If_Clause first_if_clause = new If_Clause($v.value, $sb.statementblock); - first_if_clause.setLocation( getLocation( $start, $sb.stop) ); - if_clauses.addFrontIfClause(first_if_clause); - $if_statement = new If_Statement(if_clauses, statementblock2); - $if_statement.setLocation(getLocation( $start, getStopToken())); + If_Clause firstIfClause = new If_Clause($v.value, $sb.statementblock); + firstIfClause.setLocation( getLocation( $start, $sb.stop) ); + ifClauses.addFrontIfClause(firstIfClause); + $ifStatement = new If_Statement(ifClauses, statementblock2); + $ifStatement.setLocation(getLocation( $start, getStopToken())); }; -pr_ElseIfClause returns[If_Clause if_clause = null]: +pr_ElseIfClause returns[If_Clause ifClause = null]: ( col = ELSE IF pr_LParen @@ -6824,8 +6824,8 @@ pr_ElseIfClause returns[If_Clause if_clause = null]: sb = pr_StatementBlock ) { - $if_clause = new If_Clause($v.value, $sb.statementblock); - $if_clause.setLocation( getLocation( $col, $sb.stop) ); + $ifClause = new If_Clause($v.value, $sb.statementblock); + $ifClause.setLocation( getLocation( $col, $sb.stop) ); }; pr_ElseClause returns[StatementBlock statementblock = null]: diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstantValues.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstantValues.java index 4fdffd550b..fe38a5fd53 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstantValues.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstantValues.java @@ -39,6 +39,10 @@ public final class PreferenceConstantValues { public static final String COMPILEROPTIONSTAY = "Stay unchanged"; public static final String COMPILEROPTIONOUTDATE = "Become outdated"; public static final String COMPILEROPTIONREMOVE = "Are removed"; + + // options for selecting the broken parts to analyze + public static final String MODULESELECTIONORIGINAL = "Original"; + public static final String BROKENPARTSVIAREFERENCES = "Broken parts via references"; // options for the designer on how compiler and designer markers interact public static final String ONTHEFLYOPTIONSTAY = "Stay"; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstants.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstants.java index 94e5cef995..7d0058c59d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstants.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceConstants.java @@ -21,8 +21,9 @@ public final class PreferenceConstants { public static final String REPORTPROGRAMERRORWITHMARKER = ProductConstants.PRODUCT_ID_DESIGNER + ".reportProgramErrorWithMarker"; public static final String TREATONTHEFLYERRORSFATALFORBUILD = ProductConstants.PRODUCT_ID_DESIGNER + ".treatOnTheFlyErrorsasFatalForBuild"; public static final String USEONTHEFLYPARSING = ProductConstants.PRODUCT_ID_DESIGNER + ".useOnTheFlyParsing"; - public static final String ENABLERISKYREFACTORING = ProductConstants.PRODUCT_ID_DESIGNER + ".enableRiskyRefectoring"; public static final String USEINCREMENTALPARSING = ProductConstants.PRODUCT_ID_DESIGNER + ".useIncrementalParsing"; + public static final String MODULESELECTIONALGORITHM = ProductConstants.PRODUCT_ID_DESIGNER + ".semanticCheckingAlgorithm"; + public static final String BROKENMODULESRATIO = ProductConstants.PRODUCT_ID_DESIGNER + ".brokenModulesRatio"; public static final String DELAYSEMANTICCHECKINGTILLSAVE = ProductConstants.PRODUCT_ID_DESIGNER + ".delaySemantiCheckingTillSave"; public static final String MINIMISEMEMORYUSAGE = ProductConstants.PRODUCT_ID_DESIGNER + ".minimiseMemoryUsage"; public static final String RECONCILERTIMEOUT = ProductConstants.PRODUCT_ID_DESIGNER + ".reconcilerTimeout"; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceInitializer.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceInitializer.java index 2b88a82dd6..3171a2d4a9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceInitializer.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/PreferenceInitializer.java @@ -40,11 +40,12 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { preferenceStore.setDefault(PreferenceConstants.REPORTPROGRAMERRORWITHMARKER, false); preferenceStore.setDefault(PreferenceConstants.TREATONTHEFLYERRORSFATALFORBUILD, false); preferenceStore.setDefault(PreferenceConstants.USEONTHEFLYPARSING, true); - preferenceStore.setDefault(PreferenceConstants.ENABLERISKYREFACTORING, false); preferenceStore.setDefault(PreferenceConstants.USEINCREMENTALPARSING, false); + preferenceStore.setDefault(PreferenceConstants.MODULESELECTIONALGORITHM, PreferenceConstantValues.BROKENPARTSVIAREFERENCES); preferenceStore.setDefault(PreferenceConstants.DELAYSEMANTICCHECKINGTILLSAVE, true); preferenceStore.setDefault(PreferenceConstants.MINIMISEMEMORYUSAGE, false); preferenceStore.setDefault(PreferenceConstants.RECONCILERTIMEOUT, 1); + preferenceStore.setDefault(PreferenceConstants.BROKENMODULESRATIO, 20); preferenceStore.setDefault(PreferenceConstants.PROCESSINGUNITSTOUSE, PreferenceConstantValues.AVAILABLEPROCESSORS); preferenceStore.setDefault(PreferenceConstants.CONSOLE_ACTION_BEFORE_BUILD, PreferenceConstantValues.BEFORE_BUILD_PRINT_CONSOLE_DELIMITERS); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ErrorsWarningsPreferencePage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ErrorsWarningsPreferencePage.java index 601191add7..74b5303fe1 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ErrorsWarningsPreferencePage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ErrorsWarningsPreferencePage.java @@ -23,7 +23,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.designer.Activator; import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.parsers.GlobalParser; @@ -43,11 +42,11 @@ public final class ErrorsWarningsPreferencePage extends FieldEditorPreferencePag private static final String REPORTUNSUPPORTEDCONSTRUCTS = "Language constructs not supported yet:"; private static final String REPORTUNSUPPORTEDCONSTRUCTS_TOOLTIP = "For example pattern subtyping in TTCN-3."; private static final String REPORTMISSINGIMPORTATION = "Missing imported module:"; - private static final String REPORTMISSINGIMPORTATION_TOOLTIP = "When a module refered to in an import statement could not be found."; + private static final String REPORTMISSINGIMPORTATION_TOOLTIP = "When a module referred to in an import statement could not be found."; private static final String REPORTUNUSEDMODULEIMPORTATION = "Report unused module importation:"; private static final String REPORTUNUSEDMODULEIMPORTATION_TOOLTIP = "When nothing is used in the module from the imported module."; private static final String REPORTMISSINGFRIEND = "Report friend declarations with missing modules:"; - private static final String REPORTMISSINGFRIEND_TOOLTIP = "When the module refered to in a friend declaration doulc not be found.."; + private static final String REPORTMISSINGFRIEND_TOOLTIP = "When the module referred to in a friend declaration doulc not be found.."; private static final String REPORTUNUSEDGLOBALDEFINITION = "Report unused module level definition:"; private static final String REPORTUNUSEDGLOBALDEFINITIONTOOLTIP = "When a module level definition is never read/written.\n" + " Also when a type is not used to declare other definitions."; @@ -568,7 +567,7 @@ public final class ErrorsWarningsPreferencePage extends FieldEditorPreferencePag Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), "Error/Warning settings changed", + MessageDialog.openWarning(null, "Error/Warning settings changed", "Error/Warning settings have changed, the known projects have to be re-analyzed completly.\nThis might take some time."); } }); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ExcludedResourcesPreferencePage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ExcludedResourcesPreferencePage.java index 5a2a0727e6..46122612e3 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ExcludedResourcesPreferencePage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/ExcludedResourcesPreferencePage.java @@ -17,7 +17,6 @@ import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.Activator; import org.eclipse.titan.designer.decorators.TITANDecorator; @@ -92,7 +91,7 @@ public class ExcludedResourcesPreferencePage extends FieldEditorPreferencePage i Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), "Resource exclusion settings changed", + MessageDialog.openWarning(null, "Resource exclusion settings changed", "Resource exclusion settings have changed, the known projects have to be re-analyzed completly.\nThis might take some time."); } }); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/OnTheFlyCheckerPreferencePage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/OnTheFlyCheckerPreferencePage.java index f1f699f500..a423e09cbe 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/OnTheFlyCheckerPreferencePage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/preferences/pages/OnTheFlyCheckerPreferencePage.java @@ -15,9 +15,11 @@ import org.eclipse.jface.preference.IntegerFieldEditor; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.Activator; import org.eclipse.titan.designer.parsers.GlobalParser; +import org.eclipse.titan.designer.preferences.PreferenceConstantValues; import org.eclipse.titan.designer.preferences.PreferenceConstants; import org.eclipse.titan.designer.productUtilities.ProductConstants; import org.eclipse.ui.IWorkbench; @@ -30,18 +32,24 @@ public final class OnTheFlyCheckerPreferencePage extends FieldEditorPreferencePa private static final String DESCRIPTION = "Preferences of the on-the-fly checker"; private static final String ENABLE_PARSING = "Enable parsing of TTCN-3, ASN.1 and Runtime Configuration files"; - private static final String ENABLE_RISKY_REFACTORING = "Enable refactoring of projects containing errors and/or .ttcnpp files"; private static final String ENABLE_INCREMENTAL_PARSING = "Enable the incremental parsing of TTCN-3 files"; private static final String MINIMISE_MEMORY_USAGE = "Minimise memory usage"; private static final String DELAY_SEMANTIC_CHECKING = "Delay the on-the-fly semantic check till the file is saved"; private static final String RECONCILER_TIMEOUT = "Timeout in seconds before on-the-fly check starts"; + private static final String BROKEN_MODULES_RATIO = "Limit of broken modules during selection (%)"; + private static final String[][] ALGORITHM_OPTIONS = new String[][] { + { PreferenceConstantValues.MODULESELECTIONORIGINAL, PreferenceConstantValues.MODULESELECTIONORIGINAL }, + { PreferenceConstantValues.BROKENPARTSVIAREFERENCES, PreferenceConstantValues.BROKENPARTSVIAREFERENCES }}; + + private Composite composite; private BooleanFieldEditor useOnTheFlyParsing; - private BooleanFieldEditor enableRiskyRefactoring; private BooleanFieldEditor useIncrementalParsing; + private ComboFieldEditor moduleSelectionAlgorithm; private BooleanFieldEditor minimiseMemoryUsage; private BooleanFieldEditor delaySemanticCheckTillSave; private IntegerFieldEditor reconcilerTimeout; + private IntegerFieldEditor brokenModulesLimit; private boolean minimiseMemoryChanged = false; @@ -56,24 +64,34 @@ public final class OnTheFlyCheckerPreferencePage extends FieldEditorPreferencePa useOnTheFlyParsing = new BooleanFieldEditor(PreferenceConstants.USEONTHEFLYPARSING, ENABLE_PARSING, tempParent); addField(useOnTheFlyParsing); - enableRiskyRefactoring = new BooleanFieldEditor(PreferenceConstants.ENABLERISKYREFACTORING, ENABLE_RISKY_REFACTORING, tempParent); - addField(enableRiskyRefactoring); - useIncrementalParsing = new BooleanFieldEditor(PreferenceConstants.USEINCREMENTALPARSING, ENABLE_INCREMENTAL_PARSING, tempParent); addField(useIncrementalParsing); - + + moduleSelectionAlgorithm = new ComboFieldEditor(PreferenceConstants.MODULESELECTIONALGORITHM, "Selection method", ALGORITHM_OPTIONS, tempParent); + Label text = moduleSelectionAlgorithm.getLabelControl(tempParent); + text.setToolTipText("Broken parts selection algorithm."); + addField(moduleSelectionAlgorithm); + + composite = new Composite(tempParent, SWT.NONE); + + brokenModulesLimit = new IntegerFieldEditor(PreferenceConstants.BROKENMODULESRATIO, BROKEN_MODULES_RATIO, composite); + brokenModulesLimit.setValidRange(1, 100); + brokenModulesLimit.setTextLimit(3); + brokenModulesLimit.getLabelControl(composite).setToolTipText("Under of this ratio, running selection on definition level otherwise module level."); + + String actualAlgorithm = doGetPreferenceStore().getString(PreferenceConstants.MODULESELECTIONALGORITHM); + brokenModulesLimit.setEnabled(useModuleLimit(actualAlgorithm), composite); + addField(brokenModulesLimit); + minimiseMemoryUsage = new BooleanFieldEditor(PreferenceConstants.MINIMISEMEMORYUSAGE, MINIMISE_MEMORY_USAGE, tempParent); - addField(minimiseMemoryUsage); - - Composite composite = new Composite(tempParent, SWT.NONE); + addField(minimiseMemoryUsage); reconcilerTimeout = new IntegerFieldEditor(PreferenceConstants.RECONCILERTIMEOUT, RECONCILER_TIMEOUT, composite); reconcilerTimeout.setValidRange(0, 10); reconcilerTimeout.setTextLimit(2); addField(reconcilerTimeout); - delaySemanticCheckTillSave = new BooleanFieldEditor(PreferenceConstants.DELAYSEMANTICCHECKINGTILLSAVE, DELAY_SEMANTIC_CHECKING, - tempParent); + delaySemanticCheckTillSave = new BooleanFieldEditor(PreferenceConstants.DELAYSEMANTICCHECKINGTILLSAVE, DELAY_SEMANTIC_CHECKING, tempParent); addField(delaySemanticCheckTillSave); } @@ -88,8 +106,24 @@ public final class OnTheFlyCheckerPreferencePage extends FieldEditorPreferencePa "Minimise memory usage is on, this could indicate that in some cases rename refactoring function will not operate properly!"); } } + + if(event.getSource().equals(moduleSelectionAlgorithm)) { + String newValue = event.getNewValue().toString(); + if(!newValue.equals(event.getOldValue())) { + if(!brokenModulesLimit.isValid()){ + brokenModulesLimit.loadDefault(); + ErrorReporter.parallelWarningDisplayInMessageDialog("On-the-fly analyzer", "Incorrect limit of broken modules restored to default value."); + } + brokenModulesLimit.setEnabled(useModuleLimit(newValue), composite); + } + } + super.propertyChange(event); } + + private boolean useModuleLimit(String value){ + return value.equals(PreferenceConstantValues.BROKENPARTSVIAREFERENCES); + } @Override public void init(final IWorkbench workbench) { @@ -108,12 +142,13 @@ public final class OnTheFlyCheckerPreferencePage extends FieldEditorPreferencePa minimiseMemoryUsage.dispose(); delaySemanticCheckTillSave.dispose(); reconcilerTimeout.dispose(); + brokenModulesLimit.dispose(); + composite.dispose(); super.dispose(); } private boolean isImportantChanged() { - return getPreferenceStore().getBoolean(PreferenceConstants.USEINCREMENTALPARSING) != useIncrementalParsing.getBooleanValue() - || getPreferenceStore().getBoolean(PreferenceConstants.MINIMISEMEMORYUSAGE) != minimiseMemoryUsage.getBooleanValue(); + return getPreferenceStore().getBoolean(PreferenceConstants.MINIMISEMEMORYUSAGE) != minimiseMemoryUsage.getBooleanValue(); } @Override @@ -139,5 +174,5 @@ public final class OnTheFlyCheckerPreferencePage extends FieldEditorPreferencePa super.performApply(); - } + } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/BaseNamingConventionPropertyData.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/BaseNamingConventionPropertyData.java index 42ccc7303f..5d54f31dab 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/BaseNamingConventionPropertyData.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/BaseNamingConventionPropertyData.java @@ -62,7 +62,7 @@ public final class BaseNamingConventionPropertyData { * the property list to use * @param tags * the TAGS to use - * @param default_values + * @param defaultValues * the default values to use * */ public static void loadProperties(final Node root, final IResource resource, final String qualifier, final String[] properties, @@ -105,12 +105,6 @@ public final class BaseNamingConventionPropertyData { * the document used for creating the tree nodes * @param resource * the resource to work on - * @param properties - * the property list to use - * @param tags - * the TAGS to use - * @param default_values - * the default values to use * @param qualifier * the qualifier to access the properties * @param properties @@ -196,10 +190,6 @@ public final class BaseNamingConventionPropertyData { * @param saveDefaultValues * whether the default values should be forced to be * added to the output. - * @param tags - * the list of TAGS to use. - * @param default_values - * the list of default values to use. * @param xmlNode * the XML node under which the new nodes should get * @param properties diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/TITANFlagsOptionsData.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/TITANFlagsOptionsData.java index ed066666f4..cc35d87143 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/TITANFlagsOptionsData.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/data/TITANFlagsOptionsData.java @@ -44,16 +44,19 @@ public final class TITANFlagsOptionsData { public static final String QUIETLY_PROPERTY = "quietly"; public static final String DISABLE_SUBTYPE_CHECKING_PROPERTY = "disableSubtypeChecking"; public static final String ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY = "omitInValueList"; + public static final String WARNINGS_FOR_BAD_VARIANTS_PROPERTY = "warningsForBadVariants"; public static final String[] PROPERTIES = { DISABLE_BER_PROPERTY, DISABLE_RAW_PROPERTY, DISABLE_TEXT_PROPERTY, DISABLE_XER_PROPERTY, DISABLE_JSON_PROPERTY, FORCE_XER_IN_ASN1_PROPERTY, DEFAULT_AS_OMIT_PROPERTY, FORCE_OLD_FUNC_OUT_PAR_PROPERTY, GCC_MESSAGE_FORMAT_PROPERTY, LINE_NUMBERS_ONLY_IN_MESSAGES_PROPERTY, - INCLUDE_SOURCEINFO_PROPERTY, ADD_SOURCELINEINFO_PROPERTY, SUPPRESS_WARNINGS_PROPERTY, QUIETLY_PROPERTY, DISABLE_SUBTYPE_CHECKING_PROPERTY,ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY }; + INCLUDE_SOURCEINFO_PROPERTY, ADD_SOURCELINEINFO_PROPERTY, SUPPRESS_WARNINGS_PROPERTY, ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY, WARNINGS_FOR_BAD_VARIANTS_PROPERTY, + QUIETLY_PROPERTY, DISABLE_SUBTYPE_CHECKING_PROPERTY }; public static final String[] TAGS = PROPERTIES; public static final String[] DEFAULT_VALUES = { "false", "false", "false", "false", "false", "false", "false", "false", "false", "false", - "true", "true", "false", "false", "false", "false" }; + "true", "true", "false", "false", "false", + "false", "false" }; private TITANFlagsOptionsData() { // Do nothing @@ -129,6 +132,10 @@ public final class TITANFlagsOptionsData { temp = project.getPersistentProperty(new QualifiedName(ProjectBuildPropertyData.QUALIFIER, TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY)); builder.append("true".equals(temp) ? "M" : ""); + + temp = project.getPersistentProperty(new QualifiedName(ProjectBuildPropertyData.QUALIFIER, + TITANFlagsOptionsData.WARNINGS_FOR_BAD_VARIANTS_PROPERTY)); + builder.append("true".equals(temp) ? "E" : ""); if (builder.length() > 0) { builder.insert(0, '-'); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ConfigurationManagerControl.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ConfigurationManagerControl.java index 42c25d4f23..3748951cd9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ConfigurationManagerControl.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ConfigurationManagerControl.java @@ -44,7 +44,6 @@ import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; @@ -420,7 +419,7 @@ public class ConfigurationManagerControl { manageButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent evt) { - ConfigurationListDialog dialog = new ConfigurationListDialog(new Shell(Display.getDefault())); + ConfigurationListDialog dialog = new ConfigurationListDialog(null); if (dialog.open() == Window.OK) { loadConfigurations(); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/FolderNamingConventionPropertyPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/FolderNamingConventionPropertyPage.java index f33a915590..6cc1c9b9b9 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/FolderNamingConventionPropertyPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/FolderNamingConventionPropertyPage.java @@ -20,7 +20,6 @@ import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.NamingConventionHelper; import org.eclipse.titan.designer.preferences.PreferenceConstants; @@ -151,7 +150,7 @@ public class FolderNamingConventionPropertyPage extends BaseNamingConventionProp Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), "Naming convention settings changed", + MessageDialog.openWarning(null, "Naming convention settings changed", "Naming convention settings have changed, the known projects have to be re-analyzed completly.\nThis might take some time."); } }); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectBuildPropertyPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectBuildPropertyPage.java index 5619b5155a..622ac011ab 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectBuildPropertyPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectBuildPropertyPage.java @@ -319,13 +319,13 @@ public final class ProjectBuildPropertyPage extends PropertyPage { internalMakefileCreationTab.setMakefileGenerationEnabled(generateInternalMakefileButton.getSelection()); makeAttributesTab.setMakefileGenerationEnabled(true); generateInternalMakefileButton.setEnabled(true); - updateSymlinkLessbuild(true); + updateSymlinkLessbuild(generateInternalMakefileButton.getSelection()); } else { makefileCreationTab.setMakefileGenerationEnabled(false); internalMakefileCreationTab.setMakefileGenerationEnabled(false); makeAttributesTab.setMakefileGenerationEnabled(false); generateInternalMakefileButton.setEnabled(false); - updateSymlinkLessbuild(false); + updateSymlinkLessbuild(generateInternalMakefileButton.getSelection()); } } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectConfigurationsPropertyPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectConfigurationsPropertyPage.java index e2ac0c7af6..9032e3f44d 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectConfigurationsPropertyPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectConfigurationsPropertyPage.java @@ -52,7 +52,6 @@ import org.eclipse.titan.designer.properties.data.ProjectDocumentHandlingUtility import org.eclipse.titan.designer.properties.data.ProjectFileHandler; import org.eclipse.titan.designer.properties.data.ProjectConfigurationsPropertyData.ConfigurationRequirement; import org.eclipse.titan.designer.wizards.projectFormat.TITANAutomaticProjectExporter; -import org.eclipse.titan.designer.wizards.projectFormat.TITANProjectExporter; import org.eclipse.ui.dialogs.PropertyPage; import org.w3c.dom.Document; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectNamingConventionPropertyPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectNamingConventionPropertyPage.java index a179962245..87366f52a2 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectNamingConventionPropertyPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/ProjectNamingConventionPropertyPage.java @@ -19,7 +19,6 @@ import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.AST.NamingConventionHelper; import org.eclipse.titan.designer.preferences.PreferenceConstants; @@ -147,7 +146,7 @@ public class ProjectNamingConventionPropertyPage extends BaseNamingConventionPro Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openWarning(new Shell(Display.getDefault()), "Naming convention settings changed", + MessageDialog.openWarning(null, "Naming convention settings changed", "Naming convention settings have changed, the known projects have to be re-analyzed completly.\nThis might take some time."); } }); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/TITANFlagsOptionsPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/TITANFlagsOptionsPage.java index 7570f31911..72e6bbcb9e 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/TITANFlagsOptionsPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/properties/pages/TITANFlagsOptionsPage.java @@ -43,6 +43,7 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { private Button suppressWarnings; private Button quietly; private Button omitInValueList; + private Button warningsForBadVariants; //private Composite namingRuleComposite; //private ComboFieldEditor namingRules; @@ -69,6 +70,7 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { suppressWarnings.dispose(); quietly.dispose(); omitInValueList.dispose(); + warningsForBadVariants.dispose(); } } @@ -129,7 +131,10 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { omitInValueList = new Button(mainComposite, SWT.CHECK); omitInValueList.setText("Allow 'omit' in template value lists (legacy behavior) (-M)"); - + + warningsForBadVariants = new Button(mainComposite, SWT.CHECK); + warningsForBadVariants.setText("Display warnings instead of errors for invalid variants (-E)"); + return mainComposite; } @@ -155,6 +160,7 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { suppressWarnings.setEnabled(enabled); quietly.setEnabled(enabled); omitInValueList.setEnabled(enabled); + warningsForBadVariants.setEnabled(enabled); } @Override @@ -217,6 +223,7 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { suppressWarnings.setSelection(false); quietly.setSelection(false); omitInValueList.setSelection(false); + warningsForBadVariants.setSelection(false); } @Override @@ -303,6 +310,10 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { temp = project.getPersistentProperty(new QualifiedName(ProjectBuildPropertyData.QUALIFIER, TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY)); omitInValueList.setSelection("true".equals(temp) ? true : false); + + temp = project.getPersistentProperty(new QualifiedName(ProjectBuildPropertyData.QUALIFIER, + TITANFlagsOptionsData.WARNINGS_FOR_BAD_VARIANTS_PROPERTY)); + warningsForBadVariants.setSelection("true".equals(temp) ? true : false); } catch (CoreException e) { performDefaults(); @@ -330,6 +341,7 @@ public final class TITANFlagsOptionsPage implements IOptionsPage { setProperty(project, TITANFlagsOptionsData.SUPPRESS_WARNINGS_PROPERTY, suppressWarnings.getSelection() ? "true" : "false"); setProperty(project, TITANFlagsOptionsData.QUIETLY_PROPERTY, quietly.getSelection() ? "true" : "false"); setProperty(project, TITANFlagsOptionsData.ALLOW_OMIT_IN_VALUELIST_TEMPLATE_PROPERTY , omitInValueList.getSelection() ? "true" : "false"); + setProperty(project, TITANFlagsOptionsData.WARNINGS_FOR_BAD_VARIANTS_PROPERTY, warningsForBadVariants.getSelection() ? "true" : "false"); } catch (CoreException e) { ErrorReporter.logExceptionStackTrace(e); return false; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/refactoring/RenameRefactoring.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/refactoring/RenameRefactoring.java index cd35630570..cd4b9e0fa6 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/refactoring/RenameRefactoring.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/refactoring/RenameRefactoring.java @@ -23,7 +23,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ltk.core.refactoring.Change; @@ -32,8 +31,6 @@ import org.eclipse.ltk.core.refactoring.Refactoring; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.titan.common.logging.ErrorReporter; @@ -42,10 +39,12 @@ import org.eclipse.titan.designer.AST.Assignment; import org.eclipse.titan.designer.AST.FieldSubReference; import org.eclipse.titan.designer.AST.ISubReference; import org.eclipse.titan.designer.AST.Identifier; +import org.eclipse.titan.designer.AST.Identifier.Identifier_type; import org.eclipse.titan.designer.AST.Module; import org.eclipse.titan.designer.AST.NamedBridgeScope; import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.ReferenceFinder; +import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.Scope; import org.eclipse.titan.designer.AST.SubScopeVisitor; import org.eclipse.titan.designer.AST.ASN1.definitions.ASN1Module; @@ -53,8 +52,6 @@ import org.eclipse.titan.designer.AST.ASN1.types.ASN1_Choice_Type; import org.eclipse.titan.designer.AST.ASN1.types.ASN1_Enumerated_Type; import org.eclipse.titan.designer.AST.ASN1.types.ASN1_Sequence_Type; import org.eclipse.titan.designer.AST.ASN1.types.ASN1_Set_Type; -import org.eclipse.titan.designer.AST.Identifier.Identifier_type; -import org.eclipse.titan.designer.AST.ReferenceFinder.Hit; import org.eclipse.titan.designer.AST.TTCN3.types.TTCN3_Enumerated_Type; import org.eclipse.titan.designer.AST.TTCN3.types.TTCN3_Set_Seq_Choice_BaseType; import org.eclipse.titan.designer.commonFilters.ResourceExclusionHelper; @@ -71,6 +68,7 @@ import org.eclipse.titan.designer.productUtilities.ProductConstants; import org.eclipse.ui.IEditorPart; /** + * FIXME component variables are not handled correctly * @author Adam Delic * */ public class RenameRefactoring extends Refactoring { @@ -78,18 +76,17 @@ public class RenameRefactoring extends Refactoring { public static final String NORECOGNISABLEMODULENAME = "The name of the module in the file `{0}'' could not be identified"; public static final String EXCLUDEDFROMBUILD = "The name of the module in the file `{0}'' could not be identified, the file is excluded from build"; public static final String NOTFOUNDMODULE = "The module `{0}'' could not be found"; - public static final String PROJECTCONTAINSERRORS = "The project contains errors, please fix the errors before refactoring"; - public static final String PROJECTCONTAINSTTCNPPFILES = "The project contains .ttcnpp files"; + public static final String PROJECTCONTAINSERRORS = "The project `{0}'' contains errors, which might corrupt the result of the refactoring"; + public static final String PROJECTCONTAINSTTCNPPFILES = "The project `{0}'' contains .ttcnpp files, which might corrupt the result of the refactoring"; public static final String FIELDALREADYEXISTS = "Field with name `{0}'' already exists in type `{1}''"; public static final String DEFINITIONALREADYEXISTS = "Name conflict:" + " definition with name `{0}'' already exists in the scope of the selected definition or in one of its parent scopes"; public static final String DEFINITIONALREADYEXISTS2 = "Name conflict:" + " definition with name `{0}'' already exists in module `{1}'' at line {2}"; - private static final String MINIMISEWARNING = "Minimise memory usage is on, it can cause unexpected behaviour in the refactoring process!\n" - + "This function is not supported with the memory minimise option, " - + "we do not take any responsibility for it.\n" - + "Would you like to continue anyway?"; + private static final String MINIMISEWARNING = "Minimise memory usage is enabled, which can cause unexpected behaviour in the refactoring process!\n" + + "Refactoring is not supported with the memory minimise option turned on, " + + "we do not take any responsibility for it."; final IFile file; final Module module; @@ -131,33 +128,35 @@ public class RenameRefactoring extends Refactoring { // TITANDebugConsole.getConsole().newMessageStream().println(v.getScopeTreeAsHTMLPage()); RefactoringStatus result = new RefactoringStatus(); - final boolean enableRiskyRefactoring = Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.ENABLERISKYREFACTORING, false, null); - if (!enableRiskyRefactoring) { - try { - pm.beginTask("Checking preconditions...", 2); - // check that there are no ttcnpp files in the - // project - if (hasTtcnppFiles(file.getProject())) { - result.addError(PROJECTCONTAINSTTCNPPFILES); - } - pm.worked(1); - // check that there are no error markers in the - // project - IMarker[] markers = file.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE); - for (IMarker marker : markers) { - if (IMarker.SEVERITY_ERROR == marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)) { - result.addError(PROJECTCONTAINSERRORS); - break; - } + try { + pm.beginTask("Checking preconditions...", 3); + // check that there are no ttcnpp files in the + // project + if (hasTtcnppFiles(file.getProject())) {//FIXME actually all referencing and referenced projects need to be checked too ! + result.addError(MessageFormat.format(PROJECTCONTAINSTTCNPPFILES, file.getProject())); + } + pm.worked(1); + // check that there are no error markers in the + // project + IMarker[] markers = file.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE); + for (IMarker marker : markers) { + if (IMarker.SEVERITY_ERROR == marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)) { + result.addError(MessageFormat.format(PROJECTCONTAINSERRORS, file.getProject())); + break; } - pm.worked(1); - } catch (CoreException e) { - ErrorReporter.logExceptionStackTrace(e); - result.addFatalError(e.getMessage()); - } finally { - pm.done(); } + pm.worked(1); + + final IPreferencesService prefs = Platform.getPreferencesService(); + if (prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.MINIMISEMEMORYUSAGE, false, null)) { + result.addError(MINIMISEWARNING); + } + pm.worked(1); + } catch (CoreException e) { + ErrorReporter.logExceptionStackTrace(e); + result.addFatalError(e.getMessage()); + } finally { + pm.done(); } return result; } @@ -172,12 +171,13 @@ public class RenameRefactoring extends Refactoring { idsMap = rf.findAllReferences(module, projectSourceParser, pm, reportDebugInformation); // add the referred identifier to the map of found identifiers Identifier refdIdentifier = rf.getReferredIdentifier(); - if (idsMap.containsKey(module)) { - idsMap.get(module).add(new Hit(refdIdentifier)); + Module refdModule = rf.assignment.getMyScope().getModuleScope(); + if (idsMap.containsKey(refdModule)) { + idsMap.get(refdModule).add(new Hit(refdIdentifier)); } else { ArrayList<Hit> identifierList = new ArrayList<Hit>(); identifierList.add(new Hit(refdIdentifier)); - idsMap.put(module, identifierList); + idsMap.put(refdModule, identifierList); } // check if there are name collisions in any of the affected @@ -333,21 +333,6 @@ public class RenameRefactoring extends Refactoring { return; } - final boolean[] memoryUsageAnswer = new boolean[] { false }; - - if (Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.MINIMISEMEMORYUSAGE, false, - null)) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - memoryUsageAnswer[0] = MessageDialog.openQuestion(new Shell(Display.getDefault()), "Warning", MINIMISEWARNING); - } - }); - if (!memoryUsageAnswer[0]) { - return; - } - } - final IPreferencesService prefs = Platform.getPreferencesService(); final boolean reportDebugInformation = prefs.getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.DISPLAYDEBUGINFORMATION, true, null); @@ -413,6 +398,7 @@ public class RenameRefactoring extends Refactoring { } catch (InterruptedException irex) { // operation was canceled } finally { + //TODO no longer needed after analyzer is updated projectSourceParser.reportOutdating(file); projectSourceParser.analyzeAll(); } @@ -431,6 +417,7 @@ public class RenameRefactoring extends Refactoring { protected static ReferenceFinder findOccurrencesLocationBased(final Module module, final int offset) { final IdentifierFinderVisitor visitor = new IdentifierFinderVisitor(offset); module.accept(visitor); + //FIXME the thing to be refactored might be a field ... not a definition final Declaration def = visitor.getReferencedDeclaration(); if (def == null || !def.shouldMarkOccurrences()) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/GUIProjectImporter.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/GUIProjectImporter.java index 3633ac4975..71f6579ca8 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/GUIProjectImporter.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/GUIProjectImporter.java @@ -785,7 +785,7 @@ public final class GUIProjectImporter { File file = new File(path); if (!file.exists()) { - reportError("Could not load the group file `" + path + "' refered by `" + basePath + "' as `" + reportError("Could not load the group file `" + path + "' referred by `" + basePath + "' as `" + pathAttribute.getTextContent() + "'", headless); return; } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/NewTITANProjectWizard.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/NewTITANProjectWizard.java index 3561c16bc4..8b642f21eb 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/NewTITANProjectWizard.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/NewTITANProjectWizard.java @@ -28,16 +28,12 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.URIUtil; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; -import org.eclipse.titan.common.path.TITANPathUtilities; import org.eclipse.titan.designer.Activator; import org.eclipse.titan.designer.GeneralConstants; import org.eclipse.titan.designer.core.TITANNature; @@ -320,8 +316,7 @@ public final class NewTITANProjectWizard extends BasicNewResourceWizard implemen Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - Shell shell = new Shell(Display.getDefault()); - PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(shell, newProject, + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(null, newProject, GeneralConstants.PROJECT_PROPERTY_PAGE, null, null); if (dialog != null) { dialog.open(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportMainPage.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportMainPage.java index aef677e406..4937549801 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportMainPage.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportMainPage.java @@ -23,10 +23,8 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.path.PathConverter; @@ -128,7 +126,7 @@ public class TITANProjectImportMainPage extends WizardPage { protected void handleProjectFileModified() { projectFile = projectFileText.getText(); try { - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(true, false, new IRunnableWithProgress() { + new ProgressMonitorDialog(null).run(true, false, new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportWizard.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportWizard.java index 8aa862d710..0eb002ae20 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportWizard.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/TITANProjectImportWizard.java @@ -24,7 +24,6 @@ import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.Activator; import org.eclipse.titan.designer.GeneralConstants; @@ -216,8 +215,7 @@ public class TITANProjectImportWizard extends BasicNewResourceWizard implements Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - Shell shell = new Shell(Display.getDefault()); - PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(shell, newProject, + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(null, newProject, GeneralConstants.PROJECT_PROPERTY_PAGE, null, null); if (dialog != null) { dialog.open(); diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/NewTITANProjectImportWizard.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/NewTITANProjectImportWizard.java index 77514cfa03..ff1a1dbfc4 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/NewTITANProjectImportWizard.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/NewTITANProjectImportWizard.java @@ -17,8 +17,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.ui.IImportWizard; import org.eclipse.ui.IWorkbench; @@ -58,7 +56,7 @@ public class NewTITANProjectImportWizard extends BasicNewResourceWizard implemen public boolean performFinish() { final List<IProject> projectsCreated = new ArrayList<IProject>(); try { - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(true, false, new IRunnableWithProgress() { + new ProgressMonitorDialog(null).run(true, false, new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/TpdImporter.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/TpdImporter.java index b97f013c91..d0932d8fe0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/TpdImporter.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/wizards/projectFormat/TpdImporter.java @@ -300,8 +300,7 @@ public class TpdImporter { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - Shell shell = new Shell(Display.getDefault()); - PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(shell, project, + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(null, project, GeneralConstants.PROJECT_PROPERTY_PAGE, null, null); if (dialog != null) { dialog.open(); @@ -583,7 +582,7 @@ public class TpdImporter { + " the location information is missing or corrupted"); } } catch (CoreException e) { - ErrorReporter.logExceptionStackTrace("While creating folder `" + folder.getName() + "'", e); + //be silent, it can happen normally } } else { ErrorReporter.logWarning("Folder to be imported `" + folder.getName() + "' already exists in project `" + project.getName() @@ -787,9 +786,7 @@ public class TpdImporter { // Remove possible target configuration nodes in existence removeConfigurationNodes(targetDocument.getDocumentElement()); - - Node configurationsNode = ProjectFileHandler.getNodebyName(mainNodes, ProjectFormatConstants.CONFIGURATIONS_NODE); - NodeList configurationsNodeList = configurationsNode.getChildNodes(); + Node targetActiveConfiguration = targetDocument.createElement(ProjectFormatConstants.ACTIVE_CONFIGURATION_NODE); targetActiveConfiguration.appendChild(targetDocument.createTextNode(activeConfiguration)); @@ -798,6 +795,17 @@ public class TpdImporter { Node targetConfigurationsRoot = targetDocument.createElement(ProjectFormatConstants.CONFIGURATIONS_NODE); targetDocument.getDocumentElement().appendChild(targetConfigurationsRoot); + Node configurationsNode = ProjectFileHandler.getNodebyName(mainNodes, ProjectFormatConstants.CONFIGURATIONS_NODE); + if (configurationsNode == null) { + ProjectDocumentHandlingUtility.saveDocument(project); + ProjectBuildPropertyData.setProjectAlreadyExported(project, false); + ProjectFileHandler handler = new ProjectFileHandler(project); + handler.loadProjectSettingsFromDocument(targetDocument); + + return true; + } + + NodeList configurationsNodeList = configurationsNode.getChildNodes(); for (int i = 0, size = configurationsNodeList.getLength(); i < size; i++) { Node configurationNode = configurationsNodeList.item(i); if (configurationNode.getNodeType() != Node.ELEMENT_NODE) { @@ -1078,7 +1086,8 @@ public class TpdImporter { String unresolvedProjectLocationURI = locationNode.getTextContent(); URI absoluteURI = TITANPathUtilities.convertToAbsoluteURI(unresolvedProjectLocationURI, URIUtil.toURI(projectFileFolderPath)); - + + if (absoluteURI!=null && !"file".equals(absoluteURI.getScheme())) { final StringBuilder builder = new StringBuilder( "Loading of project information is only supported for local files right now. " + absoluteURI.toString() @@ -1175,7 +1184,7 @@ public class TpdImporter { createProject(description, newProjectHandle, monitor); } }; - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(true, true, op); + new ProgressMonitorDialog(null).run(true, true, op); } catch (InterruptedException e) { return; } catch (final InvocationTargetException e) { diff --git a/org.eclipse.titan.executor/META-INF/MANIFEST.MF b/org.eclipse.titan.executor/META-INF/MANIFEST.MF index 767f645e7e..0c47f8f168 100755 --- a/org.eclipse.titan.executor/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.executor/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Created-By: 23.6-b04 (Oracle Corporation) Bundle-ManifestVersion: 2 Bundle-Name: TITAN_Executor Plug-in Bundle-SymbolicName: org.eclipse.titan.executor;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titan.executor.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, @@ -14,7 +14,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.variables, org.eclipse.debug.ui, org.eclipse.core.expressions, - org.eclipse.titan.common;bundle-version="5.4.1" + org.eclipse.titan.common;bundle-version="5.4.3" Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true Bundle-Vendor: Eclipse Titan Project diff --git a/org.eclipse.titan.executor/plugin.xml b/org.eclipse.titan.executor/plugin.xml index dc4439ac32..e72b397495 100644 --- a/org.eclipse.titan.executor/plugin.xml +++ b/org.eclipse.titan.executor/plugin.xml @@ -1,333 +1,303 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?eclipse version="3.2"?> +<?eclipse version="4.4"?> <plugin> - <extension point="org.eclipse.core.expressions.propertyTesters"> - <propertyTester - class="org.eclipse.titan.executor.property.testers.CompilationModeProperty" - id="org.eclipse.titan.executor.property.testers.CompilationModeProperty" - namespace="org.eclipse.titan.executor.propertyTesters" - properties="SingleModeBuild, ParallelModeBuild" - type="org.eclipse.core.resources.IResource"> - </propertyTester> - </extension> - <extension - point="org.eclipse.debug.core.launchConfigurationTypes"> - <launchConfigurationType - name="TITAN Parallel launcher" - delegate="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" - modes="run" - id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate"> - </launchConfigurationType> - <launchConfigurationType - name="TITAN Single Mode launcher" - delegate="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" - modes="run" - id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate"> - </launchConfigurationType> - <launchConfigurationType - name="TITAN JNI launcher" - delegate="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" - modes="run" - id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate"> - </launchConfigurationType> - </extension> - <extension - point="org.eclipse.debug.ui.launchShortcuts"> - <shortcut - class="org.eclipse.titan.executor.executors.single.LaunchShortcut" - id="org.eclipse.titan.executor.executors.single.LaunchShortcut" - label="TITAN Single Mode launcher" - icon="icons/launch_single.gif" - description="Launch an execution in single mode" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"/> - <iterate> - <instanceof value="org.eclipse.core.resources.IProject"/> - <test - value="org.eclipse.titan.designer.core.TITANNature" - property="org.eclipse.core.resources.projectNature"/> - <test property="org.eclipse.titan.executor.propertyTesters.SingleModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" /> - </shortcut> - <shortcut - class="org.eclipse.titan.executor.executors.single.LaunchShortcutConfig" - description="Launch an execution in single mode" - icon="icons/launch_single.gif" - id="org.eclipse.titan.executor.executors.single.LaunchShortcutConfig" - label="TITAN Single Mode launcher" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"> - </count> - <iterate operator="and"> - <instanceof value="org.eclipse.core.resources.IFile"> - </instanceof> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"/> - <test property="org.eclipse.core.resources.extension" value="cfg"/> - <test property="org.eclipse.titan.executor.propertyTesters.SingleModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType - id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate"> - </configurationType> - </shortcut> - <shortcut - class="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcut" - id="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcut" - label="TITAN Parallel launcher" - icon="icons/launch_cli.gif" - description="Launch an execution in mctr_cli mode" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"/> - <iterate> - <instanceof value="org.eclipse.core.resources.IProject"/> - <test - value="org.eclipse.titan.designer.core.TITANNature" - property="org.eclipse.core.resources.projectNature"/> - <test property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" /> - </shortcut> - <shortcut - class="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcutConfig" - description="Launch an execution in mctr_cli mode" - icon="icons/launch_cli.gif" - id="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcutConfig" - label="TITAN Parallel launcher" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"> - </count> - <iterate operator="and"> - <instanceof value="org.eclipse.core.resources.IFile"> - </instanceof> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"/> - <test property="org.eclipse.core.resources.extension" value="cfg"/> - <test property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType - id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate"> - </configurationType> - </shortcut> - <shortcut - class="org.eclipse.titan.executor.executors.jni.LaunchShortcut" - id="org.eclipse.titan.executor.executors.jni.LaunchShortcut" - label="TITAN JNI launcher" - icon="icons/launch_jni.gif" - description="Launch an execution in jni mode" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"/> - <iterate> - <instanceof value="org.eclipse.core.resources.IProject"/> - <test - value="org.eclipse.titan.designer.core.TITANNature" - property="org.eclipse.core.resources.projectNature"/> - <test property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" /> - </shortcut> - <shortcut - class="org.eclipse.titan.executor.executors.jni.LaunchShortcutConfig" - description="Launch an execution in jni mode" - icon="icons/launch_jni.gif" - id="org.eclipse.titan.executor.executors.jni.LaunchShortcutConfig" - label="TITAN JNI launcher" - modes="run"> - <description - description="Runs a local TITAN application" - mode="run"> - </description> - <contextualLaunch> - <enablement> - <with variable="selection"> - <count value="1"> - </count> - <iterate operator="and"> - <instanceof value="org.eclipse.core.resources.IFile"> - </instanceof> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"/> - <test property="org.eclipse.core.resources.extension" value="cfg"/> - <test property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" forcePluginActivation="true"/> - </iterate> - </with> - </enablement> - </contextualLaunch> - <configurationType - id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate"> - </configurationType> - </shortcut> - </extension> - <extension - point="org.eclipse.debug.ui.launchConfigurationTypeImages"> - <launchConfigurationTypeImage - icon="icons/launch_cli.gif" - configTypeID="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" - id="org.eclipse.titan.executor.executors.mctr.cli.uniquetypeImage"> - </launchConfigurationTypeImage> - <launchConfigurationTypeImage - icon="icons/launch_single.gif" - configTypeID="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" - id="org.eclipse.titan.executor.executors.single.uniquetypeImage"> - </launchConfigurationTypeImage> - <launchConfigurationTypeImage - icon="icons/launch_jni.gif" - configTypeID="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" - id="org.eclipse.titan.executor.executors.jni.uniquetypeImage"> - </launchConfigurationTypeImage> - </extension> - <extension - point="org.eclipse.debug.ui.launchConfigurationTabGroups"> - <launchConfigurationTabGroup - type="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" - class="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationTabGroup" - id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationTabGroup"> - <launchMode - mode="run" - perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> - </launchMode> - </launchConfigurationTabGroup> - <launchConfigurationTabGroup - type="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" - class="org.eclipse.titan.executor.executors.single.LaunchConfigurationTabGroup" - id="org.eclipse.titan.executor.executors.single.LaunchConfigurationTabGroup"> - <launchMode - mode="run" - perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> - </launchMode> - </launchConfigurationTabGroup> - <launchConfigurationTabGroup - type="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" - class="org.eclipse.titan.executor.executors.jni.LaunchConfigurationTabGroup" - id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationTabGroup"> - <launchMode - mode="run" - perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> - </launchMode> - </launchConfigurationTabGroup> - </extension> - <extension - point="org.eclipse.ui.views"> - <category - id="TITAN Monitor Category" - name="TITAN Monitors"> - </category> - <view - id="org.eclipse.titan.executor.views.executorMonitor.ExecutorMonitorView" - name="TITAN Execution Controller" - category="TITAN Monitor Category" - class="org.eclipse.titan.executor.views.executormonitor.ExecutorMonitorView" - icon="icons/titan.gif"> - </view> - <view - id="org.eclipse.titan.executor.views.testExecution.TestExecutionView" - name="TITAN test results" - category="TITAN Monitor Category" - class="org.eclipse.titan.executor.views.testexecution.TestExecutionView" - icon="icons/titan.gif"> - </view> - <view - id="org.eclipse.titan.executor.views.notification.NotificationView" - name="TITAN notifications" - category="TITAN Monitor Category" - class="org.eclipse.titan.executor.views.notification.NotificationView" - icon="icons/titan.gif"> - </view> - </extension> - <extension - point="org.eclipse.ui.perspectives"> - <perspective - class="org.eclipse.titan.executor.perspectives.ExecutingPerspective" - icon="icons/titan.gif" - id="org.eclipse.titan.executor.perspectives.ExecutingPerspective" - name="TITAN Executing"/> - </extension> - <extension point="org.eclipse.help.toc"> - <toc file="toc.xml" primary="false"/> - </extension> - <extension point="org.eclipse.core.runtime.preferences"> - <initializer class="org.eclipse.titan.executor.preferences.PreferenceInitializer"/> - </extension> - <extension point="org.eclipse.ui.preferencePages"> - <page - id="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" - class="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" - name="TITAN Executor"/> - </extension> - <extension - point="org.eclipse.ui.propertyPages"> - <page - class="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" - id="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" - name="TITAN Executor"> - <filter - name="projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </filter> - <enabledWhen> - <instanceof value="org.eclipse.core.resources.IProject" /> - </enabledWhen> - </page> - </extension> + <extension point="org.eclipse.core.expressions.propertyTesters"> + <propertyTester + class="org.eclipse.titan.executor.property.testers.CompilationModeProperty" + id="org.eclipse.titan.executor.property.testers.CompilationModeProperty" + namespace="org.eclipse.titan.executor.propertyTesters" properties="SingleModeBuild, ParallelModeBuild" + type="org.eclipse.core.resources.IResource"> + </propertyTester> + </extension> + <extension point="org.eclipse.debug.core.launchConfigurationTypes"> + <launchConfigurationType name="TITAN Parallel launcher" + delegate="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" + modes="run" + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate"> + </launchConfigurationType> + <launchConfigurationType name="TITAN Single Mode launcher" + delegate="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" + modes="run" + id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate"> + </launchConfigurationType> + <launchConfigurationType name="TITAN JNI launcher" + delegate="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" + modes="run" + id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate"> + </launchConfigurationType> + </extension> + <extension point="org.eclipse.debug.ui.launchShortcuts"> + <shortcut + class="org.eclipse.titan.executor.executors.single.LaunchShortcut" + id="org.eclipse.titan.executor.executors.single.LaunchShortcut" + label="TITAN Single Mode launcher" icon="icons/launch_single.gif" + description="Launch an execution in single mode" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1" /> + <iterate> + <instanceof value="org.eclipse.core.resources.IProject" /> + <test value="org.eclipse.titan.designer.core.TITANNature" + property="org.eclipse.core.resources.projectNature" /> + <test + property="org.eclipse.titan.executor.propertyTesters.SingleModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" /> + </shortcut> + <shortcut + class="org.eclipse.titan.executor.executors.single.LaunchShortcutConfig" + description="Launch an execution in single mode" icon="icons/launch_single.gif" + id="org.eclipse.titan.executor.executors.single.LaunchShortcutConfig" + label="TITAN Single Mode launcher" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1"> + </count> + <iterate operator="and"> + <instanceof value="org.eclipse.core.resources.IFile"> + </instanceof> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + <test property="org.eclipse.core.resources.extension" + value="cfg" /> + <test + property="org.eclipse.titan.executor.propertyTesters.SingleModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate"> + </configurationType> + </shortcut> + <shortcut + class="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcut" + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcut" + label="TITAN Parallel launcher" icon="icons/launch_cli.gif" + description="Launch an execution in mctr_cli mode" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1" /> + <iterate> + <instanceof value="org.eclipse.core.resources.IProject" /> + <test value="org.eclipse.titan.designer.core.TITANNature" + property="org.eclipse.core.resources.projectNature" /> + <test + property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" /> + </shortcut> + <shortcut + class="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcutConfig" + description="Launch an execution in mctr_cli mode" icon="icons/launch_cli.gif" + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchShortcutConfig" + label="TITAN Parallel launcher" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1"> + </count> + <iterate operator="and"> + <instanceof value="org.eclipse.core.resources.IFile"> + </instanceof> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + <test property="org.eclipse.core.resources.extension" + value="cfg" /> + <test + property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate"> + </configurationType> + </shortcut> + <shortcut class="org.eclipse.titan.executor.executors.jni.LaunchShortcut" + id="org.eclipse.titan.executor.executors.jni.LaunchShortcut" + label="TITAN JNI launcher" icon="icons/launch_jni.gif" + description="Launch an execution in jni mode" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1" /> + <iterate> + <instanceof value="org.eclipse.core.resources.IProject" /> + <test value="org.eclipse.titan.designer.core.TITANNature" + property="org.eclipse.core.resources.projectNature" /> + <test + property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" /> + </shortcut> + <shortcut + class="org.eclipse.titan.executor.executors.jni.LaunchShortcutConfig" + description="Launch an execution in jni mode" icon="icons/launch_jni.gif" + id="org.eclipse.titan.executor.executors.jni.LaunchShortcutConfig" + label="TITAN JNI launcher" modes="run"> + <description description="Runs a local TITAN application" + mode="run"> + </description> + <contextualLaunch> + <enablement> + <with variable="selection"> + <count value="1"> + </count> + <iterate operator="and"> + <instanceof value="org.eclipse.core.resources.IFile"> + </instanceof> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature" /> + <test property="org.eclipse.core.resources.extension" + value="cfg" /> + <test + property="org.eclipse.titan.executor.propertyTesters.ParallelModeBuild" + forcePluginActivation="true" /> + </iterate> + </with> + </enablement> + </contextualLaunch> + <configurationType + id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate"> + </configurationType> + </shortcut> + </extension> + <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages"> + <launchConfigurationTypeImage icon="icons/launch_cli.gif" + configTypeID="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" + id="org.eclipse.titan.executor.executors.mctr.cli.uniquetypeImage"> + </launchConfigurationTypeImage> + <launchConfigurationTypeImage icon="icons/launch_single.gif" + configTypeID="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" + id="org.eclipse.titan.executor.executors.single.uniquetypeImage"> + </launchConfigurationTypeImage> + <launchConfigurationTypeImage icon="icons/launch_jni.gif" + configTypeID="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" + id="org.eclipse.titan.executor.executors.jni.uniquetypeImage"> + </launchConfigurationTypeImage> + </extension> + <extension point="org.eclipse.debug.ui.launchConfigurationTabGroups"> + <launchConfigurationTabGroup + type="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationDelegate" + class="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationTabGroup" + id="org.eclipse.titan.executor.executors.mctr.cli.LaunchConfigurationTabGroup"> + <launchMode mode="run" + perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> + </launchMode> + </launchConfigurationTabGroup> + <launchConfigurationTabGroup + type="org.eclipse.titan.executor.executors.single.LaunchConfigurationDelegate" + class="org.eclipse.titan.executor.executors.single.LaunchConfigurationTabGroup" + id="org.eclipse.titan.executor.executors.single.LaunchConfigurationTabGroup"> + <launchMode mode="run" + perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> + </launchMode> + </launchConfigurationTabGroup> + <launchConfigurationTabGroup + type="org.eclipse.titan.executor.executors.jni.LaunchConfigurationDelegate" + class="org.eclipse.titan.executor.executors.jni.LaunchConfigurationTabGroup" + id="org.eclipse.titan.executor.executors.jni.LaunchConfigurationTabGroup"> + <launchMode mode="run" + perspective="org.eclipse.titan.executor.perspectives.ExecutingPerspective"> + </launchMode> + </launchConfigurationTabGroup> + </extension> + <extension point="org.eclipse.ui.views"> + <category id="TITAN Monitor Category" name="TITAN Monitors"> + </category> + <view + id="org.eclipse.titan.executor.views.executorMonitor.ExecutorMonitorView" + name="TITAN Execution Controller" category="TITAN Monitor Category" + class="org.eclipse.titan.executor.views.executormonitor.ExecutorMonitorView" + icon="icons/titan.gif"> + </view> + <view + id="org.eclipse.titan.executor.views.testExecution.TestExecutionView" + name="TITAN test results" category="TITAN Monitor Category" + class="org.eclipse.titan.executor.views.testexecution.TestExecutionView" + icon="icons/titan.gif"> + </view> + <view + id="org.eclipse.titan.executor.views.notification.NotificationView" + name="TITAN notifications" category="TITAN Monitor Category" + class="org.eclipse.titan.executor.views.notification.NotificationView" + icon="icons/titan.gif"> + </view> + </extension> + <extension point="org.eclipse.ui.perspectives"> + <perspective + class="org.eclipse.titan.executor.perspectives.ExecutingPerspective" + icon="icons/titan.gif" + id="org.eclipse.titan.executor.perspectives.ExecutingPerspective" + name="TITAN Executing" /> + </extension> + <extension point="org.eclipse.help.toc"> + <toc file="toc.xml" primary="false" /> + </extension> + <extension point="org.eclipse.core.runtime.preferences"> + <initializer + class="org.eclipse.titan.executor.preferences.PreferenceInitializer" /> + </extension> + <extension point="org.eclipse.ui.preferencePages"> + <page + id="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" + class="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" + name="TITAN Executor" /> + </extension> + <extension point="org.eclipse.ui.propertyPages"> + <page + class="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" + id="org.eclipse.titan.executor.preferences.ExecutorPreferencePage" + name="TITAN Executor"> + <filter name="projectNature" value="org.eclipse.titan.designer.core.TITANNature"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject" /> + </enabledWhen> + </page> + </extension> </plugin> diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcut.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcut.java index 208a472d6b..dcec34b84d 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcut.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcut.java @@ -7,6 +7,11 @@ ******************************************************************************/ package org.eclipse.titan.executor.executors; +import static org.eclipse.titan.executor.GeneralConstants.EXECUTECONFIGFILEONLAUNCH; + +import java.util.ArrayList; +import java.util.List; + import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; @@ -20,18 +25,11 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.executor.tabpages.hostcontrollers.HostControllersTab; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.dialogs.ElementListSelectionDialog; -import java.util.ArrayList; -import java.util.List; - -import static org.eclipse.titan.executor.GeneralConstants.EXECUTECONFIGFILEONLAUNCH; - //FIXME comment /** * @author Kristof Szabados @@ -90,7 +88,7 @@ public abstract class LaunchShortcut implements ILaunchShortcut { return null; } else if (candidateConfigurations.size() > 1) { ILabelProvider labelProvider = DebugUITools.newDebugModelPresentation(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(null, labelProvider); dialog.setTitle(getDialogTitle()); dialog.setMessage("Select existing configuration."); dialog.setElements(candidateConfigurations.toArray(new ILaunchConfiguration[candidateConfigurations.size()])); diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcutConfig.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcutConfig.java index be26238d23..527a97e123 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcutConfig.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/LaunchShortcutConfig.java @@ -7,6 +7,11 @@ ******************************************************************************/ package org.eclipse.titan.executor.executors; +import static org.eclipse.titan.executor.GeneralConstants.EXECUTECONFIGFILEONLAUNCH; + +import java.util.ArrayList; +import java.util.List; + import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -21,18 +26,11 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.executor.tabpages.hostcontrollers.HostControllersTab; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.dialogs.ElementListSelectionDialog; -import java.util.ArrayList; -import java.util.List; - -import static org.eclipse.titan.executor.GeneralConstants.EXECUTECONFIGFILEONLAUNCH; - /** * @author Kristof Szabados * */ @@ -92,7 +90,7 @@ public abstract class LaunchShortcutConfig implements ILaunchShortcut { return null; } else if (candidateConfigurations.size() > 1) { final ILabelProvider labelProvider = DebugUITools.newDebugModelPresentation(); - final ElementListSelectionDialog dialog = new ElementListSelectionDialog(new Shell(Display.getDefault()), labelProvider); + final ElementListSelectionDialog dialog = new ElementListSelectionDialog(null, labelProvider); dialog.setTitle(getDialogTitle()); dialog.setMessage("Select existing configuration."); dialog.setElements(candidateConfigurations.toArray(new ILaunchConfiguration[candidateConfigurations.size()])); diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/JniExecutor.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/JniExecutor.java index 009e90a005..155f45bfd0 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/JniExecutor.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/JniExecutor.java @@ -27,10 +27,8 @@ import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.cfg.CfgLexer; import org.eclipse.titan.common.parsers.cfg.ConfigFileHandler; @@ -668,7 +666,7 @@ public final class JniExecutor extends BaseExecutor implements IJNICallback { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - ExecuteDialog dialog = new ExecuteDialog(new Shell(Display.getDefault())); + ExecuteDialog dialog = new ExecuteDialog(null); dialog.setControlparts(availableControlParts); dialog.setTestcases(availableTestcases); dialog.setTestsets(availableTestSetNames); diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/LaunchConfigurationDelegate.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/LaunchConfigurationDelegate.java index 00c6554ea8..288655d24f 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/LaunchConfigurationDelegate.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/jni/LaunchConfigurationDelegate.java @@ -24,8 +24,8 @@ import org.eclipse.titan.executor.jni.JNIMiddleWare; public final class LaunchConfigurationDelegate extends TitanLaunchConfigurationDelegate { /** { ttcn3_major, ttcn3_minor, ttcn3_patchlevel, ttcn3_buildnumber } */ - private final ProductIdentity versionLow = ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 2, 0); - private final ProductIdentity versionHigh = ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 2, 0); + private final ProductIdentity versionLow = ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 3, 0); + private final ProductIdentity versionHigh = ProductIdentity.getProductIdentity(ProductIdentity.TITAN_PRODUCT_NUMBER, 5, 4, 3, 0); @Override public void launch(final ILaunchConfiguration arg0, final String arg1, final ILaunch arg2, final IProgressMonitor arg3) throws CoreException { diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/mctr/cli/CliExecutor.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/mctr/cli/CliExecutor.java index 60c5984595..c5c071b127 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/mctr/cli/CliExecutor.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/mctr/cli/CliExecutor.java @@ -7,6 +7,22 @@ ******************************************************************************/ package org.eclipse.titan.executor.executors.mctr.cli; +import static org.eclipse.titan.executor.GeneralConstants.MCSTATEREFRESHTIMEOUT; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Date; +import java.util.Formatter; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -24,7 +40,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.cfg.ConfigFileHandler; import org.eclipse.titan.common.path.PathConverter; @@ -48,22 +63,6 @@ import org.eclipse.titan.executor.views.testexecution.ExecutedTestcase; import org.eclipse.titan.executor.views.testexecution.TestExecutionView; import org.eclipse.ui.console.MessageConsoleStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Date; -import java.util.Formatter; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.eclipse.titan.executor.GeneralConstants.MCSTATEREFRESHTIMEOUT; - /** * This executor handles the execution of tests compiled in a parallel mode, connecting to the MainController via command line. * @@ -288,7 +287,7 @@ public final class CliExecutor extends BaseExecutor { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), + MessageDialog.openError(null, "Execution failed", "The working directory `" + workingdirectoryPath + "' does not exist."); } @@ -482,7 +481,7 @@ public final class CliExecutor extends BaseExecutor { public void run() { boolean invalidSelection = false; do { - ExecuteDialog dialog = new ExecuteDialog(new Shell(Display.getDefault())); + ExecuteDialog dialog = new ExecuteDialog(null); dialog.setControlparts(availableControlParts); dialog.setTestcases(availableTestcases); dialog.setTestsets(availableTestSetNames); diff --git a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/single/SingleExecutor.java b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/single/SingleExecutor.java index 4a90a7b848..8e60b92f33 100644 --- a/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/single/SingleExecutor.java +++ b/org.eclipse.titan.executor/src/org/eclipse/titan/executor/executors/single/SingleExecutor.java @@ -38,7 +38,6 @@ import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.parsers.cfg.CfgLexer; import org.eclipse.titan.common.parsers.cfg.ConfigFileHandler; @@ -139,7 +138,7 @@ public final class SingleExecutor extends BaseExecutor { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - ExecuteDialog dialog = new ExecuteDialog(new Shell(Display.getDefault())); + ExecuteDialog dialog = new ExecuteDialog(null); dialog.setControlparts(availableControlParts); dialog.setTestsets(availableTestSetNames); dialog.setTestcases(availableTestcases); @@ -292,7 +291,7 @@ public final class SingleExecutor extends BaseExecutor { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), "Execution failed", "The executable `" + executableFile + "' does not exist."); + MessageDialog.openError(null, "Execution failed", "The executable `" + executableFile + "' does not exist."); } }); } @@ -323,7 +322,7 @@ public final class SingleExecutor extends BaseExecutor { Display.getDefault().syncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), + MessageDialog.openError(null, "Execution failed", "The working directory `" + workingdirectoryPath + "' does not exist."); } }); diff --git a/org.eclipse.titan.help/META-INF/MANIFEST.MF b/org.eclipse.titan.help/META-INF/MANIFEST.MF index c7d6157a6b..98a30420c6 100755 --- a/org.eclipse.titan.help/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.help/META-INF/MANIFEST.MF @@ -4,6 +4,6 @@ Created-By: 23.6-b04 (Oracle Corporation) Bundle-ManifestVersion: 2 Bundle-Name: TITAN_Help Plug-in Bundle-SymbolicName: org.eclipse.titan.help;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Vendor: Eclipse Titan Project diff --git a/org.eclipse.titan.log.viewer/META-INF/MANIFEST.MF b/org.eclipse.titan.log.viewer/META-INF/MANIFEST.MF index 9ab2f59d25..4f32b85921 100755 --- a/org.eclipse.titan.log.viewer/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.log.viewer/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Created-By: 23.6-b04 (Oracle Corporation) Bundle-ManifestVersion: 2 Bundle-Name: TITAN Log Viewer Bundle-SymbolicName: org.eclipse.titan.log.viewer;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titan.log.viewer.Activator Bundle-Vendor: Eclipse Titan Project Require-Bundle: org.eclipse.core.resources, @@ -17,7 +17,7 @@ Require-Bundle: org.eclipse.core.resources, org.eclipse.jface.text, org.eclipse.ui.editors, org.eclipse.ui.workbench.texteditor, - org.eclipse.titan.common;bundle-version="5.4.2" + org.eclipse.titan.common;bundle-version="5.4.3" Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true Bundle-ClassPath: . diff --git a/org.eclipse.titan.log.viewer/org.eclipse.titan.log.viewer.iml b/org.eclipse.titan.log.viewer/org.eclipse.titan.log.viewer.iml index 80c7fa211a..8b74099498 100644 --- a/org.eclipse.titan.log.viewer/org.eclipse.titan.log.viewer.iml +++ b/org.eclipse.titan.log.viewer/org.eclipse.titan.log.viewer.iml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 diff --git a/org.eclipse.titan.log.viewer/plugin.xml b/org.eclipse.titan.log.viewer/plugin.xml index 0ecd9e22cb..daf5e1ad95 100644 --- a/org.eclipse.titan.log.viewer/plugin.xml +++ b/org.eclipse.titan.log.viewer/plugin.xml @@ -1,540 +1,520 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2000-2015 Ericsson Telecom AB - - 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 - --> -<?eclipse version="3.2"?> -<plugin> - <extension - id="org.eclipse.titan.log.viewer.TitanLogProject" - name="Titan Log Viewer Project Nature" - point="org.eclipse.core.resources.natures"> - <runtime> - <run class="org.eclipse.titan.log.viewer.natures.TitanLogProject"/> - </runtime> - </extension> - <extension - point="org.eclipse.core.runtime.preferences"> - <initializer class="org.eclipse.titan.log.viewer.preferences.PreferenceInitializer"/> - </extension> - <extension - point="org.eclipse.ui.perspectives"> - <perspective - class="org.eclipse.titan.log.viewer.factories.PerspectiveFactory" - icon="icons/titan.gif" - id="org.eclipse.titan.log.viewer.factories.PerspectiveFactory" - name="TITAN Log Viewer"/> - </extension> - <extension - point="org.eclipse.help.toc"> - <toc - file="toc.xml" - primary="true"/> - </extension> - <extension - point="org.eclipse.ui.decorators"> - <decorator - adaptable="true" - class="org.eclipse.titan.log.viewer.views.navigator.FileSizeDecorator" - id="org.eclipse.titan.log.viewer.views.navigator.FileSizeDecorator" - label="TITAN Log Viewer file size decorator" - lightweight="true" - state="true"> - <enablement> - <objectClass name="org.eclipse.core.resources.IFile"/> - </enablement> - </decorator> - </extension> - <extension - point="org.eclipse.ui.preferencePages"> - <page - class="org.eclipse.titan.log.viewer.preferences.pages.GeneralSettingsPrefPage" - id="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - name="TITAN Log Viewer"> - </page> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.ComponentsVisualOrderPrefPage" - id="org.eclipse.titan.log.viewer.preferences.pages.VisualComponentsOrderPrefPage" - name="Components Visual Order"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" - name="Filtered Components"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" - name="Filtered Signals"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" - name="Filtered Functions"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventPrefPage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventsPage" - name="Filtered Silent Events"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" - id="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" - name="Color Keywords"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" - id="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" - name="Setverdict"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" - name="Filtered Ports"/> - <page - category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" - class="org.eclipse.titan.log.viewer.preferences.pages.DecipheringPreferencePage" - id="org.eclipse.titan.log.viewer.preferences.pages.DecipheringPreferencePage" - name="Message Deciphering"/> - </extension> - <extension - point="org.eclipse.ui.propertyPages"> - <page - class="org.eclipse.titan.log.viewer.preferences.pages.GeneralSettingsPrefPage" - id="org.eclipse.titan.log.viewer.properties.GeneralPage" - name="TITAN Log Viewer"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.ComponentsVisualOrderPrefPage" - id="org.eclipse.titan.log.viewer.properties.CompVisOrderPage" - name="Components Visual Order"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" - id="org.eclipse.titan.log.viewer.properties.FilteredCompPage" - name="Filtered Components"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" - id="org.eclipse.titan.log.viewer.properties.FilteredSignalsPage" - name="Filtered Signals"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" - id="org.eclipse.titan.log.viewer.properties.FilteredFunctionsPage" - name="Filtered Functions"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventPrefPage" - id="org.eclipse.titan.log.viewer.properties.FilteredSilentEventsPage" - name="Filtered Silent Events"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" - id="org.eclipse.titan.log.viewer.properties.HighlightKeywordsPage" - name="Color Keywords"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" - id="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" - name="Setverdict"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - <page - category="org.eclipse.titan.log.viewer.properties.GeneralPage" - class="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" - id="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" - name="Filtered Ports"> - <filter - name="projectNature" - value="org.eclipse.titan.log.viewer.TitanLogProject"> - </filter> - <enabledWhen> - <instanceof - value="org.eclipse.core.resources.IProject"> - </instanceof> - </enabledWhen> - </page> - </extension> - <extension - point="org.eclipse.ui.views"> - <category - id="org.eclipse.titan.log.viewer.views.category" - name="TITAN Log Viewer"/> - <view - allowMultiple="true" - category="org.eclipse.titan.log.viewer.views.category" - class="org.eclipse.titan.log.viewer.views.MSCView" - icon="icons/msc.gif" - id="org.eclipse.titan.log.viewer.views.MSCView" - name="MSC"/> - <view - allowMultiple="false" - category="org.eclipse.titan.log.viewer.views.category" - class="org.eclipse.titan.log.viewer.views.DetailsView" - icon="icons/details.gif" - id="org.eclipse.titan.log.viewer.views.DetailsView" - name="Value"/> - <view - allowMultiple="true" - category="org.eclipse.titan.log.viewer.views.category" - class="org.eclipse.titan.log.viewer.views.text.table.TextTableView" - icon="icons/table_view.gif" - id="org.eclipse.titan.log.viewer.views.text.table.TextTableView" - name="Text Table"/> - <view - allowMultiple="true" - category="org.eclipse.titan.log.viewer.views.category" - class="org.eclipse.titan.log.viewer.views.StatisticalView" - icon="icons/statistics.gif" - id="org.eclipse.titan.log.viewer.views.StatisticalView" - name="Statistical"/> - </extension> - <extension - point="org.eclipse.search.searchPages"> - <page - showScopeSection="true" - canSearchEnclosingProjects="true" - label="TITAN Log files" - class="org.eclipse.titan.log.viewer.views.LogSearchPage" - icon="icons/search.gif" - extensions="log:100" - sizeHint="650,200" - id="org.eclipse.titan.log.viewer.search.LogSearchPage"> - </page> - </extension> - <extension - id="LogSearchPage" - point="org.eclipse.search.searchResultViewPages"> - <viewPage - id="org.eclipse.titan.log.viewer.search.LogSearchViewPage" - searchResultClass="org.eclipse.titan.log.viewer.search.LogSearchResult" - class="org.eclipse.titan.log.viewer.views.LogSearchResultPage"> - </viewPage> - </extension> -<extension - point="org.eclipse.ui.actionSets"> - <actionSet - label="TITAN Log files" - visible="false" - id="org.eclipse.titan.log.viewer.search.SearchActionSet"> - - <!-- see http://bugs.eclipse.org/bugs/show_bug.cgi?id=15684 --> - <!-- Note: The menu (re-) definition has to be here due to bug: --> - <!-- =================================================================== --> - <!-- Search Menu --> - <!-- =================================================================== --> - <menu - label="Search" - path="navigate" - id="org.eclipse.search.menu"> - <groupMarker name="internalDialogGroup"/> <!-- not to be used by clients --> - <groupMarker name="dialogGroup"/> <!-- to be used by clients --> - <separator name="fileSearchContextMenuActionsGroup"/> <!-- to be used by clients --> - <separator name="contextMenuActionsGroup"/> <!-- to be used by clients --> - <separator name="occurencesActionsGroup"/> <!-- to be used by clients --> - <separator name="extraSearchGroup"/> <!-- to be used by clients --> - </menu> - <!-- =================================================================== --> - - <action - label="TITAN Log files" - icon="icons/search.gif" - class="org.eclipse.titan.log.viewer.actions.OpenLogSearchPageAction" - menubarPath="org.eclipse.search.menu/dialogGroup" - id="org.eclipse.titan.log.viewer.actions.OpenLogSearchPage"> - </action> - </actionSet> -</extension> - -<extension - point="org.eclipse.ui.perspectiveExtensions"> - <perspectiveExtension targetID="org.eclipse.titan.log.viewer.factories.PerspectiveFactory"> - <actionSet id="org.eclipse.titan.log.viewer.search.SearchActionSet"/> - </perspectiveExtension> -</extension> - - -<extension point="org.eclipse.ui.bindings"><key commandId="org.eclipse.titan.log.viewer.enter" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="CR"/> -</extension> - <extension point="org.eclipse.ui.commands"><command id="org.eclipse.titan.log.viewer.enter" name="Enter"/> -</extension> - <extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - objectClass="org.eclipse.core.resources.IFile" - adaptable = "true" - nameFilter="*.log" - id="org.eclipse.titan.log.viewer.objectContribution1"> - <menu - id = "TITAN_log_viewer_popup_Menu" - label = "TITAN Log Viewer"> - <separator name = "group1"/> - <separator name = "group2"/> - </menu> - <action - id="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" - icon="icons/testcases.gif" - label="Extract Test Cases" - class="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu/group1" - enablesFor="1"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" - icon="icons/fetch_components.gif" - label="Extract Components" - class="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu/group1" - enablesFor="1"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" - icon="icons/table_view.gif" - label="Open Text Table View" - class="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu/group1" - enablesFor="1"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" - icon="icons/statistics.gif" - label="Open Statistical View" - class="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu/group1" - enablesFor="+"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" - icon="icons/delete.gif" - label="Close all connected views" - class="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu/group2" - enablesFor="1"> - </action> - </objectContribution> - </extension> - <extension - point="org.eclipse.ui.navigator.navigatorContent"> - <navigatorContent - id="org.eclipse.titan.log.viewer.logfileContent" - name="TITAN Log file" - activeByDefault="true" - contentProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileContentProvider" - labelProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileLabelProvider" - priority="high"> - <enablement> - <and> - <instanceof value="org.eclipse.core.resources.IFile" /> --> - <test property="org.eclipse.core.resources.extension" value="log" /> - </and> - </enablement> - </navigatorContent> - </extension> - - <extension - point="org.eclipse.ui.navigator.navigatorContent"> - <navigatorContent - id="org.eclipse.titan.log.viewer.TestCaseContent" - name="TITAN Test Case" - activeByDefault="true" - contentProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileContentProvider" - labelProvider="org.eclipse.titan.log.viewer.views.navigator.TestCasesViewerLabelProvider" - priority="highest"> - <enablement> - <instanceof value="org.eclipse.titan.log.viewer.parsers.data.TestCase" /> - </enablement> - </navigatorContent> - </extension> - -<extension - point="org.eclipse.ui.navigator.navigatorContent"> - <actionProvider - class="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider" - id="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider.open" - priority="highest"> - <enablement> - <and> - <instanceof - value="org.eclipse.titan.log.viewer.parsers.data.TestCase"> - </instanceof> - </and> - </enablement> - </actionProvider> -</extension> -<extension - point="org.eclipse.ui.navigator.viewer"> - <viewerActionBinding - viewerId="org.eclipse.ui.navigator.ProjectExplorer"> - <includes> - <actionExtension - pattern="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider.open"> - </actionExtension> - </includes> - </viewerActionBinding> -</extension> - -<extension - point="org.eclipse.ui.navigator.navigatorContent"> - <actionProvider - class="org.eclipse.titan.log.viewer.actions.LogFileActionProvider" - id="org.eclipse.titan.log.viewer.actions.LogFileActionProvider.open" - overrides="org.eclipse.ui.navigator.resources.OpenActions" - priority="highest"> - <enablement> - <and> - <instanceof - value="org.eclipse.core.resources.IFile"> - </instanceof> - <test - property="org.eclipse.core.resources.extension" - value="log"> - </test> - </and> - </enablement> - </actionProvider> -</extension> -<extension - point="org.eclipse.ui.navigator.viewer"> - <viewerActionBinding - viewerId="org.eclipse.ui.navigator.ProjectExplorer"> - <includes> - <actionExtension - pattern="org.eclipse.titan.log.viewer.actions.LogFileActionProvider.open" /> - </includes> - </viewerActionBinding> -</extension> - - <extension - point="org.eclipse.ui.navigator.viewer"> - <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> - <includes> - <contentExtension pattern="org.eclipse.titan.log.viewer.logfileContent"/> - <actionExtension pattern="org.eclipse.titan.log.viewer.actions.LogFileActionProvider" /> - <contentExtension pattern="org.eclipse.titan.log.viewer.TestCaseContent"/> - <actionExtension pattern="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider" /> - <actionExtension pattern="org.eclipse.ui.navigator.resources.*" /> - </includes> - </viewerContentBinding> - </extension> - - <extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - objectClass="org.eclipse.titan.log.viewer.parsers.data.TestCase" - adaptable = "true" - id="org.eclipse.titan.log.viewer.objectContributionForTestCase"> - <menu - id = "TITAN_log_viewer_popup_Menu_TestCase" - label = "TITAN Log Viewer"> - </menu> - <action - id="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" - icon="icons/table_view.gif" - label="Open Text Table View" - class="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu" - enablesFor="1"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" - icon="icons/msc.gif" - label="Open MSC View" - class="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu" - enablesFor="1"> - </action> - <action - id="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" - icon="icons/statistics.gif" - label="Open Statistical View" - class="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" - menubarPath = "TITAN_log_viewer_popup_Menu" - enablesFor="+"> - </action> - </objectContribution> - </extension> -</plugin> +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2000-2016 Ericsson Telecom AB + + 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 + --> +<?eclipse version="4.4"?> +<plugin> + <extension id="org.eclipse.titan.log.viewer.TitanLogProject" + name="Titan Log Viewer Project Nature" point="org.eclipse.core.resources.natures"> + <runtime> + <run class="org.eclipse.titan.log.viewer.natures.TitanLogProject" /> + </runtime> + </extension> + <extension point="org.eclipse.core.runtime.preferences"> + <initializer + class="org.eclipse.titan.log.viewer.preferences.PreferenceInitializer" /> + </extension> + <extension point="org.eclipse.ui.perspectives"> + <perspective + class="org.eclipse.titan.log.viewer.factories.PerspectiveFactory" + icon="icons/titan.gif" id="org.eclipse.titan.log.viewer.factories.PerspectiveFactory" + name="TITAN Log Viewer" /> + </extension> + <extension point="org.eclipse.help.toc"> + <toc file="toc.xml" primary="true" /> + </extension> + <extension point="org.eclipse.ui.decorators"> + <decorator adaptable="true" + class="org.eclipse.titan.log.viewer.views.navigator.FileSizeDecorator" + id="org.eclipse.titan.log.viewer.views.navigator.FileSizeDecorator" + label="TITAN Log Viewer file size decorator" lightweight="true" + state="true"> + <enablement> + <objectClass name="org.eclipse.core.resources.IFile" /> + </enablement> + </decorator> + </extension> + <extension point="org.eclipse.ui.preferencePages"> + <page + class="org.eclipse.titan.log.viewer.preferences.pages.GeneralSettingsPrefPage" + id="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + name="TITAN Log Viewer"> + </page> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.ComponentsVisualOrderPrefPage" + id="org.eclipse.titan.log.viewer.preferences.pages.VisualComponentsOrderPrefPage" + name="Components Visual Order" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" + name="Filtered Components" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" + name="Filtered Signals" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" + name="Filtered Functions" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventPrefPage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventsPage" + name="Filtered Silent Events" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" + id="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" + name="Color Keywords" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" + id="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" + name="Setverdict" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" + name="Filtered Ports" /> + <page + category="org.eclipse.titan.log.viewer.preferences.TitanLogViewerPreferencePage" + class="org.eclipse.titan.log.viewer.preferences.pages.DecipheringPreferencePage" + id="org.eclipse.titan.log.viewer.preferences.pages.DecipheringPreferencePage" + name="Message Deciphering" /> + </extension> + <extension point="org.eclipse.ui.propertyPages"> + <page + class="org.eclipse.titan.log.viewer.preferences.pages.GeneralSettingsPrefPage" + id="org.eclipse.titan.log.viewer.properties.GeneralPage" name="TITAN Log Viewer"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.ComponentsVisualOrderPrefPage" + id="org.eclipse.titan.log.viewer.properties.CompVisOrderPage" + name="Components Visual Order"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredComponentsPrefPage" + id="org.eclipse.titan.log.viewer.properties.FilteredCompPage" + name="Filtered Components"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSignalsPrefPage" + id="org.eclipse.titan.log.viewer.properties.FilteredSignalsPage" + name="Filtered Signals"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredFunctionsPrefPage" + id="org.eclipse.titan.log.viewer.properties.FilteredFunctionsPage" + name="Filtered Functions"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredSilentEventPrefPage" + id="org.eclipse.titan.log.viewer.properties.FilteredSilentEventsPage" + name="Filtered Silent Events"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.HighlightKeywordsPage" + id="org.eclipse.titan.log.viewer.properties.HighlightKeywordsPage" + name="Color Keywords"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" + id="org.eclipse.titan.log.viewer.preferences.pages.SetverdictPreferencePage" + name="Setverdict"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + <page category="org.eclipse.titan.log.viewer.properties.GeneralPage" + class="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" + id="org.eclipse.titan.log.viewer.preferences.pages.FilteredPortsPreferencePage" + name="Filtered Ports"> + <filter name="projectNature" value="org.eclipse.titan.log.viewer.TitanLogProject"> + </filter> + <enabledWhen> + <instanceof value="org.eclipse.core.resources.IProject"> + </instanceof> + </enabledWhen> + </page> + </extension> + <extension point="org.eclipse.ui.views"> + <category id="org.eclipse.titan.log.viewer.views.category" + name="TITAN Log Viewer" /> + <view allowMultiple="true" + category="org.eclipse.titan.log.viewer.views.category" class="org.eclipse.titan.log.viewer.views.MSCView" + icon="icons/msc.gif" id="org.eclipse.titan.log.viewer.views.MSCView" + name="MSC" /> + <view allowMultiple="false" + category="org.eclipse.titan.log.viewer.views.category" class="org.eclipse.titan.log.viewer.views.DetailsView" + icon="icons/details.gif" id="org.eclipse.titan.log.viewer.views.DetailsView" + name="Value" /> + <view allowMultiple="true" + category="org.eclipse.titan.log.viewer.views.category" + class="org.eclipse.titan.log.viewer.views.text.table.TextTableView" + icon="icons/table_view.gif" id="org.eclipse.titan.log.viewer.views.text.table.TextTableView" + name="Text Table" /> + <view allowMultiple="true" + category="org.eclipse.titan.log.viewer.views.category" class="org.eclipse.titan.log.viewer.views.StatisticalView" + icon="icons/statistics.gif" id="org.eclipse.titan.log.viewer.views.StatisticalView" + name="Statistical" /> + </extension> + <extension point="org.eclipse.search.searchPages"> + <page showScopeSection="true" canSearchEnclosingProjects="true" + label="TITAN Log files" class="org.eclipse.titan.log.viewer.views.LogSearchPage" + icon="icons/search.gif" extensions="log:100" sizeHint="650,200" + id="org.eclipse.titan.log.viewer.search.LogSearchPage"> + </page> + </extension> + <extension id="LogSearchPage" point="org.eclipse.search.searchResultViewPages"> + <viewPage id="org.eclipse.titan.log.viewer.search.LogSearchViewPage" + searchResultClass="org.eclipse.titan.log.viewer.search.LogSearchResult" + class="org.eclipse.titan.log.viewer.views.LogSearchResultPage"> + </viewPage> + </extension> + <extension point="org.eclipse.ui.actionSets"> + <actionSet label="TITAN Log files" visible="false" + id="org.eclipse.titan.log.viewer.search.SearchActionSet"> + + <!-- see http://bugs.eclipse.org/bugs/show_bug.cgi?id=15684 --> + <!-- Note: The menu (re-) definition has to be here due to bug: --> + <!-- =================================================================== --> + <!-- Search Menu --> + <!-- =================================================================== --> + <menu label="Search" path="navigate" id="org.eclipse.search.menu"> + <groupMarker name="internalDialogGroup" /> <!-- not to be used by clients --> + <groupMarker name="dialogGroup" /> <!-- to be used by clients --> + <separator name="fileSearchContextMenuActionsGroup" /> <!-- to be used by clients --> + <separator name="contextMenuActionsGroup" /> <!-- to be used by clients --> + <separator name="occurencesActionsGroup" /> <!-- to be used by clients --> + <separator name="extraSearchGroup" /> <!-- to be used by clients --> + </menu> + <!-- =================================================================== --> + + <action label="TITAN Log files" icon="icons/search.gif" + class="org.eclipse.titan.log.viewer.actions.OpenLogSearchPageAction" + menubarPath="org.eclipse.search.menu/dialogGroup" + id="org.eclipse.titan.log.viewer.actions.OpenLogSearchPage"> + </action> + </actionSet> + </extension> + + <extension point="org.eclipse.ui.perspectiveExtensions"> + <perspectiveExtension + targetID="org.eclipse.titan.log.viewer.factories.PerspectiveFactory"> + <actionSet id="org.eclipse.titan.log.viewer.search.SearchActionSet" /> + </perspectiveExtension> + </extension> + + + <extension point="org.eclipse.ui.bindings"> + <key commandId="org.eclipse.titan.log.viewer.enter" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CR" /> + </extension> + <extension point="org.eclipse.ui.commands"> + <command id="org.eclipse.titan.log.viewer.enter" name="Enter" /> + </extension> + + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + id="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + name="Open Statistical View" /> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + id="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + name="Open Text Table View" /> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" + id="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" + name="Open MSC View" /> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" + id="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" + name="Extract Components" /> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" + id="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" + name="Extract Test Cases" /> + <command + defaultHandler="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" + id="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" + name="Close all connected views" /> + </extension> + <extension point="org.eclipse.ui.menus"> + <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> + <menu label="Titan Log Viewer"> + <command + commandId="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + icon="icons/statistics.gif" + id="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + label="Open Statistical View" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.log.viewer.TitanLogProject" /> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + icon="icons/table_view.gif" + id="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + label="Open Text Table View" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.log.viewer.TitanLogProject" /> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" + icon="icons/fetch_components.gif" + id="org.eclipse.titan.log.viewer.actions.ExtractComponentsMenuAction" + label="Extract Components" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.log.viewer.TitanLogProject" /> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" + icon="icons/testcases.gif" + id="org.eclipse.titan.log.viewer.actions.ExtractTestCasesMenuAction" + label="Extract Test Cases" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.log.viewer.TitanLogProject" /> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <separator name="org.eclipse.titan.log.viewer.separator1" + visible="true"> + </separator> + <command + commandId="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" + icon="icons/delete.gif" + id="org.eclipse.titan.log.viewer.actions.CloseAllConnectedViewMenuAction" + label="Close all connected views" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.log.viewer.TitanLogProject" /> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + </menu> + </menuContribution> + </extension> + <extension point="org.eclipse.ui.navigator.navigatorContent"> + <navigatorContent id="org.eclipse.titan.log.viewer.logfileContent" + name="TITAN Log file" activeByDefault="true" + contentProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileContentProvider" + labelProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileLabelProvider" + priority="high"> + <enablement> + <and> + <instanceof value="org.eclipse.core.resources.IFile" /> + --> + <test property="org.eclipse.core.resources.extension" + value="log" /> + </and> + </enablement> + </navigatorContent> + </extension> + + <extension point="org.eclipse.ui.navigator.navigatorContent"> + <navigatorContent id="org.eclipse.titan.log.viewer.TestCaseContent" + name="TITAN Test Case" activeByDefault="true" + contentProvider="org.eclipse.titan.log.viewer.views.navigator.LogFileContentProvider" + labelProvider="org.eclipse.titan.log.viewer.views.navigator.TestCasesViewerLabelProvider" + priority="highest"> + <enablement> + <instanceof value="org.eclipse.titan.log.viewer.parsers.data.TestCase" /> + </enablement> + </navigatorContent> + </extension> + + <extension point="org.eclipse.ui.navigator.navigatorContent"> + <actionProvider + class="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider" + id="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider.open" + priority="highest"> + <enablement> + <and> + <instanceof + value="org.eclipse.titan.log.viewer.parsers.data.TestCase"> + </instanceof> + </and> + </enablement> + </actionProvider> + </extension> + <extension point="org.eclipse.ui.navigator.viewer"> + <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> + <includes> + <actionExtension + pattern="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider.open"> + </actionExtension> + </includes> + </viewerActionBinding> + </extension> + + <extension point="org.eclipse.ui.navigator.viewer"> + <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> + <includes> + <actionExtension + pattern="org.eclipse.titan.log.viewer.actions.LogFileActionProvider.open" /> + </includes> + </viewerActionBinding> + </extension> + + <extension point="org.eclipse.ui.navigator.viewer"> + <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> + <includes> + <contentExtension pattern="org.eclipse.titan.log.viewer.logfileContent" /> + <actionExtension + pattern="org.eclipse.titan.log.viewer.actions.LogFileActionProvider" /> + <contentExtension pattern="org.eclipse.titan.log.viewer.TestCaseContent" /> + <actionExtension + pattern="org.eclipse.titan.log.viewer.actions.TestCaseActionProvider" /> + <actionExtension pattern="org.eclipse.ui.navigator.resources.*" /> + </includes> + </viewerContentBinding> + </extension> + <extension point="org.eclipse.ui.menus"> + <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> + <command + commandId="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + icon="icons/statistics.gif" + id="org.eclipse.titan.log.viewer.actions.OpenStatisticalViewMenuAction" + label="Open Statistical View" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt + type="org.eclipse.titan.log.viewer.parsers.data.TestCase"> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" + icon="icons/msc.gif" + id="org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction" + label="Open MSC View" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt + type="org.eclipse.titan.log.viewer.parsers.data.TestCase"> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command + commandId="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + icon="icons/table_view.gif" + id="org.eclipse.titan.log.viewer.actions.OpenTextTableProjectsViewMenuAction" + label="Open Text Table View" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt + type="org.eclipse.titan.log.viewer.parsers.data.TestCase"> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + </menuContribution> + </extension> +</plugin> diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/CloseAllConnectedViewMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/CloseAllConnectedViewMenuAction.java index 814b96b7be..3c32042f99 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/CloseAllConnectedViewMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/CloseAllConnectedViewMenuAction.java @@ -7,8 +7,10 @@ ******************************************************************************/ package org.eclipse.titan.log.viewer.actions; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; @@ -18,6 +20,7 @@ import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.handlers.HandlerUtil; /** * Menu action for closing the opened views of the selected log file @@ -25,9 +28,8 @@ import org.eclipse.ui.PlatformUI; */ // TODO this action should handle selected test cases as well // TODO this action should handle multiple selection -public class CloseAllConnectedViewMenuAction extends Action implements IActionDelegate { +public class CloseAllConnectedViewMenuAction extends AbstractHandler implements IActionDelegate { - private static final String NAME = "Close all connected views"; //$NON-NLS-1$ private IStructuredSelection selection; private IFile logFile; @@ -35,11 +37,28 @@ public class CloseAllConnectedViewMenuAction extends Action implements IActionDe * Constructor */ public CloseAllConnectedViewMenuAction() { - super(NAME); } @Override public void run(final IAction action) { + run(selection); + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection tempSelection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + if (!(tempSelection instanceof IStructuredSelection)) { + return null; + } + + selection = (IStructuredSelection) tempSelection; + + run(selection); + + return null; + } + + public void run(final IStructuredSelection selection) { if (this.selection == null) { return; } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractComponentsMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractComponentsMenuAction.java index fac01abba8..865c1d66a6 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractComponentsMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractComponentsMenuAction.java @@ -11,16 +11,16 @@ import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.List; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; @@ -35,37 +35,51 @@ import org.eclipse.titan.log.viewer.utils.ResourcePropertyHandler; import org.eclipse.titan.log.viewer.utils.SelectionUtils; import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.dialogs.PreferencesUtil; +import org.eclipse.ui.handlers.HandlerUtil; /** * This action extracts components from a TITAN log file, and adds * the components to the Components Visual Order list */ -public class ExtractComponentsMenuAction extends Action implements IActionDelegate { +//TODO remove unnecessary functions after conversion +public class ExtractComponentsMenuAction extends AbstractHandler implements IActionDelegate { - private static final String NAME = Messages.getString("FetchComponentsAction.0"); //$NON-NLS-1$ - private IStructuredSelection selection; + private ISelection selection; public ExtractComponentsMenuAction() { - super(NAME); + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + + run(selection); + + return null; } @Override public void run(final IAction action) { + run(selection); + } + + + public void run(final ISelection selection) { List<String> components = null; - if (this.selection == null) { + if (selection == null) { return; } - if (!SelectionUtils.isSelectionALogFile(this.selection)) { + if (!SelectionUtils.isSelectionALogFile(selection)) { return; } - IFile logFile = SelectionUtils.selectionToIFile(this.selection); + IFile logFile = SelectionUtils.selectionToIFile(selection); if (logFile == null) { return; } try { ExtractComponentsAction extractCompAction = new ExtractComponentsAction(logFile); - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(false, false, extractCompAction); + new ProgressMonitorDialog(null).run(false, false, extractCompAction); components = extractCompAction.getComponents(); } catch (InvocationTargetException e) { ErrorReporter.logExceptionStackTrace(e); @@ -109,7 +123,7 @@ public class ExtractComponentsMenuAction extends Action implements IActionDelega if (preferences.getOpenPropAfterCompExt()) { // Open dialog PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn( - new Shell(Display.getDefault()), logFile.getProject(), PreferenceConstants.PAGE_ID_COMP_VIS_ORDER_PAGE, null, null); + null, logFile.getProject(), PreferenceConstants.PAGE_ID_COMP_VIS_ORDER_PAGE, null, null); Object currentPage = dialog.getSelectedPage(); if (currentPage instanceof ComponentsVisualOrderPrefPage) { ComponentsVisualOrderPrefPage componentsVisualOrderPrefPage = (ComponentsVisualOrderPrefPage) currentPage; diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractTestCasesMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractTestCasesMenuAction.java index 58068ee2f4..6cbd93c592 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractTestCasesMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/ExtractTestCasesMenuAction.java @@ -9,6 +9,9 @@ package org.eclipse.titan.log.viewer.actions; import java.lang.reflect.InvocationTargetException; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; @@ -16,7 +19,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; @@ -29,30 +31,28 @@ import org.eclipse.titan.log.viewer.utils.Constants; import org.eclipse.titan.log.viewer.utils.Messages; import org.eclipse.titan.log.viewer.utils.SelectionUtils; import org.eclipse.ui.IActionDelegate; +import org.eclipse.ui.handlers.HandlerUtil; /** * Extracts test cases from a TITAN log file and shows the test cases * in the test cases viewer in the navigator view */ -//FIXME this is not even an ACTION !!!! -public class ExtractTestCasesMenuAction extends Action implements IActionDelegate { +//TODO remove unnecessary functions after conversion +public class ExtractTestCasesMenuAction extends AbstractHandler implements IActionDelegate { - private static final String NAME = Messages.getString("ExtractTestCasesMenuAction.0"); //$NON-NLS-1$ - private IStructuredSelection selection; + private ISelection selection; public ExtractTestCasesMenuAction() { - super(NAME); } - @Override - public void run() { - if (this.selection == null) { + public void run(final ISelection selection) { + if (selection == null) { return; } - if (!SelectionUtils.isSelectionALogFile(this.selection)) { + if (!SelectionUtils.isSelectionALogFile(selection)) { return; } - final IFile logFile = SelectionUtils.selectionToIFile(this.selection); + final IFile logFile = SelectionUtils.selectionToIFile(selection); try { Object temp = logFile.getSessionProperty(Constants.EXTRACTION_RUNNING); if (temp != null && (Boolean) temp) { @@ -109,7 +109,16 @@ public class ExtractTestCasesMenuAction extends Action implements IActionDelegat @Override public void run(final IAction action) { - run(); + run(selection); + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + + run(selection); + + return null; } @Override diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/LogFileActionProvider.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/LogFileActionProvider.java index 8f655175f6..2d1499581f 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/LogFileActionProvider.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/LogFileActionProvider.java @@ -20,6 +20,7 @@ import org.eclipse.ui.navigator.ICommonActionExtensionSite; import org.eclipse.ui.navigator.ICommonMenuConstants; import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite; +//FIXME check if this class is needed at all public class LogFileActionProvider extends CommonActionProvider { private OpenTextTableProjectsViewMenuAction openLogFileAction; private ICommonViewerWorkbenchSite viewSite = null; @@ -37,7 +38,7 @@ public class LogFileActionProvider extends CommonActionProvider { IStructuredSelection selection = (IStructuredSelection) getContext().getSelection(); if (selection.size() == 1 && selection.getFirstElement() instanceof IFile) { openLogFileAction.selectionChanged(null, selection); - actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openLogFileAction); +// actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openLogFileAction); } } @@ -51,7 +52,7 @@ public class LogFileActionProvider extends CommonActionProvider { openLogFileAction.selectionChanged(null, selection); if (openLogFileAction.isEnabled()) { - menu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openLogFileAction); +// menu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openLogFileAction); } addOpenWithMenu(menu); diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewAction.java new file mode 100644 index 0000000000..8ba01fc8de --- /dev/null +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewAction.java @@ -0,0 +1,67 @@ +package org.eclipse.titan.log.viewer.actions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.titan.log.viewer.models.LogFileMetaData; +import org.eclipse.titan.log.viewer.parsers.data.TestCase; +import org.eclipse.titan.log.viewer.utils.Messages; +import org.eclipse.ui.IActionDelegate; + +public class OpenMSCViewAction extends Action implements IActionDelegate, ISelectionChangedListener { + private static final String NAME = Messages.getString("OpenMSCViewMenuAction.0"); //$NON-NLS-1$ + + private IStructuredSelection selection; + private LogFileMetaData logFileMetaData; + private int recordToSelect = -1; + + /** + * Constructor + */ + public OpenMSCViewAction() { + super(NAME); + } + + @Override + public void run(final IAction action) { + run(selection); + } + + public void run(final IStructuredSelection selection) { + OpenMSCViewMenuAction menuAction = new OpenMSCViewMenuAction(); + menuAction.setFirstRow(recordToSelect); + menuAction.run(selection); + + } + + @Override + public void selectionChanged(final IAction action, final ISelection selection) { + if (!(selection instanceof IStructuredSelection)) { + setEnabled(false); + return; + } + + this.selection = (IStructuredSelection) selection; + if (this.selection.size() != 1 || !(this.selection.getFirstElement() instanceof TestCase)) { + setEnabled(false); + return; + } + setEnabled(true); + } + + @Override + public void selectionChanged(final SelectionChangedEvent event) { + selectionChanged(null, event.getSelection()); + } + + /** + * The given record will be selected in the opening MSC view. + * @param recordNumber the recordNumber of the record + */ + public void setFirstRow(final int recordNumber) { + this.recordToSelect = recordNumber; + } +} diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewMenuAction.java index b31f49a15e..6795128c48 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenMSCViewMenuAction.java @@ -12,13 +12,15 @@ import java.io.IOException; import java.text.ParseException; import java.util.Date; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; @@ -48,10 +50,10 @@ import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.handlers.HandlerUtil; + +public class OpenMSCViewMenuAction extends AbstractHandler implements IActionDelegate, ISelectionChangedListener { -public class OpenMSCViewMenuAction extends Action implements IActionDelegate, ISelectionChangedListener { - - private static final String NAME = Messages.getString("OpenMSCViewMenuAction.0"); //$NON-NLS-1$ private IStructuredSelection selection; private LogFileMetaData logFileMetaData; private int recordToSelect = -1; @@ -60,15 +62,32 @@ public class OpenMSCViewMenuAction extends Action implements IActionDelegate, IS * Constructor */ public OpenMSCViewMenuAction() { - super(NAME); } @Override - public void run() { + public void run(final IAction action) { + run(selection); + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection tempSelection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + if (!(tempSelection instanceof IStructuredSelection)) { + return null; + } + + selection = (IStructuredSelection) tempSelection; + + run(selection); + + return null; + } + + public void run(final IStructuredSelection selection) { if (!isEnabled()) { return; } - Object element = this.selection.getFirstElement(); + Object element = selection.getFirstElement(); if (!(element instanceof TestCase)) { return; } @@ -242,11 +261,6 @@ public class OpenMSCViewMenuAction extends Action implements IActionDelegate, IS part.setModel(model, getFirstRowToSelect(preferences, model)); } - @Override - public void run(final IAction action) { - run(); - } - @Override public void selectionChanged(final IAction action, final ISelection selection) { if (!(selection instanceof IStructuredSelection)) { diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenSourceViewMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenSourceViewMenuAction.java index 8af5a1fce7..3adb309894 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenSourceViewMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenSourceViewMenuAction.java @@ -17,7 +17,6 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; @@ -30,10 +29,10 @@ import org.eclipse.titan.log.viewer.readers.ValueReader; import org.eclipse.titan.log.viewer.utils.ActionUtils; import org.eclipse.titan.log.viewer.utils.LogFileCacheHandler; import org.eclipse.titan.log.viewer.utils.Messages; -import org.eclipse.titan.log.viewer.views.text.table.TextTableView; import org.eclipse.titan.log.viewer.views.msc.model.EventObject; import org.eclipse.titan.log.viewer.views.msc.model.EventSelection; import org.eclipse.titan.log.viewer.views.msc.ui.actions.OpenSourceAction; +import org.eclipse.titan.log.viewer.views.text.table.TextTableView; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; @@ -156,7 +155,7 @@ public class OpenSourceViewMenuAction extends SelectionProviderAction { @Override public void run() { MessageDialog.openError( - new Shell(Display.getDefault()), + null, "Error opening source", "This log file is not generated with source location information inserted. And it really does not seem to contain source location information"); //$NON-NLS-1$ } }); @@ -164,7 +163,7 @@ public class OpenSourceViewMenuAction extends SelectionProviderAction { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), "Error opening source", "This log record does not seem to contain source location information"); //$NON-NLS-1$ + MessageDialog.openError(null, "Error opening source", "This log record does not seem to contain source location information"); //$NON-NLS-1$ } }); } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenStatisticalViewMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenStatisticalViewMenuAction.java index e145031e51..63129010ff 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenStatisticalViewMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenStatisticalViewMenuAction.java @@ -18,9 +18,11 @@ import java.util.Observable; import java.util.Observer; import java.util.Set; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; @@ -28,7 +30,6 @@ import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; @@ -50,14 +51,15 @@ import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.handlers.HandlerUtil; /** * Menu action for opening the statistical view from the Projects tab in the Navigator view * */ -public class OpenStatisticalViewMenuAction extends Action implements IActionDelegate, Observer { +//TODO remove unnecessary functions after conversion +public class OpenStatisticalViewMenuAction extends AbstractHandler implements IActionDelegate, Observer { - private static final String NAME = Messages.getString("OpenStatisticalViewMenuAction.6"); //$NON-NLS-1$ private IStructuredSelection selection; private IProgressMonitor monitor; private int lastWorked; @@ -67,17 +69,29 @@ public class OpenStatisticalViewMenuAction extends Action implements IActionDele private TestCaseExtractor testCaseExtractor; public OpenStatisticalViewMenuAction() { - super(NAME); testCaseExtractor = new TestCaseExtractor(); } @Override public void run(final IAction action) { - run(); + run(selection); } @Override - public void run() { + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection tempSelection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + if (!(tempSelection instanceof IStructuredSelection)) { + return null; + } + + selection = (IStructuredSelection) tempSelection; + + run(selection); + + return null; + } + + public void run(final IStructuredSelection selection) { this.logFileMetaData = null; this.logFileIsSupported = true; if (this.selection == null) { @@ -187,7 +201,7 @@ public class OpenStatisticalViewMenuAction extends Action implements IActionDele private void processLogFile() { try { - new ProgressMonitorDialog(new Shell(Display.getDefault())).run(false, false, new IRunnableWithProgress() { + new ProgressMonitorDialog(null).run(false, false, new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { OpenStatisticalViewMenuAction.this.monitor = monitor; @@ -224,7 +238,7 @@ public class OpenStatisticalViewMenuAction extends Action implements IActionDele Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openInformation(new Shell(Display.getDefault()), + MessageDialog.openInformation(null, Messages.getString("OpenStatisticalViewMenuAction.2"), Messages.getString("OpenStatisticalViewMenuAction.1")); } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenTextTableProjectsViewMenuAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenTextTableProjectsViewMenuAction.java index a40fc1bc39..1152591d1b 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenTextTableProjectsViewMenuAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/OpenTextTableProjectsViewMenuAction.java @@ -11,29 +11,30 @@ import java.io.File; import java.util.Observable; import java.util.Observer; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.IActionDelegate; - import org.eclipse.titan.log.viewer.extractors.TestCaseEvent; import org.eclipse.titan.log.viewer.parsers.data.TestCase; import org.eclipse.titan.log.viewer.utils.LogFileCacheHandler; -import org.eclipse.titan.log.viewer.utils.Messages; import org.eclipse.titan.log.viewer.utils.SelectionUtils; import org.eclipse.titan.log.viewer.views.text.table.TextTableViewHelper; +import org.eclipse.ui.IActionDelegate; +import org.eclipse.ui.handlers.HandlerUtil; /** * Menu action for opening the text table view from the Projects tab in the Navigator view * */ -public class OpenTextTableProjectsViewMenuAction extends Action implements IActionDelegate, Observer { +//TODO remove unnecessary functions after conversion +public class OpenTextTableProjectsViewMenuAction extends AbstractHandler implements IActionDelegate, Observer { - private static final String NAME = Messages.getString("OpenTextTableMenuAction.0"); //$NON-NLS-1$ private IStructuredSelection selection; private IProgressMonitor monitor; private int lastWorked; @@ -43,12 +44,29 @@ public class OpenTextTableProjectsViewMenuAction extends Action implements IActi * Constructor */ public OpenTextTableProjectsViewMenuAction() { - super(NAME); } @Override - public void run() { - if (this.selection == null) { + public void run(final IAction action) { + run(selection); + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection tempSelection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection(); + if (!(tempSelection instanceof IStructuredSelection)) { + return null; + } + + selection = (IStructuredSelection) tempSelection; + + run(selection); + + return null; + } + + public void run(final IStructuredSelection selection) { + if (selection == null) { return; } @@ -74,11 +92,6 @@ public class OpenTextTableProjectsViewMenuAction extends Action implements IActi } TextTableViewHelper.open(projectName, projectRelativePath, logRecordToSelect); } - - @Override - public void run(final IAction action) { - run(); - } @Override public void selectionChanged(final IAction action, final ISelection selection) { diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/TestCaseActionProvider.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/TestCaseActionProvider.java index e862daa6b1..eca3dd4821 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/TestCaseActionProvider.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/actions/TestCaseActionProvider.java @@ -16,11 +16,11 @@ import org.eclipse.ui.navigator.ICommonActionExtensionSite; public class TestCaseActionProvider extends CommonActionProvider { - private OpenMSCViewMenuAction openTestCaseAction; + private OpenMSCViewAction openTestCaseAction; @Override public void init(final ICommonActionExtensionSite site) { - openTestCaseAction = new OpenMSCViewMenuAction(); + openTestCaseAction = new OpenMSCViewAction(); } @Override diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/exceptions/TitanLogExceptionHandler.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/exceptions/TitanLogExceptionHandler.java index 6d234f2e17..9e53911be8 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/exceptions/TitanLogExceptionHandler.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/exceptions/TitanLogExceptionHandler.java @@ -9,7 +9,6 @@ package org.eclipse.titan.log.viewer.exceptions; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.utils.Constants; import org.eclipse.titan.log.viewer.utils.Messages; @@ -39,7 +38,7 @@ public final class TitanLogExceptionHandler { display.asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), Messages.getString("TitanLogExceptionHandler.0"), userException.getMessage()); + MessageDialog.openError(null, Messages.getString("TitanLogExceptionHandler.0"), userException.getMessage()); } }); } else if (exception instanceof TechnicalException) { @@ -47,7 +46,7 @@ public final class TitanLogExceptionHandler { display.asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), Messages.getString("TitanLogExceptionHandler.1"), technicalException.getMessage()); + MessageDialog.openError(null, Messages.getString("TitanLogExceptionHandler.1"), technicalException.getMessage()); ErrorReporter.logExceptionStackTrace(technicalException); } }); @@ -56,7 +55,7 @@ public final class TitanLogExceptionHandler { display.asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), Messages.getString("TitanLogExceptionHandler.2"), otherException.getMessage()); + MessageDialog.openError(null, Messages.getString("TitanLogExceptionHandler.2"), otherException.getMessage()); ErrorReporter.logExceptionStackTrace(otherException); } }); diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/preferences/pages/DecipheringPreferencePage.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/preferences/pages/DecipheringPreferencePage.java index d9f6314bae..93ddbf13d4 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/preferences/pages/DecipheringPreferencePage.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/preferences/pages/DecipheringPreferencePage.java @@ -202,7 +202,7 @@ public class DecipheringPreferencePage extends LogViewerPreferenceRootPage { @Override public void run() { MessageDialog.openError( - new Shell(Display.getDefault()), + null, "Invalid file", "The file can not be found"); } @@ -218,7 +218,7 @@ public class DecipheringPreferencePage extends LogViewerPreferenceRootPage { @Override public void run() { MessageDialog.openError( - new Shell(Display.getDefault()), + null, "Error while importing the rulesets", e.getMessage()); } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/ImportExportUtils.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/ImportExportUtils.java index cd9428d59a..3332460973 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/ImportExportUtils.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/ImportExportUtils.java @@ -9,15 +9,6 @@ package org.eclipse.titan.log.viewer.utils; import static org.eclipse.titan.common.utils.StringUtils.isNullOrEmpty; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -30,12 +21,30 @@ import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; +import org.eclipse.titan.common.logging.ErrorReporter; +import org.eclipse.titan.common.utils.IOUtils; +import org.eclipse.titan.common.utils.Joiner; +import org.eclipse.titan.log.viewer.exceptions.TechnicalException; +import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; +import org.eclipse.titan.log.viewer.preferences.PreferenceConstants; +import org.eclipse.titan.log.viewer.preferences.PreferencesHandler; +import org.eclipse.titan.log.viewer.preferences.data.KeywordColor; import org.eclipse.ui.PlatformUI; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; @@ -46,15 +55,6 @@ import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import org.eclipse.titan.common.logging.ErrorReporter; -import org.eclipse.titan.common.utils.IOUtils; -import org.eclipse.titan.common.utils.Joiner; -import org.eclipse.titan.log.viewer.exceptions.TechnicalException; -import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; -import org.eclipse.titan.log.viewer.preferences.PreferenceConstants; -import org.eclipse.titan.log.viewer.preferences.PreferencesHandler; -import org.eclipse.titan.log.viewer.preferences.data.KeywordColor; - /** * Helper class for import and export of preferences via xml files */ @@ -331,7 +331,7 @@ public final class ImportExportUtils { display.asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), + MessageDialog.openError(null, Messages.getString("ImportExportUtils.2"), Messages.getString("ImportExportUtils.4")); } }); @@ -374,7 +374,7 @@ public final class ImportExportUtils { display.asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openError(new Shell(Display.getDefault()), + MessageDialog.openError(null, Messages.getString("ImportExportUtils.2"), Messages.getString("ImportExportUtils.3")); } }); diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/LogFileCacheHandler.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/LogFileCacheHandler.java index 5b3d33ea50..d66281fc87 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/LogFileCacheHandler.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/utils/LogFileCacheHandler.java @@ -39,9 +39,9 @@ import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.utils.FileUtils; +import org.eclipse.titan.common.utils.IOUtils; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; import org.eclipse.titan.log.viewer.exceptions.UserException; @@ -55,8 +55,6 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.CommonNavigator; -import org.eclipse.titan.common.utils.IOUtils; - /** * This class is responsible for creating and updating the log file cache * @@ -619,7 +617,7 @@ public final class LogFileCacheHandler { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openInformation(new Shell(Display.getDefault()), + MessageDialog.openInformation(null, Messages.getString("OpenTextTableProjectsViewMenuAction.8"), Messages.getString("OpenTextTableProjectsViewMenuAction.9")); } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/MSCView.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/MSCView.java index abfd9b73cc..137d133d64 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/MSCView.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/MSCView.java @@ -540,6 +540,10 @@ public class MSCView extends ViewPart implements ILogViewerView { IAction switchToTextTable = new Action() { @Override public void run() { + if (logFileMetaData == null) { + return; + } + TextTableViewHelper.open(logFileMetaData.getProjectName(), logFileMetaData.getProjectRelativePath(), getSelectedRecordNumber()); } }; diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/StatisticalView.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/StatisticalView.java index f12eae2864..d99affb484 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/StatisticalView.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/StatisticalView.java @@ -44,29 +44,10 @@ import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IMemento; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.forms.events.ExpansionAdapter; -import org.eclipse.ui.forms.events.ExpansionEvent; -import org.eclipse.ui.forms.widgets.ExpandableComposite; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.ScrolledForm; -import org.eclipse.ui.forms.widgets.Section; -import org.eclipse.ui.forms.widgets.TableWrapData; -import org.eclipse.ui.forms.widgets.TableWrapLayout; -import org.eclipse.ui.part.ViewPart; - import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.common.utils.IOUtils; import org.eclipse.titan.log.viewer.Activator; -import org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction; +import org.eclipse.titan.log.viewer.actions.OpenMSCViewAction; import org.eclipse.titan.log.viewer.actions.OpenTextTableStatisticalViewMenuAction; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; @@ -82,6 +63,24 @@ import org.eclipse.titan.log.viewer.utils.Messages; import org.eclipse.titan.log.viewer.views.details.StatisticalData; import org.eclipse.titan.log.viewer.views.navigator.ProjectsViewerMenuListener; import org.eclipse.titan.log.viewer.views.navigator.ProjectsViewerMenuManager; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IMemento; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IViewReference; +import org.eclipse.ui.IViewSite; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.events.ExpansionAdapter; +import org.eclipse.ui.forms.events.ExpansionEvent; +import org.eclipse.ui.forms.widgets.ExpandableComposite; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.eclipse.ui.forms.widgets.Section; +import org.eclipse.ui.forms.widgets.TableWrapData; +import org.eclipse.ui.forms.widgets.TableWrapLayout; +import org.eclipse.ui.part.ViewPart; /** * This class represents the statistical view @@ -97,7 +96,7 @@ public class StatisticalView extends ViewPart implements ISelectionProvider, ILo private CachedLogReader reader = null; private static final int DEFAULT_COLUMN_WIDTH = 55; private static final int DEFAULT_AMOUNT_COLUMN_WIDTH = 75; - private OpenMSCViewMenuAction openMSCViewMenuAction; + private OpenMSCViewAction openMSCViewAction; private OpenTextTableStatisticalViewMenuAction openTextTableStatisticalViewMenuAction; private List<ISelectionChangedListener> registeredListeners; private TestCase testcaseSelection = null; @@ -440,10 +439,10 @@ public class StatisticalView extends ViewPart implements ISelectionProvider, ILo private void createStatisticalViewContextMenuActions() { - this.openMSCViewMenuAction = new OpenMSCViewMenuAction(); - this.openMSCViewMenuAction.setEnabled(false); - this.openMSCViewMenuAction.setImageDescriptor(Activator.getDefault().getCachedImageDescriptor(Constants.ICONS_MSC_VIEW)); - this.addSelectionChangedListener(openMSCViewMenuAction); + this.openMSCViewAction = new OpenMSCViewAction(); + this.openMSCViewAction.setEnabled(false); + this.openMSCViewAction.setImageDescriptor(Activator.getDefault().getCachedImageDescriptor(Constants.ICONS_MSC_VIEW)); + this.addSelectionChangedListener(openMSCViewAction); this.openTextTableStatisticalViewMenuAction = new OpenTextTableStatisticalViewMenuAction(this); this.openTextTableStatisticalViewMenuAction.setEnabled(false); @@ -470,7 +469,7 @@ public class StatisticalView extends ViewPart implements ISelectionProvider, ILo // MB_ADDITIONS must be added to the menuMgr or platform will // throw a part initialize exception, this will fix this menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - menuManager.add(this.openMSCViewMenuAction); + menuManager.add(this.openMSCViewAction); menuManager.add(this.openTextTableStatisticalViewMenuAction); } diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/SwitchToMscAction.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/SwitchToMscAction.java index 54ab23a4a8..e90ad4312e 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/SwitchToMscAction.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/SwitchToMscAction.java @@ -20,17 +20,16 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PlatformUI; - import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.Activator; -import org.eclipse.titan.log.viewer.actions.OpenMSCViewMenuAction; +import org.eclipse.titan.log.viewer.actions.OpenMSCViewAction; import org.eclipse.titan.log.viewer.extractors.TestCaseExtractor; import org.eclipse.titan.log.viewer.models.LogFileMetaData; import org.eclipse.titan.log.viewer.parsers.data.TestCase; import org.eclipse.titan.log.viewer.utils.Constants; import org.eclipse.titan.log.viewer.utils.LogFileCacheHandler; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; class SwitchToMscAction extends Action { private TextTableView textTableView; @@ -91,7 +90,7 @@ class SwitchToMscAction extends Action { return; } - final OpenMSCViewMenuAction openMSCAction = new OpenMSCViewMenuAction(); + final OpenMSCViewAction openMSCAction = new OpenMSCViewAction(); openMSCAction.selectionChanged(null, new StructuredSelection(testCases.get(testCaseNumber))); openMSCAction.setFirstRow(recordNumber); openMSCAction.run(); diff --git a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/TextTableViewHelper.java b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/TextTableViewHelper.java index a55fbd6474..bda22d447a 100644 --- a/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/TextTableViewHelper.java +++ b/org.eclipse.titan.log.viewer/src/org/eclipse/titan/log/viewer/views/text/table/TextTableViewHelper.java @@ -19,13 +19,6 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; - import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.log.viewer.exceptions.TechnicalException; import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler; @@ -37,6 +30,11 @@ import org.eclipse.titan.log.viewer.utils.Constants; import org.eclipse.titan.log.viewer.utils.LogFileCacheHandler; import org.eclipse.titan.log.viewer.utils.Messages; import org.eclipse.titan.log.viewer.views.MSCView; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IViewReference; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; public class TextTableViewHelper { /** @@ -82,7 +80,7 @@ public class TextTableViewHelper { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog.openInformation(new Shell(Display.getDefault()), "View can not be opened.", "Test case extraction is already running on " + logFile.getName()); + MessageDialog.openInformation(null, "View can not be opened.", "Test case extraction is already running on " + logFile.getName()); } }); return null; diff --git a/org.eclipse.titan.regressiontests/META-INF/MANIFEST.MF b/org.eclipse.titan.regressiontests/META-INF/MANIFEST.MF index 32cf471b2b..19913a91f5 100644 --- a/org.eclipse.titan.regressiontests/META-INF/MANIFEST.MF +++ b/org.eclipse.titan.regressiontests/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Test_fragment Fragment Bundle-SymbolicName: org.eclipse.titan.regressiontests;singleton:=true -Bundle-Version: 5.4.1.CRL_113_200_5_R4B_20151202-1100 -Fragment-Host: org.eclipse.titan.designer;bundle-version="5.4.1.CRL_113_200_5_R4B_20151202-1100" +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 +Fragment-Host: org.eclipse.titan.designer;bundle-version="5.4.3.CRL_113_200_5_R4D_20160301-1100" Require-Bundle: org.eclipse.ui, org.eclipse.core.resources, org.junit diff --git a/org.eclipse.titan.regressiontests/build.xml b/org.eclipse.titan.regressiontests/build.xml index f92f77c530..ce1db9a493 100644 --- a/org.eclipse.titan.regressiontests/build.xml +++ b/org.eclipse.titan.regressiontests/build.xml @@ -10,7 +10,7 @@ <project basedir="." default="build" name="org.eclipse.titan.regressiontests"> <property environment="env"/> <!-- The qualifier of the features --> - <property name="version" value="5.4.0.CRL_113_200_5_R4A"/> + <property name="version" value="5.4.3.CRL_113_200_5_R4D"/> <tstamp/> <property name="timestamp" value="${DSTAMP}-${TSTAMP}"/> <property name="version.qualifier" value="${version}_${timestamp}"/> @@ -19,8 +19,8 @@ <property name="ECLIPSE_HOME" value="/home/titanrt/eclipse_installed/eclipse-SDK-4.2-linux-gtk-x86_64"/> <property name="debuglevel" value="source,lines,vars"/> - <property name="target" value="1.6"/> - <property name="source" value="1.6"/> + <property name="target" value="1.8"/> + <property name="source" value="1.8"/> <path id="PDE.classpath"> <fileset dir="${ECLIPSE_HOME}/plugins"> <include name="*.jar"/> diff --git a/org.eclipse.titan.regressiontests/fragment.xml b/org.eclipse.titan.regressiontests/fragment.xml index 8950c411e8..e074582b22 100644 --- a/org.eclipse.titan.regressiontests/fragment.xml +++ b/org.eclipse.titan.regressiontests/fragment.xml @@ -1,48 +1,45 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?eclipse version="3.2"?> +<?eclipse version="4.4"?> <fragment> - <extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - id="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" - objectClass="org.eclipse.core.resources.IFile"> - <menu - id="TITAN_popup_Menu" - label="TITAN" - path="additions"> - <separator - name="group2"> - </separator> - </menu> - <action - class="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" - enablesFor="+" - id="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" - label="Generate checklist from file" - menubarPath="TITAN_popup_Menu/group2"> - </action> - </objectContribution> - </extension> - <extension - id="org.eclipse.titan.regressiontests.HeadlessRunner" - name="Headless runner" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titan.regressiontests.HeadlessRunner"> - </run> - </application> - </extension> + <extension point="org.eclipse.ui.commands"> + <command + defaultHandler="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" + id="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" + name="Generate checklist from file" /> + </extension> + <extension point="org.eclipse.ui.menus"> + <menuContribution + locationURI="popup:org.eclipse.titan.designer.TitanMenu?endof=additions"> + <command + commandId="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" + id="org.eclipse.titan.regressiontests.tools.ChecklistGenerator" + label="Generate checklist from file" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <adapt type="org.eclipse.core.resources.IFile"> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + </menuContribution> + </extension> + <extension id="org.eclipse.titan.regressiontests.HeadlessRunner" + name="Headless runner" point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titan.regressiontests.HeadlessRunner"> + </run> + </application> + </extension> </fragment> diff --git a/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/AST_tests.java b/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/AST_tests.java index 3e686d0041..ae580baf34 100644 --- a/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/AST_tests.java +++ b/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/AST_tests.java @@ -1316,7 +1316,7 @@ public class AST_tests { markersToCheck.add(new MarkerToCheck("The second operand of operation `create()' should be a charstring value", lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("There is no visible definition with name `nonExi' in module `expression_tests'", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Operation `create' should refer to a component type instead of constant `@expression_tests.cg_boolean'", ++lineNum, IMarker.SEVERITY_ERROR)); - markersToCheck.add(new MarkerToCheck("Invalid field reference `nonExi': type `@expression_tests.componentName_CT' does not have fields.", ++lineNum, IMarker.SEVERITY_ERROR)); + markersToCheck.add(new MarkerToCheck("Referencing fields of a component is not allowed", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Type mismatch: reference to a component type was expected in operation `create' instead of `@expression_tests.myrecof1'", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Incompatible component type: operation `create' should refer to `@expression_tests.componentName_CT2' instaed of `@expression_tests.componentName_CT'", ++lineNum, IMarker.SEVERITY_ERROR)); lineNum += 5; @@ -6806,7 +6806,7 @@ public class AST_tests { lineNum += 1; for (i = 0; i < 4; i++) { markersToCheck.add(new MarkerToCheck("Component value was expected", lineNum++, IMarker.SEVERITY_ERROR)); } lineNum += 2; - markersToCheck.add(new MarkerToCheck("Invalid field reference `nonExi': type `@value_tests.mycomponent' does not have fields.", lineNum, IMarker.SEVERITY_ERROR)); + markersToCheck.add(new MarkerToCheck("Referencing fields of a component is not allowed", lineNum, IMarker.SEVERITY_ERROR)); lineNum += 1; for (i = 0; i < 3; i++) { markersToCheck.add(new MarkerToCheck("Type `@value_tests.mycomponent' can not be indexed", lineNum++, IMarker.SEVERITY_ERROR)); } markersToCheck.add(new MarkerToCheck("Invalid field reference `nonExi': type `@value_tests.mycomponent' does not have fields.", lineNum, IMarker.SEVERITY_ERROR)); @@ -7142,7 +7142,6 @@ public class AST_tests { markersToCheck.add(new MarkerToCheck("Value list notation cannot be used for set type `@value_tests.mysetType'", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Too many elements in value list notation for type `@value_tests.myrecordType': 3 was expected instead of 5", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Duplicate index value `1' for components 2 and 3", ++lineNum, IMarker.SEVERITY_ERROR)); - markersToCheck.add(new MarkerToCheck("Too few elements in the array value: 6 was expected instead of 3", lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("There is no visible definition with name `nonExi' in module `value_tests'", ++lineNum, IMarker.SEVERITY_ERROR)); markersToCheck.add(new MarkerToCheck("Too many elements in the array value: 0 was expected instead of 1", lineNum, IMarker.SEVERITY_ERROR)); lineNum += 2; diff --git a/org.eclipse.titanium.regressiontests/fragment.xml b/org.eclipse.titanium.regressiontests/fragment.xml index 1eb5e64780..faf65055c5 100644 --- a/org.eclipse.titanium.regressiontests/fragment.xml +++ b/org.eclipse.titanium.regressiontests/fragment.xml @@ -1,36 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?eclipse version="3.4"?> +<?eclipse version="4.4"?> <fragment> - <!--<extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - id="org.eclipse.titanium.regressiontests.tools.ChecklistGenerator" - objectClass="org.eclipse.core.resources.IFile"> - <menu - id="org.eclipse.titanium.menu.ProjectMenu" - label="Titanium testing" - path="additions"> - <separator - name="group2"> - </separator> - </menu> - <action - class="org.eclipse.titanium.regressiontests.tools.ChecklistGenerator" - enablesFor="+" - id="org.eclipse.titanium.regressiontests.tools.ChecklistGenerator" - label="Generate checklist from file" - menubarPath="org.eclipse.titanium.menu.ProjectMenu/group2"> - </action> - </objectContribution> - </extension>--> <extension point="org.eclipse.ui.menus"> <menuContribution diff --git a/org.eclipse.titanium/META-INF/MANIFEST.MF b/org.eclipse.titanium/META-INF/MANIFEST.MF index 18d02f7e74..c6e70d946c 100644 --- a/org.eclipse.titanium/META-INF/MANIFEST.MF +++ b/org.eclipse.titanium/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Titanium Bundle-SymbolicName: org.eclipse.titanium;singleton:=true -Bundle-Version: 5.4.2.CRL_113_200_5_R4C_20160105-1100 +Bundle-Version: 5.4.3.CRL_113_200_5_R4D_20160301-1100 Bundle-Activator: org.eclipse.titanium.Activator Bundle-Vendor: Eclipse Titan Project Require-Bundle: org.eclipse.ui, @@ -14,8 +14,8 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ltk.core.refactoring, org.eclipse.ui.forms, - org.eclipse.titan.common;bundle-version="5.4.2", - org.eclipse.titan.designer;bundle-version="5.4.2", + org.eclipse.titan.common;bundle-version="5.4.3", + org.eclipse.titan.designer;bundle-version="5.4.3", org.eclipse.core.filesystem;bundle-version="1.3.200", org.eclipse.core.resources, org.apache.poi;bundle-version="3.9.0" diff --git a/org.eclipse.titanium/plugin.xml b/org.eclipse.titanium/plugin.xml index 1319cf1caf..604b8c097f 100644 --- a/org.eclipse.titanium/plugin.xml +++ b/org.eclipse.titanium/plugin.xml @@ -1,642 +1,449 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?eclipse version="3.4"?> +<?eclipse version="4.4"?> <plugin> <!-- Popup menu in the browser view --> - <!-- extensions of the graph part--> - <extension - point="org.eclipse.ui.editors"> - <editor - class="org.eclipse.titanium.graph.gui.windows.ModuleGraphEditor" - contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor" - default="false" - icon="resources/icons/titan.gif" - id="org.eclipse.titanium.graph.editors.ModuleGraphEditor" - name="module dependency graph"> + <!-- extensions of the graph part --> + <extension point="org.eclipse.ui.editors"> + <editor class="org.eclipse.titanium.graph.gui.windows.ModuleGraphEditor" + contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor" + default="false" icon="resources/icons/titan.gif" + id="org.eclipse.titanium.graph.editors.ModuleGraphEditor" name="module dependency graph"> </editor> <editor - class="org.eclipse.titanium.graph.gui.windows.ComponentGraphEditor" - contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor" - default="false" - icon="resources/icons/titan.gif" - id="org.eclipse.titanium.graph.editors.ComponentGraphEditor" - name="component dependency graph"> + class="org.eclipse.titanium.graph.gui.windows.ComponentGraphEditor" + contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor" + default="false" icon="resources/icons/titan.gif" + id="org.eclipse.titanium.graph.editors.ComponentGraphEditor" name="component dependency graph"> </editor> </extension> - <extension - point="org.eclipse.ui.views"> - <category - id="org.eclipse.titanium" - name="Titanium"> + <extension point="org.eclipse.ui.views"> + <category id="org.eclipse.titanium" name="Titanium"> </category> - <view - allowMultiple="false" - category="org.eclipse.titanium" - class="org.eclipse.titanium.graph.gui.windows.SatelliteView" - icon="resources/icons/titan.gif" - id="org.eclipse.titanium.graph.gui.windows.SatelliteView" - name="Satellite View" - restorable="true"> + <view allowMultiple="false" category="org.eclipse.titanium" + class="org.eclipse.titanium.graph.gui.windows.SatelliteView" icon="resources/icons/titan.gif" + id="org.eclipse.titanium.graph.gui.windows.SatelliteView" name="Satellite View" + restorable="true"> </view> </extension> - - <!-- Metrics, code smell markers and organize import --> - <extension - id="org.eclipse.titanium.applications.ClearAllProjects" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.ClearAllProjects"> - </run> - </application> + + <!-- Metrics, code smell markers and organize import --> + <extension id="org.eclipse.titanium.applications.ClearAllProjects" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.ClearAllProjects"> + </run> + </application> </extension> - <extension - id="org.eclipse.titanium.applications.ImportProjectsFromPrj" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.ImportProjectsFromPrj"> - </run> - </application> + <extension id="org.eclipse.titanium.applications.ImportProjectsFromPrj" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.ImportProjectsFromPrj"> + </run> + </application> </extension> - <extension - id="org.eclipse.titanium.applications.ImportProjectsFromTpd" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.ImportProjectsFromTpd"> - </run> - </application> + <extension id="org.eclipse.titanium.applications.ImportProjectsFromTpd" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.ImportProjectsFromTpd"> + </run> + </application> </extension> - <extension - id="org.eclipse.titanium.applications.ExportAllCodeSmells" + <extension id="org.eclipse.titanium.applications.ExportAllCodeSmells" point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" + <application cardinality="singleton-global" thread="main" visible="true"> - <run - class="org.eclipse.titanium.applications.ExportAllCodeSmells"> + <run class="org.eclipse.titanium.applications.ExportAllCodeSmells"> </run> - </application> + </application> </extension> <extension id="org.eclipse.titanium.applications.ExportAllCodeSmellsToCSV" point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" + <application cardinality="singleton-global" thread="main" visible="true"> - <run - class="org.eclipse.titanium.applications.ExportAllCodeSmellsToCSV"> - </run> - </application> + <run class="org.eclipse.titanium.applications.ExportAllCodeSmellsToCSV"> + </run> + </application> </extension> <extension id="org.eclipse.titanium.applications.MergeExportedMarkerTables" point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" + <application cardinality="singleton-global" thread="main" visible="true"> - <run - class="org.eclipse.titanium.applications.MergeExportedMarkerTables"> + <run class="org.eclipse.titanium.applications.MergeExportedMarkerTables"> </run> </application> </extension> - <extension - id="org.eclipse.titanium.applications.ExportDataForSonar" + <extension id="org.eclipse.titanium.applications.ExportDataForSonar" point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" + <application cardinality="singleton-global" thread="main" visible="true"> - <run - class="org.eclipse.titanium.applications.ExportDataForSonar"> + <run class="org.eclipse.titanium.applications.ExportDataForSonar"> </run> </application> </extension> - + <!-- Preference pages --> - <extension - point="org.eclipse.core.runtime.preferences"> - <initializer class="org.eclipse.titanium.preferences.PreferenceInitializer"/> + <extension point="org.eclipse.core.runtime.preferences"> + <initializer + class="org.eclipse.titanium.preferences.PreferenceInitializer" /> </extension> <extension point="org.eclipse.ui.preferencePages"> <page id="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" class="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" - name="Titanium Preferences"/> + name="Titanium Preferences" /> <page id="org.eclipse.titanium.preferences.pages.OrganizeImportPreferencePage" class="org.eclipse.titanium.preferences.pages.OrganizeImportPreferencePage" name="Imports" - category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage"/> - <page - id="org.eclipse.titanium.preferences.pages.MetricsPreferencePage" + category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" /> + <page id="org.eclipse.titanium.preferences.pages.MetricsPreferencePage" class="org.eclipse.titanium.preferences.pages.MetricsPreferencePage" name="Metrics" - category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage"/> - <page - id="org.eclipse.titanium.preferences.pages.MarkersPreferencePage" + category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" /> + <page id="org.eclipse.titanium.preferences.pages.MarkersPreferencePage" class="org.eclipse.titanium.preferences.pages.MarkersPreferencePage" name="Code smells" - category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage"/> + category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" /> <page id="org.eclipse.titanium.preferences.pages.RiskFactorPreferencePage" class="org.eclipse.titanium.preferences.pages.RiskFactorPreferencePage" name="Project risk factor" - category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage"/> + category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" /> <page id="org.eclipse.titanium.preferences.pages.MetricsLimitPreferencePage" class="org.eclipse.titanium.preferences.pages.MetricsLimitPreferencePage" name="Limits" - category="org.eclipse.titanium.preferences.pages.MetricsPreferencePage"/> + category="org.eclipse.titanium.preferences.pages.MetricsPreferencePage" /> <page id="org.eclipse.titanium.preferences.pages.MetricsViewPreferencePage" class="org.eclipse.titanium.preferences.pages.MetricsViewPreferencePage" name="Metrics view" - category="org.eclipse.titanium.preferences.pages.MetricsPreferencePage"/> + category="org.eclipse.titanium.preferences.pages.MetricsPreferencePage" /> <page id="org.eclipse.titanium.preferences.pages.ModuleGraphPreferencePage" class="org.eclipse.titanium.preferences.pages.GraphMetricsPage" - name="Metrics" - category="org.eclipse.titanium.preferences.pages.GraphPreferencePage"/> - <page - id="org.eclipse.titanium.preferences.pages.GraphPreferencePage" + name="Metrics" category="org.eclipse.titanium.preferences.pages.GraphPreferencePage" /> + <page id="org.eclipse.titanium.preferences.pages.GraphPreferencePage" class="org.eclipse.titanium.preferences.pages.GraphPreferencePage" name="Graph" - category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage"/> - <page - id="org.eclipse.titanium.ClusterCategory" + category="org.eclipse.titanium.preferences.pages.TitaniumPreferencePage" /> + <page id="org.eclipse.titanium.ClusterCategory" class="org.eclipse.titanium.preferences.pages.GraphClusterPage" - name="Clusters" - category="org.eclipse.titanium.preferences.pages.GraphPreferencePage"/> + name="Clusters" category="org.eclipse.titanium.preferences.pages.GraphPreferencePage" /> <page id="org.eclipse.titanium.preferences.pages.GraphClusterFolderNamePage" class="org.eclipse.titanium.preferences.pages.GraphClusterFolderNamePage" - name="Using module location" - category="org.eclipse.titanium.ClusterCategory"/> + name="Using module location" category="org.eclipse.titanium.ClusterCategory" /> <page id="org.eclipse.titanium.preferences.pages.GraphClusterRegexpPage" class="org.eclipse.titanium.preferences.pages.GraphClusterRegexpPage" - name="Using regular expressions" - category="org.eclipse.titanium.ClusterCategory"/> - <page - id="org.eclipse.titanium.preferences.pages.GraphClusterAutoPage" + name="Using regular expressions" category="org.eclipse.titanium.ClusterCategory" /> + <page id="org.eclipse.titanium.preferences.pages.GraphClusterAutoPage" class="org.eclipse.titanium.preferences.pages.GraphClusterAutoPage" - name="Automatic method" - category="org.eclipse.titanium.ClusterCategory"/> + name="Automatic method" category="org.eclipse.titanium.ClusterCategory" /> <page id="org.eclipse.titanium.preferences.pages.GraphClusterModuleNamePage" class="org.eclipse.titanium.preferences.pages.GraphClusterModuleNamePage" - name="Using module names" - category="org.eclipse.titanium.ClusterCategory"/> - <page - category="org.eclipse.titanium.preferences.pages.MarkersPreferencePage" - class="org.eclipse.titanium.preferences.pages.RepairTimePage" - id="org.eclipse.titanium.preferences.pages.RepairTimePage" - name="Code smell repair times"> + name="Using module names" category="org.eclipse.titanium.ClusterCategory" /> + <page category="org.eclipse.titanium.preferences.pages.MarkersPreferencePage" + class="org.eclipse.titanium.preferences.pages.RepairTimePage" id="org.eclipse.titanium.preferences.pages.RepairTimePage" + name="Code smell repair times"> </page> </extension> - <extension - point="org.eclipse.ui.preferenceTransfer"> - <transfer - icon="resources/icons/titan.gif" - name="Titanium preferences" + <extension point="org.eclipse.ui.preferenceTransfer"> + <transfer icon="resources/icons/titan.gif" name="Titanium preferences" id="org.eclipse.titanium.preferences.export.all"> <mapping scope="instance"> - <entry node="org.eclipse.titanium"/> + <entry node="org.eclipse.titanium" /> </mapping> <description> -Export preferences of Titanium, including setting of - - organize import - - code smells - - source code metrics + Export preferences of Titanium, including setting of + - organize import + - code smells + - source code metrics </description> </transfer> </extension> - + <!-- Commands --> - <extension - point="org.eclipse.ui.commands"> - <category - id="org.eclipse.titanium.commands.Commands" - name="Titanium commands"/> - <command - categoryId="org.eclipse.titanium.commands.Commands" + <extension point="org.eclipse.ui.commands"> + <category id="org.eclipse.titanium.commands.Commands" name="Titanium commands" /> + <command categoryId="org.eclipse.titanium.commands.Commands" description="Add necessary and remove unused imports. Effects of this action can be tuned in the Titanium > Imports preference page." - id="org.eclipse.titanium.commands.OrganizeImportsCommand" - name="Organize imports"/> - <command - categoryId="org.eclipse.titanium.commands.Commands" - description="Check a module for code smells" - id="org.eclipse.titanium.commands.CheckCodeSmellsCommand" + id="org.eclipse.titanium.commands.OrganizeImportsCommand" name="Organize imports" /> + <command categoryId="org.eclipse.titanium.commands.Commands" + description="Check a module for code smells" id="org.eclipse.titanium.commands.CheckCodeSmellsCommand" defaultHandler="org.eclipse.titanium.actions.CheckCodeSmells" - name="Check code smells"/> - <command - categoryId="org.eclipse.titanium.commands.Commands" - description="Search for graph node" - id="org.eclipse.titanium.commands.GraphSearch" - name="Graph Search"> + name="Check code smells" /> + <command categoryId="org.eclipse.titanium.commands.Commands" + description="Search for graph node" id="org.eclipse.titanium.commands.GraphSearch" + name="Graph Search"> </command> - <command - categoryId="org.eclipse.titanium.commands.Commands" - description="Save graph to pajek" - id="org.eclipse.titanium.commands.GraphSave" - name="GraphSave"> + <command categoryId="org.eclipse.titanium.commands.Commands" + description="Save graph to pajek" id="org.eclipse.titanium.commands.GraphSave" + name="GraphSave"> </command> - <command - categoryId="org.eclipse.titanium.commands.Commands" - description="Export of graph to image" - id="org.eclipse.titanium.commands.GraphExport" - name="GraphExport"> + <command categoryId="org.eclipse.titanium.commands.Commands" + description="Export of graph to image" id="org.eclipse.titanium.commands.GraphExport" + name="GraphExport"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.ModuleGraphAction" - id="org.eclipse.titanium.actions.ModuleGraphAction" - name="GenerateModuleGraph"> + <command defaultHandler="org.eclipse.titanium.actions.ModuleGraphAction" + id="org.eclipse.titanium.actions.ModuleGraphAction" name="GenerateModuleGraph"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.ComponentGraphAction" - id="org.eclipse.titanium.actions.ComponentGraphAction" - name="GenerateComponentGraph"> + <command defaultHandler="org.eclipse.titanium.actions.ComponentGraphAction" + id="org.eclipse.titanium.actions.ComponentGraphAction" name="GenerateComponentGraph"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.ExportProblems" - id="org.eclipse.titanium.actions.ExportProblems" - name="ExportMarkers"> + <command defaultHandler="org.eclipse.titanium.actions.ExportProblems" + id="org.eclipse.titanium.actions.ExportProblems" name="ExportMarkers"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.ExportDataForSonarAction" - id="org.eclipse.titanium.actions.ExportDataForSonarAction" - name="ExportDataForSonarAction"> + <command defaultHandler="org.eclipse.titanium.actions.ExportDataForSonarAction" + id="org.eclipse.titanium.actions.ExportDataForSonarAction" name="ExportDataForSonarAction"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.MetricsViewOpener" - id="org.eclipse.titanium.actions.ViewMetrics" - name="ViewMetrics"> + <command defaultHandler="org.eclipse.titanium.actions.MetricsViewOpener" + id="org.eclipse.titanium.actions.ViewMetrics" name="ViewMetrics"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.TopViewOpener" - id="org.eclipse.titanium.actions.ViewTopRiskMetrics" - name="ViewTopRiskMetrics"> + <command defaultHandler="org.eclipse.titanium.actions.TopViewOpener" + id="org.eclipse.titanium.actions.ViewTopRiskMetrics" name="ViewTopRiskMetrics"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.OrganizeFromBrowser" - id="org.eclipse.titanium.actions.OrganizeFromBrowser" - name="OrganizeFromBrowser"> + <command defaultHandler="org.eclipse.titanium.actions.OrganizeFromBrowser" + id="org.eclipse.titanium.actions.OrganizeFromBrowser" name="OrganizeFromBrowser"> </command> - <command - defaultHandler="org.eclipse.titanium.actions.OrganizeFromEditor" - id="org.eclipse.titanium.commands.OrganizeImports" - name="OrganizeImports"> + <command defaultHandler="org.eclipse.titanium.actions.OrganizeFromEditor" + id="org.eclipse.titanium.commands.OrganizeImports" name="OrganizeImports"> </command> </extension> - + <!-- Key bindings --> - <extension - point="org.eclipse.ui.bindings"> - <key - commandId="org.eclipse.titanium.commands.OrganizeImportsCommand" + <extension point="org.eclipse.ui.bindings"> + <key commandId="org.eclipse.titanium.commands.OrganizeImportsCommand" contextId="org.eclipse.titan.designer.editors.TTCN3EditorScope" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+SHIFT+O"/> - <key - commandId="org.eclipse.titanium.commands.GraphSearch" - contextId="org.eclipse.titanium.contexts.GraphContext" - schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+F"> + sequence="CTRL+SHIFT+O" /> + <key commandId="org.eclipse.titanium.commands.GraphSearch" + contextId="org.eclipse.titanium.contexts.GraphContext" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+F"> </key> - <key - commandId="org.eclipse.titanium.commands.GraphSave" - contextId="org.eclipse.titanium.contexts.GraphContext" - schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+S"> + <key commandId="org.eclipse.titanium.commands.GraphSave" + contextId="org.eclipse.titanium.contexts.GraphContext" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+S"> </key> - <key - commandId="org.eclipse.titanium.commands.GraphExport" - contextId="org.eclipse.titanium.contexts.GraphContext" - schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" - sequence="CTRL+E"> + <key commandId="org.eclipse.titanium.commands.GraphExport" + contextId="org.eclipse.titanium.contexts.GraphContext" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+E"> </key> </extension> - - <!-- Editor actions --> - - <!-- Views--> - <extension - point="org.eclipse.ui.views"> - <view - id="org.eclipse.titanium.metrics.view" - name="Metrics View" - icon="resources/icons/metrics_view.gif" - class="org.eclipse.titanium.metrics.view.MetricsView" - category="org.eclipse.titanium"/> - <view - id="org.eclipse.titanium.metrics.topview" - name="Top riskiest modules" - icon="resources/icons/metrics_top_worst.gif" - class="org.eclipse.titanium.metrics.topview.TopView" - category="org.eclipse.titanium"/> + + <!-- Editor actions --> + + <!-- Views --> + <extension point="org.eclipse.ui.views"> + <view id="org.eclipse.titanium.metrics.view" name="Metrics View" + icon="resources/icons/metrics_view.gif" class="org.eclipse.titanium.metrics.view.MetricsView" + category="org.eclipse.titanium" /> + <view id="org.eclipse.titanium.metrics.topview" name="Top riskiest modules" + icon="resources/icons/metrics_top_worst.gif" class="org.eclipse.titanium.metrics.topview.TopView" + category="org.eclipse.titanium" /> </extension> - <extension - point="org.eclipse.core.resources.markers" - id="org.eclipse.titanium.markers.CodeSmellMarker" - name="Titanium code smells"> - <super type="org.eclipse.core.resources.problemmarker"/> - <attribute name="problem"/> + <extension point="org.eclipse.core.resources.markers" + id="org.eclipse.titanium.markers.CodeSmellMarker" name="Titanium code smells"> + <super type="org.eclipse.core.resources.problemmarker" /> + <attribute name="problem" /> </extension> - <extension - point="org.eclipse.core.resources.markers" - id="org.eclipse.titanium.markers.ProjectCodeSmellMarker" - name="Titanium code smells (global to project)"> - <super type="org.eclipse.titanium.markers.CodeSmellMarker"/> - <attribute name="problem"/> + <extension point="org.eclipse.core.resources.markers" + id="org.eclipse.titanium.markers.ProjectCodeSmellMarker" name="Titanium code smells (global to project)"> + <super type="org.eclipse.titanium.markers.CodeSmellMarker" /> + <attribute name="problem" /> </extension> - <extension - point="org.eclipse.core.resources.markers" - id="org.eclipse.titanium.markers.ModuleCodeSmellMarker" - name="Titanium code smells (local to a module)"> - <super type="org.eclipse.titanium.markers.CodeSmellMarker"/> - <attribute name="problem"/> + <extension point="org.eclipse.core.resources.markers" + id="org.eclipse.titanium.markers.ModuleCodeSmellMarker" name="Titanium code smells (local to a module)"> + <super type="org.eclipse.titanium.markers.CodeSmellMarker" /> + <attribute name="problem" /> </extension> - - <extension - id="org.eclipse.titanium.applications.SaveModuleNet" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.SaveModuleNet"> - </run> + + <extension id="org.eclipse.titanium.applications.SaveModuleNet" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.SaveModuleNet"> + </run> </application> </extension> - <extension - point="org.eclipse.titan.designer.extensions.post_analyze"> - <client - class="org.eclipse.titanium.markers.utils.ExecuteAnalyzer"> + <extension point="org.eclipse.titan.designer.extensions.post_analyze"> + <client class="org.eclipse.titanium.markers.utils.ExecuteAnalyzer"> </client> </extension> <extension point="org.eclipse.help.toc"> - <toc file="toc.xml" primary="true"/> + <toc file="toc.xml" primary="true" /> </extension> - <extension - point="org.eclipse.ui.contexts"> - <context - id="org.eclipse.titanium.contexts.GraphContext" - name="GraphEditorContext" - parentId="org.eclipse.ui.contexts.window"> - </context> + <extension point="org.eclipse.ui.contexts"> + <context id="org.eclipse.titanium.contexts.GraphContext" + name="GraphEditorContext" parentId="org.eclipse.ui.contexts.window"> + </context> </extension> - <extension - id="org.eclipse.titanium.applications.SaveComponentNet" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.SaveComponentNet"> - </run> - </application> + <extension id="org.eclipse.titanium.applications.SaveComponentNet" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.SaveComponentNet"> + </run> + </application> </extension> - <extension - point="org.eclipse.ui.menus"> - <menuContribution - locationURI="popup:org.eclipse.ui.popup.any?after=additions"> - <menu - id="org.eclipse.titanium.menu.ProjectMenu2" - label="Titanium"> - <command - commandId="org.eclipse.titanium.actions.OrganizeFromBrowser" - label="Organize imports" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IResource"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <separator - name="metrics" - visible="true"> - </separator> - <command - commandId="org.eclipse.titanium.actions.ViewMetrics" - label="View metrics" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titanium.actions.ViewTopRiskMetrics" - label="View top risk metrics" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <separator - name="marker" - visible="true"> - </separator> - <command - commandId="org.eclipse.titanium.actions.ExportProblems" - label="Export problem markers to xls" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IResource"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titanium.actions.ExportDataForSonarAction" - label="Export data for SonarQube" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <separator - name="graph" - visible="true"> - </separator> - <command - commandId="org.eclipse.titanium.actions.ModuleGraphAction" - label="Draw module structure" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - <command - commandId="org.eclipse.titanium.actions.ComponentGraphAction" - label="Draw component structure" - mode="FORCE_TEXT"> - <visibleWhen - checkEnabled="false"> - <with - variable="selection"> - <iterate - operator="or"> - <adapt - type="org.eclipse.core.resources.IProject"> - <test - property="org.eclipse.core.resources.projectNature" - value="org.eclipse.titan.designer.core.TITANNature"> - </test> - </adapt> - </iterate> - </with> - </visibleWhen> - </command> - </menu> - </menuContribution> - <menuContribution - allPopups="true" - locationURI="popup:org.eclipse.titan.designer.editors.ttcn3editor.context?after=additions"> - <menu - label="Titanium"> - <command - commandId="org.eclipse.titanium.commands.OrganizeImports" - icon="resources/icons/titan.gif" - id="org.eclipse.titanium.commands.OrganizeImports" - label="Organize imports"> - </command> - </menu> - </menuContribution> - <menuContribution - allPopups="true" - locationURI="popup:org.eclipse.titan.designer.editors.ttcn3ppeditor.context?after=additions"> - <menu - label="Titanium"> - <command - commandId="org.eclipse.titanium.commands.OrganizeImports" - icon="resources/icons/titan.gif" - id="org.eclipse.titanium.commands.OrganizeImports" - label="Organize imports"> - </command> - </menu> - </menuContribution> + <extension point="org.eclipse.ui.menus"> + <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> + <menu id="org.eclipse.titanium.menu.ProjectMenu2" label="Titanium"> + <command commandId="org.eclipse.titanium.actions.OrganizeFromBrowser" + label="Organize imports" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IResource"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <separator name="metrics" visible="true"> + </separator> + <command commandId="org.eclipse.titanium.actions.ViewMetrics" + label="View metrics" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titanium.actions.ViewTopRiskMetrics" + label="View top risk metrics" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <separator name="marker" visible="true"> + </separator> + <command commandId="org.eclipse.titanium.actions.ExportProblems" + label="Export problem markers to xls" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IResource"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titanium.actions.ExportDataForSonarAction" + label="Export data for SonarQube" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <separator name="graph" visible="true"> + </separator> + <command commandId="org.eclipse.titanium.actions.ModuleGraphAction" + label="Draw module structure" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + <command commandId="org.eclipse.titanium.actions.ComponentGraphAction" + label="Draw component structure" mode="FORCE_TEXT"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <iterate operator="or"> + <adapt type="org.eclipse.core.resources.IProject"> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.titan.designer.core.TITANNature"> + </test> + </adapt> + </iterate> + </with> + </visibleWhen> + </command> + </menu> + </menuContribution> + <menuContribution allPopups="true" + locationURI="popup:org.eclipse.titan.designer.editors.ttcn3editor.context?after=additions"> + <menu label="Titanium"> + <command commandId="org.eclipse.titanium.commands.OrganizeImports" + icon="resources/icons/titan.gif" id="org.eclipse.titanium.commands.OrganizeImports" + label="Organize imports"> + </command> + </menu> + </menuContribution> + <menuContribution allPopups="true" + locationURI="popup:org.eclipse.titan.designer.editors.ttcn3ppeditor.context?after=additions"> + <menu label="Titanium"> + <command commandId="org.eclipse.titanium.commands.OrganizeImports" + icon="resources/icons/titan.gif" id="org.eclipse.titanium.commands.OrganizeImports" + label="Organize imports"> + </command> + </menu> + </menuContribution> </extension> - <extension - id="org.eclipse.titanium.applications.SaveModuleDot" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.SaveModuleDot"> - </run> - </application> + <extension id="org.eclipse.titanium.applications.SaveModuleDot" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.SaveModuleDot"> + </run> + </application> </extension> - <extension - id="org.eclipse.titanium.applications.SaveComponentDot" - point="org.eclipse.core.runtime.applications"> - <application - cardinality="singleton-global" - thread="main" - visible="true"> - <run - class="org.eclipse.titanium.applications.SaveComponentDot"> - </run> - </application> + <extension id="org.eclipse.titanium.applications.SaveComponentDot" + point="org.eclipse.core.runtime.applications"> + <application cardinality="singleton-global" thread="main" + visible="true"> + <run class="org.eclipse.titanium.applications.SaveComponentDot"> + </run> + </application> </extension> </plugin> diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromBrowser.java b/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromBrowser.java index 594672a44f..c5212a15cb 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromBrowser.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromBrowser.java @@ -223,7 +223,6 @@ class OrganizeImportsOp implements IRunnableWithProgress { } for (IProject project : projects) { - GlobalParser.getProjectSourceParser(project).setFullSemanticAnalysisNeeded(); GlobalParser.getProjectSourceParser(project).analyzeAll(); } diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromEditor.java b/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromEditor.java index a09fab3682..f045d98456 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromEditor.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/actions/OrganizeFromEditor.java @@ -14,15 +14,12 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IAction; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.titan.common.logging.ErrorReporter; import org.eclipse.titan.designer.editors.ttcn3editor.TTCN3Editor; import org.eclipse.titan.designer.editors.ttcnppeditor.TTCNPPEditor; import org.eclipse.titan.designer.parsers.GlobalParser; -import org.eclipse.titan.designer.preferences.PreferenceConstants; -import org.eclipse.titan.designer.productUtilities.ProductConstants; import org.eclipse.titanium.organize.OrganizeImports; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; @@ -41,14 +38,8 @@ public final class OrganizeFromEditor extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); - final boolean enableRiskyRefactoring = Platform.getPreferencesService().getBoolean(ProductConstants.PRODUCT_ID_DESIGNER, - PreferenceConstants.ENABLERISKYREFACTORING, false, null); - if(!enableRiskyRefactoring) { - ErrorReporter.logError("Risky refactoring is not enabled!"); - return null; - } - if (editor == null || !(editor instanceof TTCN3Editor || (editor instanceof TTCNPPEditor && enableRiskyRefactoring))) { + if (editor == null || !(editor instanceof TTCN3Editor || (editor instanceof TTCNPPEditor))) { ErrorReporter.logError("The editor is not found or not a Titan TTCN-3 editor"); return null; } diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/error/ErrorMessage.java b/org.eclipse.titanium/src/org/eclipse/titanium/error/ErrorMessage.java index 9ae326a03f..6b5bae6454 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/error/ErrorMessage.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/error/ErrorMessage.java @@ -10,7 +10,6 @@ package org.eclipse.titanium.error; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.PreferencesUtil; /** @@ -47,14 +46,14 @@ public class ErrorMessage { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog err = new MessageDialog(new Shell(Display.getDefault()), windowTitle, null, message, dialogType, + MessageDialog err = new MessageDialog(null, windowTitle, null, message, dialogType, new String[] { IDialogConstants.OK_LABEL, buttonTitle }, 0) { @Override protected void buttonPressed(int buttonId) { super.buttonPressed(buttonId); if (buttonId == 1) { - PreferencesUtil.createPreferenceDialogOn(new Shell(Display.getDefault()), pageName, null, + PreferencesUtil.createPreferenceDialogOn(null, pageName, null, null).open(); } } @@ -78,7 +77,7 @@ public class ErrorMessage { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - MessageDialog err = new MessageDialog(new Shell(Display.getDefault()), title, null, message, dialogType, + MessageDialog err = new MessageDialog(null, title, null, message, dialogType, new String[] { IDialogConstants.OK_LABEL }, 0); err.open(); } diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/markers/spotters/implementation/UnusedStartedRefFuncRetVal.java b/org.eclipse.titanium/src/org/eclipse/titanium/markers/spotters/implementation/UnusedStartedRefFuncRetVal.java index ee32b7ee4b..ea3c2f1514 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/markers/spotters/implementation/UnusedStartedRefFuncRetVal.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/markers/spotters/implementation/UnusedStartedRefFuncRetVal.java @@ -40,14 +40,14 @@ public class UnusedStartedRefFuncRetVal extends BaseModuleCodeSmellSpotter { CompilationTimeStamp timestamp = CompilationTimeStamp.getBaseTimestamp(); Start_Referenced_Component_Statement s = (Start_Referenced_Component_Statement) node; - Value dereferedValue = s.getDereferedValue(); - if (dereferedValue == null) { + Value dereferredValue = s.getDereferredValue(); + if (dereferredValue == null) { return; } - switch (dereferedValue.getValuetype()) { + switch (dereferredValue.getValuetype()) { case EXPRESSION_VALUE: - if (Operation_type.REFERS_OPERATION.equals(((Expression_Value) dereferedValue).getOperationType())) { + if (Operation_type.REFERS_OPERATION.equals(((Expression_Value) dereferredValue).getOperationType())) { return; } break; @@ -58,7 +58,7 @@ public class UnusedStartedRefFuncRetVal extends BaseModuleCodeSmellSpotter { break; } - IType type = dereferedValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); + IType type = dereferredValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE); if (type != null) { type = type.getTypeRefdLast(timestamp); } @@ -110,7 +110,7 @@ public class UnusedStartedRefFuncRetVal extends BaseModuleCodeSmellSpotter { if (!returnTypeCorrect) { String msg = MessageFormat.format(PROBLEM, functionType.getTypename(), returnType.getTypename()); - problems.report(dereferedValue.getLocation(), msg); + problems.report(dereferredValue.getLocation(), msg); } } } diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/organize/OrganizeImports.java b/org.eclipse.titanium/src/org/eclipse/titanium/organize/OrganizeImports.java index 97679f49d6..b4fe9e607b 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/organize/OrganizeImports.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/organize/OrganizeImports.java @@ -89,7 +89,7 @@ public final class OrganizeImports { */ public static Location findReferenceInProject(final Reference reference, final IProject project) { ProjectSourceParser projectSourceParser = GlobalParser.getProjectSourceParser(project); - DeclarationCollector declarationCollector = new DeclarationCollector(reference, projectSourceParser); + DeclarationCollector declarationCollector = new DeclarationCollector(reference); for (String moduleName : projectSourceParser.getKnownModuleNames()) { Module m = projectSourceParser.getModuleByName(moduleName); if (m != null) { diff --git a/org.eclipse.titanium/src/org/eclipse/titanium/preferences/pages/MarkersPreferencePage.java b/org.eclipse.titanium/src/org/eclipse/titanium/preferences/pages/MarkersPreferencePage.java index 2ce0924608..0655f892ee 100644 --- a/org.eclipse.titanium/src/org/eclipse/titanium/preferences/pages/MarkersPreferencePage.java +++ b/org.eclipse.titanium/src/org/eclipse/titanium/preferences/pages/MarkersPreferencePage.java @@ -108,8 +108,8 @@ public final class MarkersPreferencePage extends FieldEditorPreferencePage imple m.put(ProblemTypePreference.MAGIC_CONSTANTS, "It is always recommended to extract local literal values into constants and use the constants in the code.\n" + "Since otherwise sooner or later it will be forgotten what that exact value was meaning"); - m.put(ProblemTypePreference.MISSING_FRIEND, "When the module refered to in a friend declaration could not be found.."); - m.put(ProblemTypePreference.MISSING_IMPORT, "When a module refered to in an import statement could not be found."); + m.put(ProblemTypePreference.MISSING_FRIEND, "When the module referred to in a friend declaration could not be found.."); + m.put(ProblemTypePreference.MISSING_IMPORT, "When a module referred to in an import statement could not be found."); m.put(ProblemTypePreference.MODULENAME_IN_DEFINITION, "As definitions can be referenced in the modulename.identifier format," + " it is of no value if the name of the module is duplicated in the name of the definition\n" + "But makes it longer"); diff --git a/org.eclipse.titanium/toc.xml b/org.eclipse.titanium/toc.xml index 4209f2bb94..f62585fcd9 100644 --- a/org.eclipse.titanium/toc.xml +++ b/org.eclipse.titanium/toc.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2000-2015 Ericsson Telecom AB + Copyright (c) 2000-2016 Ericsson Telecom AB 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 --> -<?NLS TYPE="org.eclipse.help.toc"?> - -<toc label="Titanium Help"> +<?NLS TYPE="org.eclipse.help.toc"?> + +<toc label="Titanium Help"> <topic label="Titanium Description" href="docs/Titanium_Description.doc" /> <topic label="Titanium Reference Guide" href="docs/referenceguide.docx" /> </toc> \ No newline at end of file -- GitLab