From a42ccda3a514afb93ad42c6faafcfdfabe6e7ece Mon Sep 17 00:00:00 2001 From: I-Al-Istannen Date: Fri, 1 Nov 2024 17:32:22 +0100 Subject: [PATCH] chore: Reformat code --- src/main/java/spoon/ContractVerifier.java | 19 +- src/main/java/spoon/FluentLauncher.java | 1 - src/main/java/spoon/IncrementalLauncher.java | 2 - src/main/java/spoon/Launcher.java | 25 +- src/main/java/spoon/MavenLauncher.java | 7 +- src/main/java/spoon/OutputType.java | 1 - src/main/java/spoon/SpoonAPI.java | 1 - src/main/java/spoon/SpoonModelBuilder.java | 9 +- src/main/java/spoon/compiler/Environment.java | 12 +- src/main/java/spoon/compiler/SpoonFile.java | 3 +- .../spoon/compiler/SpoonResourceHelper.java | 9 +- .../compiler/builder/EncodingProvider.java | 2 +- .../spoon/compiler/builder/SourceOptions.java | 3 +- .../spoon/experimental/SpoonifierVisitor.java | 15 +- .../java/spoon/experimental/package-info.java | 1 - .../java/spoon/javadoc/internal/Javadoc.java | 3 +- .../javadoc/internal/JavadocBlockTag.java | 3 +- src/main/java/spoon/metamodel/MMMethod.java | 7 +- .../java/spoon/metamodel/MMMethodKind.java | 1 - src/main/java/spoon/metamodel/Metamodel.java | 2 - .../spoon/metamodel/MetamodelConcept.java | 5 +- .../spoon/metamodel/MetamodelProperty.java | 6 +- .../java/spoon/metamodel/package-info.java | 1 - src/main/java/spoon/pattern/Generator.java | 1 - .../pattern/InlinedStatementConfigurator.java | 5 +- src/main/java/spoon/pattern/Match.java | 1 - src/main/java/spoon/pattern/Pattern.java | 1 - .../java/spoon/pattern/PatternBuilder.java | 1 - .../spoon/pattern/PatternBuilderHelper.java | 7 +- .../pattern/PatternParameterConfigurator.java | 9 +- .../pattern/internal/DefaultGenerator.java | 8 +- .../pattern/internal/PatternPrinter.java | 1 - .../spoon/pattern/internal/ResultHolder.java | 1 - .../pattern/internal/ValueConvertorImpl.java | 1 - .../internal/matcher/ChainOfMatchersImpl.java | 1 - .../internal/matcher/MatchingScanner.java | 1 - .../pattern/internal/matcher/TobeMatched.java | 5 +- .../pattern/internal/node/ConstantNode.java | 4 +- .../pattern/internal/node/ElementNode.java | 24 +- .../pattern/internal/node/ForEachNode.java | 5 +- .../pattern/internal/node/ListOfNodes.java | 5 +- .../pattern/internal/node/MapEntryNode.java | 5 +- .../pattern/internal/node/ParameterNode.java | 3 +- .../spoon/pattern/internal/node/RootNode.java | 1 - .../pattern/internal/node/StringNode.java | 13 +- .../pattern/internal/node/SwitchNode.java | 7 +- .../parameter/AbstractParameterInfo.java | 1 - .../parameter/ComputedParameterInfo.java | 1 - .../internal/parameter/ListParameterInfo.java | 1 - .../internal/parameter/MapParameterInfo.java | 1 - .../internal/parameter/ParameterInfo.java | 1 - .../internal/parameter/SetParameterInfo.java | 1 - .../AbstractAnnotationProcessor.java | 1 - .../processing/AbstractManualProcessor.java | 3 +- .../processing/AbstractParallelProcessor.java | 1 - .../spoon/processing/AbstractProcessor.java | 7 +- .../spoon/processing/AnnotationProcessor.java | 1 - .../java/spoon/processing/FileGenerator.java | 1 - .../spoon/processing/ProcessingManager.java | 1 - src/main/java/spoon/processing/Processor.java | 3 +- .../processing/ProcessorPropertiesImpl.java | 3 +- .../AbstractRenameRefactoring.java | 1 - .../CtParameterRemoveRefactoring.java | 1 - .../CtRenameLocalVariableRefactoring.java | 1 - .../spoon/refactoring/MethodCallState.java | 1 - .../refactoring/MethodInvocationSearch.java | 3 +- .../java/spoon/refactoring/Refactoring.java | 3 +- src/main/java/spoon/reflect/CtModel.java | 7 +- src/main/java/spoon/reflect/CtModelImpl.java | 9 +- ...odelElementContainerDefaultCapacities.java | 20 +- .../java/spoon/reflect/ModelStreamer.java | 1 - .../annotations/MetamodelPropertyField.java | 5 +- .../reflect/annotations/PropertyGetter.java | 3 +- .../reflect/annotations/PropertySetter.java | 3 +- .../reflect/code/CtAbstractInvocation.java | 7 +- .../spoon/reflect/code/CtAbstractSwitch.java | 3 +- .../reflect/code/CtAnnotationFieldAccess.java | 2 +- .../spoon/reflect/code/CtBinaryOperator.java | 2 +- .../java/spoon/reflect/code/CtBodyHolder.java | 2 +- src/main/java/spoon/reflect/code/CtCase.java | 3 +- .../java/spoon/reflect/code/CtComment.java | 4 +- .../spoon/reflect/code/CtConstructorCall.java | 7 +- .../code/CtExecutableReferenceExpression.java | 2 +- .../java/spoon/reflect/code/CtExpression.java | 7 +- .../spoon/reflect/code/CtFieldAccess.java | 2 +- src/main/java/spoon/reflect/code/CtFor.java | 3 +- .../java/spoon/reflect/code/CtInvocation.java | 7 +- .../java/spoon/reflect/code/CtJavaDoc.java | 5 +- .../java/spoon/reflect/code/CtJavaDocTag.java | 7 +- .../java/spoon/reflect/code/CtLambda.java | 7 +- .../java/spoon/reflect/code/CtNewArray.java | 3 +- .../java/spoon/reflect/code/CtNewClass.java | 3 +- .../spoon/reflect/code/CtRHSReceiver.java | 2 +- .../spoon/reflect/code/CtRecordPattern.java | 3 +- .../java/spoon/reflect/code/CtStatement.java | 2 +- .../spoon/reflect/code/CtStatementList.java | 3 +- src/main/java/spoon/reflect/code/CtTry.java | 3 +- .../spoon/reflect/code/CtTryWithResource.java | 3 +- .../spoon/reflect/code/CtTypePattern.java | 3 +- .../spoon/reflect/code/CtUnnamedPattern.java | 3 +- .../spoon/reflect/code/CtVariableAccess.java | 4 +- .../java/spoon/reflect/cu/SourcePosition.java | 5 +- .../reflect/cu/position/NoSourcePosition.java | 3 +- .../reflect/declaration/CtAnnotation.java | 11 +- .../declaration/CtAnnotationMethod.java | 9 +- .../reflect/declaration/CtAnnotationType.java | 7 +- .../declaration/CtAnonymousExecutable.java | 5 +- .../spoon/reflect/declaration/CtClass.java | 11 +- .../declaration/CtCompilationUnit.java | 1 - .../reflect/declaration/CtConstructor.java | 3 +- .../spoon/reflect/declaration/CtElement.java | 19 +- .../spoon/reflect/declaration/CtEnum.java | 9 +- .../reflect/declaration/CtExecutable.java | 5 +- .../declaration/CtFormalTypeDeclarer.java | 3 +- .../spoon/reflect/declaration/CtMethod.java | 3 +- .../reflect/declaration/CtModifiable.java | 3 +- .../spoon/reflect/declaration/CtModule.java | 3 +- .../declaration/CtModuleRequirement.java | 3 +- .../declaration/CtMultiTypedElement.java | 5 +- .../reflect/declaration/CtNamedElement.java | 4 +- .../spoon/reflect/declaration/CtPackage.java | 9 +- .../reflect/declaration/CtPackageExport.java | 3 +- .../reflect/declaration/CtParameter.java | 4 +- .../declaration/CtProvidedService.java | 3 +- .../spoon/reflect/declaration/CtSealable.java | 5 +- .../reflect/declaration/CtShadowable.java | 2 +- .../spoon/reflect/declaration/CtType.java | 11 +- .../declaration/CtTypeInformation.java | 7 +- .../reflect/declaration/CtTypeParameter.java | 5 +- .../reflect/declaration/CtTypedElement.java | 2 +- .../spoon/reflect/declaration/CtVariable.java | 4 +- .../reflect/factory/AnnotationFactory.java | 7 +- .../spoon/reflect/factory/CodeFactory.java | 15 +- .../factory/CompilationUnitFactory.java | 11 +- .../reflect/factory/ConstructorFactory.java | 11 +- .../spoon/reflect/factory/CoreFactory.java | 1 - .../reflect/factory/ExecutableFactory.java | 9 +- .../java/spoon/reflect/factory/Factory.java | 19 +- .../spoon/reflect/factory/FactoryImpl.java | 19 +- .../spoon/reflect/factory/FieldFactory.java | 5 +- .../spoon/reflect/factory/MethodFactory.java | 15 +- .../spoon/reflect/factory/ModuleFactory.java | 1 - .../spoon/reflect/factory/PackageFactory.java | 1 - .../spoon/reflect/factory/SubFactory.java | 1 - .../spoon/reflect/factory/TypeFactory.java | 29 +- .../java/spoon/reflect/meta/RoleHandler.java | 1 - .../meta/impl/AbstractRoleHandler.java | 1 - .../spoon/reflect/meta/impl/ListHandler.java | 1 - .../spoon/reflect/meta/impl/MapHandler.java | 1 - .../reflect/meta/impl/RoleHandlerHelper.java | 1 - .../spoon/reflect/meta/impl/SetHandler.java | 1 - .../reflect/meta/impl/SingleHandler.java | 1 - .../reflect/path/CtElementPathBuilder.java | 9 +- src/main/java/spoon/reflect/path/CtPath.java | 3 +- .../spoon/reflect/path/CtPathBuilder.java | 5 +- .../reflect/path/CtPathStringBuilder.java | 13 +- src/main/java/spoon/reflect/path/CtRole.java | 1 - .../path/impl/AbstractPathElement.java | 5 +- .../reflect/path/impl/CtNamedPathElement.java | 13 +- .../reflect/path/impl/CtPathElement.java | 3 +- .../spoon/reflect/path/impl/CtPathImpl.java | 5 +- .../reflect/path/impl/CtRolePathElement.java | 9 +- .../reflect/path/impl/CtTypedNameElement.java | 3 +- .../reference/CtActualTypeContainer.java | 3 +- .../reference/CtExecutableReference.java | 7 +- .../reflect/reference/CtFieldReference.java | 3 +- .../CtIntersectionTypeReference.java | 3 +- .../spoon/reflect/reference/CtReference.java | 3 +- .../CtTypeMemberWildcardImportReference.java | 1 - .../reference/CtTypeParameterReference.java | 3 +- .../reflect/reference/CtTypeReference.java | 3 +- .../reference/CtUnboundVariableReference.java | 5 +- .../reference/CtVariableReference.java | 3 +- .../visitor/AccessibleVariablesFinder.java | 9 +- .../visitor/CacheBasedConflictFinder.java | 1 - .../visitor/CtAbstractImportVisitor.java | 2 +- .../reflect/visitor/CtAbstractVisitor.java | 1 - .../spoon/reflect/visitor/CtBFSIterator.java | 3 +- .../spoon/reflect/visitor/CtDequeScanner.java | 3 +- .../reflect/visitor/CtImportVisitor.java | 2 +- .../reflect/visitor/CtInheritanceScanner.java | 19 +- .../spoon/reflect/visitor/CtIterator.java | 3 +- .../java/spoon/reflect/visitor/CtScanner.java | 2 - .../java/spoon/reflect/visitor/CtVisitor.java | 1 - .../visitor/DefaultImportComparator.java | 1 - .../visitor/DefaultJavaPrettyPrinter.java | 17 +- .../visitor/EarlyTerminatingScanner.java | 7 +- .../reflect/visitor/ElementPrinterHelper.java | 19 +- .../spoon/reflect/visitor/ImportAnalyzer.java | 5 +- .../spoon/reflect/visitor/ImportCleaner.java | 21 +- .../visitor/ImportConflictDetector.java | 3 +- .../spoon/reflect/visitor/ImportScanner.java | 3 +- .../reflect/visitor/ImportScannerImpl.java | 31 +- .../reflect/visitor/JavaIdentifiers.java | 3 +- .../spoon/reflect/visitor/LexicalScope.java | 3 +- .../reflect/visitor/LexicalScopeScanner.java | 11 +- .../visitor/ModelConsistencyChecker.java | 11 +- .../spoon/reflect/visitor/NameScopeImpl.java | 1 - .../spoon/reflect/visitor/OperatorHelper.java | 5 +- .../spoon/reflect/visitor/PrettyPrinter.java | 5 +- .../spoon/reflect/visitor/PrinterHelper.java | 7 +- .../reflect/visitor/PrintingContext.java | 7 +- .../java/spoon/reflect/visitor/Query.java | 3 +- .../spoon/reflect/visitor/TypeNameScope.java | 1 - .../spoon/reflect/visitor/chain/CtQuery.java | 5 +- .../reflect/visitor/chain/CtQueryImpl.java | 15 +- .../visitor/filter/AbstractFilter.java | 1 - .../AllMethodsSameSignatureFunction.java | 1 - .../filter/AllTypeMembersFunction.java | 1 - .../visitor/filter/AnnotationFilter.java | 1 - .../filter/ExecutableReferenceFilter.java | 9 +- .../reflect/visitor/filter/LambdaFilter.java | 1 - .../PotentialVariableDeclarationFunction.java | 3 +- .../reflect/visitor/filter/RegexFilter.java | 1 - .../SuperInheritanceHierarchyFunction.java | 3 +- .../spoon/support/DefaultCoreFactory.java | 1 - .../DefaultOutputDestinationHandler.java | 7 +- .../java/spoon/support/DerivedProperty.java | 3 +- .../spoon/support/JavaOutputProcessor.java | 19 +- .../support/OutputDestinationHandler.java | 5 +- .../spoon/support/QueueProcessingManager.java | 11 +- .../support/RuntimeProcessingManager.java | 7 +- .../support/SerializationModelStreamer.java | 2 - .../spoon/support/StandardEnvironment.java | 37 +- .../support/adaption/AdaptionVisitor.java | 5 +- .../support/adaption/DeclarationNode.java | 11 +- .../java/spoon/support/adaption/GlueNode.java | 9 +- .../spoon/support/adaption/TypeAdaptor.java | 15 +- .../comparator/CtLineElementComparator.java | 1 - .../DeepRepresentationComparator.java | 3 +- ...edOnFileNameCompilationUnitComparator.java | 3 +- .../comparator/QualifiedNameComparator.java | 2 - .../comparator/SignatureComparator.java | 5 +- .../support/compiler/FileSystemFile.java | 1 - .../support/compiler/FileSystemFolder.java | 1 - .../support/compiler/FilteringFolder.java | 1 - .../support/compiler/ProgressLogger.java | 3 +- .../compiler/SnippetCompilationError.java | 1 - .../compiler/SnippetCompilationHelper.java | 15 +- .../java/spoon/support/compiler/SpoonPom.java | 39 +- .../spoon/support/compiler/VirtualFile.java | 7 +- .../spoon/support/compiler/VirtualFolder.java | 1 - .../java/spoon/support/compiler/ZipFile.java | 9 +- .../spoon/support/compiler/ZipFolder.java | 13 +- .../compiler/jdt/CompilationUnitFilter.java | 4 +- .../compiler/jdt/CompilationUnitWrapper.java | 6 +- .../support/compiler/jdt/ContextBuilder.java | 12 +- .../compiler/jdt/FactoryCompilerConfig.java | 2 - .../compiler/jdt/FileCompilerConfig.java | 4 +- .../compiler/jdt/JDTBasedSpoonCompiler.java | 31 +- .../compiler/jdt/JDTBatchCompiler.java | 17 +- .../compiler/jdt/JDTCommentBuilder.java | 28 +- .../compiler/jdt/JDTImportBuilder.java | 14 +- .../compiler/jdt/JDTSnippetCompiler.java | 1 - .../support/compiler/jdt/JDTTreeBuilder.java | 1 - .../compiler/jdt/JDTTreeBuilderHelper.java | 15 +- .../compiler/jdt/JDTTreeBuilderQuery.java | 7 +- .../support/compiler/jdt/ModifierTarget.java | 3 +- .../support/compiler/jdt/ParentExiter.java | 11 +- .../support/compiler/jdt/PositionBuilder.java | 13 +- .../compiler/jdt/ReferenceBuilder.java | 26 +- .../compiler/jdt/TreeBuilderCompiler.java | 1 - .../spoon/support/gui/SpoonModelTree.java | 2 - .../support/gui/SpoonObjectFieldsTable.java | 1 - .../spoon/support/gui/SpoonTreeBuilder.java | 7 +- .../ActionBasedChangeListenerImpl.java | 15 +- .../support/modelobs/ChangeCollector.java | 1 - .../modelobs/EmptyModelChangeListener.java | 7 +- .../modelobs/action/DeleteAllAction.java | 3 +- .../modelobs/context/CollectionContext.java | 3 +- .../support/modelobs/context/ListContext.java | 3 +- .../support/modelobs/context/MapContext.java | 3 +- .../support/modelobs/context/SetContext.java | 3 +- .../support/reflect/CtExtendedModifier.java | 3 +- .../support/reflect/CtModifierHandler.java | 11 +- .../reflect/code/CtAssignmentImpl.java | 5 +- .../support/reflect/code/CtBlockImpl.java | 7 +- .../support/reflect/code/CtBreakImpl.java | 3 +- .../support/reflect/code/CtCaseImpl.java | 9 +- .../reflect/code/CtCasePatternImpl.java | 3 +- .../reflect/code/CtCatchVariableImpl.java | 9 +- .../support/reflect/code/CtCommentImpl.java | 3 +- .../reflect/code/CtConstructorCallImpl.java | 5 +- .../support/reflect/code/CtContinueImpl.java | 3 +- .../reflect/code/CtExpressionImpl.java | 5 +- .../spoon/support/reflect/code/CtForImpl.java | 5 +- .../reflect/code/CtInvocationImpl.java | 5 +- .../support/reflect/code/CtJavaDocImpl.java | 3 +- .../reflect/code/CtJavaDocTagImpl.java | 2 +- .../support/reflect/code/CtLambdaImpl.java | 9 +- .../reflect/code/CtLocalVariableImpl.java | 3 +- .../support/reflect/code/CtNewArrayImpl.java | 5 +- .../reflect/code/CtRecordPatternImpl.java | 5 +- .../support/reflect/code/CtStatementImpl.java | 5 +- .../reflect/code/CtStatementListImpl.java | 9 +- .../reflect/code/CtSwitchExpressionImpl.java | 5 +- .../support/reflect/code/CtSwitchImpl.java | 5 +- .../spoon/support/reflect/code/CtTryImpl.java | 5 +- .../reflect/code/CtTryWithResourceImpl.java | 7 +- .../position/PartialSourcePositionImpl.java | 3 +- .../cu/position/SourcePositionImpl.java | 5 +- .../reflect/declaration/CtAnnotationImpl.java | 31 +- .../declaration/CtAnnotationMethodImpl.java | 7 +- .../declaration/CtAnnotationTypeImpl.java | 11 +- .../CtAnonymousExecutableImpl.java | 5 +- .../reflect/declaration/CtClassImpl.java | 21 +- .../declaration/CtCompilationUnitImpl.java | 3 +- .../declaration/CtConstructorImpl.java | 7 +- .../reflect/declaration/CtElementImpl.java | 20 +- .../reflect/declaration/CtEnumImpl.java | 13 +- .../reflect/declaration/CtExecutableImpl.java | 9 +- .../reflect/declaration/CtFieldImpl.java | 3 +- .../reflect/declaration/CtImportImpl.java | 6 +- .../reflect/declaration/CtInterfaceImpl.java | 17 +- .../reflect/declaration/CtMethodImpl.java | 11 +- .../reflect/declaration/CtModuleImpl.java | 9 +- .../declaration/CtModuleRequirementImpl.java | 5 +- .../declaration/CtPackageDeclarationImpl.java | 2 +- .../declaration/CtPackageExportImpl.java | 7 +- .../reflect/declaration/CtParameterImpl.java | 3 +- .../declaration/CtProvidedServiceImpl.java | 7 +- .../declaration/CtRecordComponentImpl.java | 1 - .../reflect/declaration/CtTypeImpl.java | 23 +- .../declaration/CtTypeParameterImpl.java | 11 +- .../support/reflect/eval/EvalHelper.java | 7 +- .../reflect/eval/VisitorPartialEvaluator.java | 7 +- .../reference/CtArrayTypeReferenceImpl.java | 3 +- .../reference/CtExecutableReferenceImpl.java | 19 +- .../reference/CtFieldReferenceImpl.java | 9 +- .../CtIntersectionTypeReferenceImpl.java | 7 +- .../reference/CtModuleReferenceImpl.java | 3 +- .../reference/CtPackageReferenceImpl.java | 3 +- .../reference/CtParameterReferenceImpl.java | 3 +- .../reflect/reference/CtReferenceImpl.java | 16 +- ...TypeMemberWildcardImportReferenceImpl.java | 7 +- .../CtTypeParameterReferenceImpl.java | 7 +- .../reference/CtTypeReferenceImpl.java | 21 +- .../CtUnboundVariableReferenceImpl.java | 1 - .../reference/CtVariableReferenceImpl.java | 7 +- .../reference/CtWildcardReferenceImpl.java | 6 +- .../sniper/SniperJavaPrettyPrinter.java | 5 +- ...stractSourceFragmentContextCollection.java | 1 - .../AbstractSourceFragmentPrinter.java | 5 +- .../sniper/internal/ChangeResolver.java | 1 - .../internal/CollectionSourceFragment.java | 3 +- .../sniper/internal/ElementPrinterEvent.java | 1 - .../internal/ElementSourceFragment.java | 23 +- .../sniper/internal/IndentationDetector.java | 7 +- .../internal/SourceFragmentContextList.java | 3 +- .../sniper/internal/TokenPrinterEvent.java | 2 - .../spoon/support/sniper/package-info.java | 1 - .../spoon/support/template/Parameters.java | 15 +- .../spoon/support/util/ImmutableMapImpl.java | 3 +- .../java/spoon/support/util/ModelList.java | 7 +- .../java/spoon/support/util/ModelSet.java | 7 +- .../util/QualifiedNameBasedSortedSet.java | 1 - .../java/spoon/support/util/RtHelper.java | 19 +- .../support/util/SignatureBasedSortedSet.java | 5 +- .../support/util/internal/ElementNameMap.java | 5 +- .../visitor/AbstractTypingContext.java | 1 - .../support/visitor/ClassTypingContext.java | 15 +- .../support/visitor/MethodTypingContext.java | 5 +- .../SubInheritanceHierarchyResolver.java | 9 +- .../support/visitor/TypeReferenceScanner.java | 8 +- .../support/visitor/equals/CloneHelper.java | 13 +- .../support/visitor/equals/EqualsChecker.java | 2 +- .../support/visitor/equals/EqualsVisitor.java | 3 +- .../java/JavaReflectionTreeBuilder.java | 1 - .../visitor/java/JavaReflectionVisitor.java | 7 +- .../java/JavaReflectionVisitorImpl.java | 1 - .../visitor/java/MethodHandleUtils.java | 3 +- .../AbstractRuntimeBuilderContext.java | 5 +- .../AnnotationRuntimeBuilderContext.java | 3 +- .../ExecutableRuntimeBuilderContext.java | 11 +- .../PackageRuntimeBuilderContext.java | 3 +- .../java/internal/RuntimeBuilderContext.java | 5 +- .../TypeReferenceRuntimeBuilderContext.java | 13 +- .../internal/TypeRuntimeBuilderContext.java | 11 +- .../VariableRuntimeBuilderContext.java | 3 +- .../visitor/java/reflect/RtParameter.java | 3 +- .../java/spoon/template/AbstractTemplate.java | 1 - .../spoon/template/ExtensionTemplate.java | 1 - .../spoon/template/StatementTemplate.java | 3 +- .../java/spoon/template/Substitution.java | 9 +- .../java/spoon/template/TemplateBuilder.java | 1 - .../java/spoon/template/TemplateMatcher.java | 5 +- .../java/spoon/template/package-info.java | 1 - .../java/spoon/testing/AbstractAssert.java | 3 +- .../testing/AbstractCtElementAssert.java | 2 +- .../testing/AbstractCtPackageAssert.java | 5 +- .../spoon/testing/AbstractFileAssert.java | 5 +- src/main/java/spoon/testing/Assert.java | 3 +- src/main/java/spoon/testing/utils/Check.java | 3 +- .../java/spoon/testing/utils/ModelUtils.java | 7 +- .../spoon/testing/utils/ProcessorUtils.java | 5 +- .../java/spoon/CompilationUnitPrintTest.java | 101 +- src/test/java/spoon/FluentLauncherTest.java | 2 - src/test/java/spoon/LauncherTest.java | 7 +- src/test/java/spoon/MavenLauncherTest.java | 1 - .../generating/CloneVisitorGenerator.java | 17 +- .../generating/CtBiScannerGenerator.java | 3 +- .../spoon/generating/MetamodelGenerator.java | 240 +- .../ReplacementVisitorGenerator.java | 3 +- .../generating/RoleHandlersGenerator.java | 3 +- .../jdt/ModifierConstantsCollector.java | 5 +- .../generating/meta/RoleHandlerTemplate.java | 1 - .../generating/replace/ReplaceScanner.java | 29 +- .../replace/ReplacementVisitor.java | 15 +- .../scanner/CtBiScannerTemplate.java | 7 +- .../scanner/PeekElementTemplate.java | 3 +- .../internal/JavadocInlineTagTest.java | 102 +- .../spoon/processing/CtGenerationTest.java | 19 +- .../java/spoon/processing/ProcessingTest.java | 21 +- .../spoon/reflect/ast/AstCheckerTest.java | 27 +- .../java/spoon/reflect/ast/CloneTest.java | 1 - .../declaration/CtTypeInformationTest.java | 1 - .../GenerateParentlessPackageTest.java | 47 +- .../reflect/factory/PackageFactoryTest.java | 13 +- .../reference/CtTypeReferenceTest.java | 363 +- .../visitor/CacheBasedConflictFinderTest.java | 68 +- .../reflect/visitor/CtBFSIteratorTest.java | 1 - .../visitor/CtInheritanceScannerTest.java | 11 +- .../spoon/reflect/visitor/CtIteratorTest.java | 1 - .../spoon/reflect/visitor/CtScannerTest.java | 3 +- .../visitor/DefaultJavaPrettyPrinterTest.java | 743 ++-- .../reflect/visitor/ImportCleanerTest.java | 7 +- .../ModelConsistencyCheckerTestHelper.java | 3 +- .../processors/CheckScannerTestProcessor.java | 5 +- .../processors/CheckVisitorTestProcessor.java | 5 +- .../support/JavaOutputProcessorTest.java | 99 +- .../java/spoon/support/TypeAdaptorTest.java | 7 +- .../spoon/support/compiler/SpoonPomTest.java | 13 +- .../spoon/support/compiler/ZipFileTest.java | 11 +- .../classpath/ComputeClasspathTest.java | 3 +- .../jdt/ExtendedStringLiteralTest.java | 5 +- .../jdt/JDTBasedSpoonCompilerTest.java | 3 +- .../compiler/jdt/JDTBatchCompilerTest.java | 3 +- .../support/compiler/jdt/JDTBuilderTest.java | 3 +- .../compiler/jdt/JDTImportBuilderTest.java | 12 +- .../compiler/jdt/JDTTreeBuilderQueryTest.java | 21 +- .../compiler/jdt/TreeBuilderCompilerTest.java | 88 +- .../support/gui/SpoonTreeBuilderTest.java | 60 +- .../util/QualifiedNameBasedSortedSetTest.java | 197 +- .../util/compilation/ClassFileManager.java | 4 +- .../util/compilation/InMemoryInputObject.java | 2 +- .../compilation/InMemoryOutputObject.java | 2 +- .../support/util/compilation/JavacFacade.java | 4 +- .../util/internal/ElementNameMapTest.java | 81 +- .../java/JavaReflectionTreeBuilderTest.java | 39 +- .../java/spoon/test/SpoonTestHelpers.java | 17 +- .../TemporaryDirectoryExecutionListener.java | 9 +- .../java/spoon/test/TestExecutionLogger.java | 4 +- .../spoon/test/annotation/AnnotationTest.java | 1 - .../test/annotation/AnnotationValuesTest.java | 2 - src/test/java/spoon/test/api/APITest.java | 12 +- .../spoon/test/api/FileSystemFolderTest.java | 2 - src/test/java/spoon/test/api/Metamodel.java | 17 +- .../java/spoon/test/api/MetamodelTest.java | 6 +- .../java/spoon/test/api/NoClasspathTest.java | 4 - .../test/api/processors/AwesomeProcessor.java | 7 +- .../SpoonArchitectureEnforcerTest.java | 2 - .../java/spoon/test/arrays/ArraysTest.java | 1 - .../test/change/ChangeCollectorTest.java | 187 +- .../java/spoon/test/comment/CommentTest.java | 61 +- .../test/compilation/CompilationTest.java | 9 +- .../compilationunit/GetBinaryFilesTest.java | 1 - .../compilationunit/TestCompilationUnit.java | 19 +- .../spoon/test/condition/ConditionalTest.java | 6 +- .../test/constructor/ConstructorTest.java | 2 - .../constructor/CtConstructorCallTest.java | 58 +- .../ConstructorCallTest.java | 5 +- .../constructorcallnewclass/NewClassTest.java | 3 - .../java/spoon/test/control/ControlTest.java | 1 - .../java/spoon/test/ctBlock/TestCtBlock.java | 1 - .../test/ctBodyHolder/CtBodyHolderTest.java | 329 +- .../java/spoon/test/ctCase/CtCaseTest.java | 14 +- .../java/spoon/test/ctClass/CtClassTest.java | 5 +- .../ctStatementList/CtStatementListTest.java | 209 +- .../test/ctType/CtTypeParameterTest.java | 473 ++- .../java/spoon/test/ctType/CtTypeTest.java | 21 +- .../java/spoon/test/delete/DeleteTest.java | 1 - src/test/java/spoon/test/enums/EnumsTest.java | 19 +- .../java/spoon/test/enums/EnumsTypeTest.java | 2 - src/test/java/spoon/test/eval/EvalTest.java | 17 +- .../spoon/test/exceptions/ExceptionTest.java | 3 +- .../test/executable/ExecutableRefTest.java | 1 - .../spoon/test/executable/ExecutableTest.java | 1 - .../spoon/test/factory/CodeFactoryTest.java | 6 +- .../test/factory/ConstructorFactoryTest.java | 1 - .../test/factory/ExecutableFactoryTest.java | 1 - .../java/spoon/test/factory/FactoryTest.java | 3 - .../spoon/test/factory/FieldFactoryTest.java | 1 - .../spoon/test/factory/MethodFactoryTest.java | 71 +- .../spoon/test/factory/TypeFactoryTest.java | 2 - src/test/java/spoon/test/field/FieldTest.java | 9 +- .../test/fieldaccesses/FieldAccessTest.java | 15 +- .../java/spoon/test/filters/CUFilterTest.java | 82 +- .../java/spoon/test/filters/FilterTest.java | 111 +- .../spoon/test/generics/GenericsTest.java | 77 +- .../test/imports/CtUnresolvedImportTest.java | 7 +- .../ImportAndExtendWithPackageNameTest.java | 33 +- .../spoon/test/imports/ImportScannerTest.java | 27 +- .../java/spoon/test/imports/ImportTest.java | 95 +- .../imports/name_scope/NameScopeTest.java | 11 +- .../intercession/IntercessionScanner.java | 9 +- .../test/intercession/IntercessionTest.java | 1 - ...anCallSetterWithNullParameterizedTest.java | 9 +- .../spoon/test/intercession/RemoveTest.java | 2 - .../insertBefore/InsertBeforeExample.java | 48 +- .../insertBefore/InsertMethodsTest.java | 1 - .../spoon/test/interfaces/InterfaceTest.java | 51 +- .../interfaces/TestInterfaceWithoutSetup.java | 25 +- .../test/invocations/InvocationTest.java | 39 +- .../issue3321/AnnotationPositionTest.java | 12 +- .../test/issue3321/CtClassProcessor.java | 6 +- .../SniperPrettyPrinterJavaxTest.java | 32 +- .../source/JavaxImportTestSource.java | 10 +- src/test/java/spoon/test/jar/JarTest.java | 41 +- .../java/spoon/test/javadoc/JavaDocTest.java | 3 +- .../jdtimportbuilder/ImportBuilderTest.java | 31 +- .../java/spoon/test/labels/TestLabels.java | 139 +- .../test/lambda/AnonymousInLambdaTest.java | 5 +- .../java/spoon/test/lambda/LambdaTest.java | 23 +- .../spoon/test/limits/utils/InternalTest.java | 3 +- .../java/spoon/test/literal/LiteralTest.java | 30 +- .../spoon/test/literal/UnicodeBugTest.java | 9 +- src/test/java/spoon/test/logging/LogTest.java | 17 +- src/test/java/spoon/test/loop/LoopTest.java | 27 +- src/test/java/spoon/test/main/MainTest.java | 13 +- .../java/spoon/test/method/MethodTest.java | 48 +- .../MethodOverriddingTest.java | 265 +- .../methodreference/MethodReferenceTest.java | 15 +- .../test/model/AnonymousExecutableTest.java | 3 +- src/test/java/spoon/test/model/BlockTest.java | 6 +- .../test/model/ClassWithSuperAndIFace.java | 28 +- src/test/java/spoon/test/model/Foo.java | 10 +- .../test/model/IncrementalLauncherTest.java | 11 +- .../java/spoon/test/model/SwitchCaseTest.java | 26 +- src/test/java/spoon/test/model/TypeTest.java | 13 +- .../spoon/test/modifiers/ModifiersTest.java | 423 ++- .../java/spoon/test/module/TestModule.java | 23 +- .../spoon/test/parameters/ParameterTest.java | 2 - .../ContractOnSettersParametrizedTest.java | 17 +- .../java/spoon/test/parent/ParentTest.java | 1 - .../java/spoon/test/parent/SetParentTest.java | 13 +- .../spoon/test/parent/TopLevelTypeTest.java | 123 +- src/test/java/spoon/test/path/PathTest.java | 11 +- .../spoon/test/pattern/RecordPatternTest.java | 4 +- .../spoon/test/pattern/SwitchPatternTest.java | 7 +- src/test/java/spoon/test/pkg/PackageTest.java | 8 +- .../test/pkg/processors/ElementProcessor.java | 11 +- .../test/pkg/test_templates/FakeTemplate.java | 20 +- .../spoon/test/position/PositionTest.java | 192 +- .../test/position/TestSourceFragment.java | 94 +- .../DefaultPrettyPrinterTest.java | 33 +- .../spoon/test/prettyprinter/LinesTest.java | 1 - .../LoopSniperJavaPrettyPrinterTest.java | 4 +- .../spoon/test/prettyprinter/PrinterTest.java | 33 +- .../prettyprinter/QualifiedThisRefTest.java | 2 - .../SniperAnnotatedEnumTest.java | 79 +- .../test/prettyprinter/SniperAssertTest.java | 6 +- .../SniperDefaultMethodTest.java | 66 +- .../prettyprinter/SniperDoubleBoundTest.java | 78 +- .../SniperDoubleForInitializerTest.java | 68 +- .../prettyprinter/SniperInnerTypeTest.java | 6 +- .../test/prettyprinter/TestSniperPrinter.java | 61 +- .../spoon/test/processing/ProcessingTest.java | 3 - .../processors/CtClassProcessor.java | 6 +- .../processors/CtInterfaceProcessor.java | 6 +- .../processors/CtTypeProcessor.java | 6 +- .../processors/GenericCtTypeProcessor.java | 21 +- .../processors/ParallelProcessorTest.java | 15 +- .../processors/RenameProcessor.java | 54 +- .../processing/processors/TestProcessor.java | 1 - .../spoon/test/properties/PropertiesTest.java | 1 - .../test/properties/SimpleProcessor.java | 6 +- .../VariableReferencesTest.java | 755 ++-- .../ReceiverParameterTest.java | 1 - .../java/spoon/test/record/CtRecordTest.java | 26 +- .../CtRenameLocalVariableRefactoringTest.java | 555 ++- .../refactoring/MethodsRefactoringTest.java | 777 ++-- .../test/refactoring/RefactoringTest.java | 16 +- .../test/reference/CloneReferenceTest.java | 199 +- .../ElasticsearchStackoverflowTest.java | 1 - src/test/java/spoon/test/reference/Enum.java | 14 +- .../ExecutableReferenceGenericTest.java | 1 - .../reference/ExecutableReferenceTest.java | 3 +- src/test/java/spoon/test/reference/Foo.java | 2 +- .../test/reference/TypeReferenceTest.java | 10 +- .../test/reference/VariableAccessTest.java | 7 +- .../reflect/visitor/ReferenceQueryTest.java | 1 - .../test/replace/ReplaceParametrizedTest.java | 21 +- .../java/spoon/test/replace/ReplaceTest.java | 1 - src/test/java/spoon/test/role/TestCtRole.java | 142 +- .../test/secondaryclasses/ClassesTest.java | 2 - .../test/serializable/ModelStreamerTest.java | 6 +- .../test/serializable/SerializableTest.java | 2 - .../test/serializable/SourcePositionTest.java | 2 - .../spoon/test/signature/SignatureTest.java | 2 - .../java/spoon/test/snippets/SnippetTest.java | 17 +- .../sourcePosition/SourcePositionTest.java | 23 +- .../spoon/test/spoonifier/SpoonifierTest.java | 5 +- .../StatementCommentTest.java | 81 +- .../staticFieldAccess/StaticAccessBug.java | 3 +- .../staticFieldAccess/StaticAccessTest.java | 79 +- .../processors/InsertBlockProcessor.java | 2 +- .../ImplicitStaticFieldReferenceTest.java | 355 +- .../java/spoon/test/support/ResourceTest.java | 2 - .../test/targeted/TargetedExpressionTest.java | 3 +- .../test/template/ArrayResizeTemplate.java | 2 +- .../java/spoon/test/template/PatternTest.java | 3335 ++++++++--------- .../spoon/test/template/SubstitutionTest.java | 505 ++- .../template/TemplateArrayAccessTest.java | 121 +- .../template/TemplateClassAccessTest.java | 99 +- .../test/template/TemplateEnumAccessTest.java | 104 +- .../TemplateInvocationSubstitutionTest.java | 195 +- .../template/TemplateReplaceReturnTest.java | 150 +- .../spoon/test/template/TemplateTest.java | 62 +- .../test/template/core/ParameterInfoTest.java | 861 +++-- .../spoon/test/textBlocks/TextBlockTest.java | 16 +- .../spoon/test/trycatch/TryCatchTest.java | 5 +- src/test/java/spoon/test/type/TypeTest.java | 1 - .../AccessFullyQualifiedFieldTest.java | 1 - .../java/spoon/test/variable/AccessTest.java | 113 +- .../spoon/test/variable/VariableTest.java | 306 +- .../spoon/test/visibility/VisibilityTest.java | 1 - .../test/visitor/AssignmentsEqualsTest.java | 3 - .../java/spoon/test/visitor/VisitorTest.java | 2 - .../spoon/testing/CtPackageAssertTest.java | 6 +- .../assertions/codegen/AssertJCodegen.java | 27 +- .../matchers/ContentEqualsMatcher.java | 5 +- .../testing/matchers/RegexFindMatcher.java | 3 +- .../testing/processors/FooToBarProcessor.java | 2 +- .../java/spoon/testing/utils/CheckTest.java | 168 +- .../java/spoon/testing/utils/GitHubIssue.java | 5 +- .../java/spoon/testing/utils/ModelTest.java | 5 +- .../utils/ModelTestParameterResolver.java | 3 +- .../toStringBugTest/ToStringBugTest.java | 53 +- 638 files changed, 9063 insertions(+), 9733 deletions(-) diff --git a/src/main/java/spoon/ContractVerifier.java b/src/main/java/spoon/ContractVerifier.java index 5a975d9e2e2..e9edd488a47 100644 --- a/src/main/java/spoon/ContractVerifier.java +++ b/src/main/java/spoon/ContractVerifier.java @@ -8,6 +8,15 @@ package spoon; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayDeque; +import java.util.Collection; +import java.util.Deque; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Set; import spoon.reflect.CtModelImpl; import spoon.reflect.code.CtArrayWrite; import spoon.reflect.code.CtAssignment; @@ -49,16 +58,6 @@ import spoon.support.sniper.internal.ElementSourceFragment; import spoon.support.visitor.equals.EqualsVisitor; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayDeque; -import java.util.Collection; -import java.util.Deque; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Set; - import static spoon.testing.utils.Check.assertNotNull; /** diff --git a/src/main/java/spoon/FluentLauncher.java b/src/main/java/spoon/FluentLauncher.java index 7ac1303454b..51b2f1d1041 100644 --- a/src/main/java/spoon/FluentLauncher.java +++ b/src/main/java/spoon/FluentLauncher.java @@ -9,7 +9,6 @@ import java.io.File; import java.nio.charset.Charset; - import spoon.processing.Processor; import spoon.reflect.CtModel; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/IncrementalLauncher.java b/src/main/java/spoon/IncrementalLauncher.java index bac4d2c3e0b..d2334b6ccef 100644 --- a/src/main/java/spoon/IncrementalLauncher.java +++ b/src/main/java/spoon/IncrementalLauncher.java @@ -24,13 +24,11 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; - import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.SuffixFileFilter; import org.apache.commons.io.filefilter.TrueFileFilter; import org.codehaus.plexus.util.CollectionUtils; - import spoon.reflect.cu.CompilationUnit; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; diff --git a/src/main/java/spoon/Launcher.java b/src/main/java/spoon/Launcher.java index 3c621bbc3d1..bd4a0edd95f 100644 --- a/src/main/java/spoon/Launcher.java +++ b/src/main/java/spoon/Launcher.java @@ -14,6 +14,17 @@ import com.martiansoftware.jsap.Switch; import com.martiansoftware.jsap.stringparsers.EnumeratedStringParser; import com.martiansoftware.jsap.stringparsers.FileStringParser; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.ResourceBundle; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.lang3.StringUtils; @@ -43,18 +54,6 @@ import spoon.support.compiler.jdt.JDTBasedSpoonCompiler; import spoon.support.gui.SpoonModelTree; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.ResourceBundle; - import static spoon.support.StandardEnvironment.DEFAULT_CODE_COMPLIANCE_LEVEL; /** @@ -94,7 +93,7 @@ enum CLASSPATH_MODE { /** * This field is used to ensure that {@link #setArgs(String[])} is only called once. - */ + */ private boolean processed = false; /** diff --git a/src/main/java/spoon/MavenLauncher.java b/src/main/java/spoon/MavenLauncher.java index 0748b133673..fc22f87da8c 100644 --- a/src/main/java/spoon/MavenLauncher.java +++ b/src/main/java/spoon/MavenLauncher.java @@ -7,14 +7,13 @@ */ package spoon; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spoon.support.compiler.SpoonPom; - import java.io.File; import java.lang.invoke.MethodHandles; import java.util.List; import java.util.regex.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spoon.support.compiler.SpoonPom; /** * Create a Spoon launcher from a maven pom file diff --git a/src/main/java/spoon/OutputType.java b/src/main/java/spoon/OutputType.java index 79ac0a17426..d5255c97d79 100644 --- a/src/main/java/spoon/OutputType.java +++ b/src/main/java/spoon/OutputType.java @@ -8,7 +8,6 @@ package spoon; import java.util.Locale; - import org.jspecify.annotations.Nullable; /** diff --git a/src/main/java/spoon/SpoonAPI.java b/src/main/java/spoon/SpoonAPI.java index b2f1d6d7969..43023ecd1ca 100644 --- a/src/main/java/spoon/SpoonAPI.java +++ b/src/main/java/spoon/SpoonAPI.java @@ -8,7 +8,6 @@ package spoon; import java.io.File; - import spoon.compiler.Environment; import spoon.processing.Processor; import spoon.reflect.CtModel; diff --git a/src/main/java/spoon/SpoonModelBuilder.java b/src/main/java/spoon/SpoonModelBuilder.java index 0f505679443..99287e709bf 100644 --- a/src/main/java/spoon/SpoonModelBuilder.java +++ b/src/main/java/spoon/SpoonModelBuilder.java @@ -7,6 +7,10 @@ */ package spoon; +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Set; import spoon.compiler.SpoonResource; import spoon.compiler.builder.JDTBuilder; import spoon.processing.Processor; @@ -19,11 +23,6 @@ import spoon.support.compiler.jdt.FileCompilerConfig; import spoon.support.compiler.jdt.JDTBatchCompiler; -import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Set; - /** * Responsible for building a spoon model from Java source code. * diff --git a/src/main/java/spoon/compiler/Environment.java b/src/main/java/spoon/compiler/Environment.java index fc8db85e651..aee6f216730 100644 --- a/src/main/java/spoon/compiler/Environment.java +++ b/src/main/java/spoon/compiler/Environment.java @@ -7,6 +7,11 @@ */ package spoon.compiler; +import java.io.File; +import java.nio.charset.Charset; +import java.util.List; +import java.util.function.Supplier; +import org.jspecify.annotations.Nullable; import spoon.OutputType; import spoon.compiler.builder.EncodingProvider; import spoon.processing.FileGenerator; @@ -23,13 +28,6 @@ import spoon.support.modelobs.FineModelChangeListener; import spoon.support.sniper.SniperJavaPrettyPrinter; -import java.io.File; -import java.nio.charset.Charset; -import java.util.List; -import java.util.function.Supplier; - -import org.jspecify.annotations.Nullable; - /** * This interface represents the environment in which Spoon is launched - * accessible through {@link spoon.reflect.factory.Factory#getEnvironment()}. Its diff --git a/src/main/java/spoon/compiler/SpoonFile.java b/src/main/java/spoon/compiler/SpoonFile.java index adf2db13066..31951b97e4f 100644 --- a/src/main/java/spoon/compiler/SpoonFile.java +++ b/src/main/java/spoon/compiler/SpoonFile.java @@ -7,12 +7,11 @@ */ package spoon.compiler; -import spoon.SpoonException; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import spoon.SpoonException; /** * This interface represents files that can be used as resources for the Spoon diff --git a/src/main/java/spoon/compiler/SpoonResourceHelper.java b/src/main/java/spoon/compiler/SpoonResourceHelper.java index 8d0de1eb342..33bc3efdd9b 100644 --- a/src/main/java/spoon/compiler/SpoonResourceHelper.java +++ b/src/main/java/spoon/compiler/SpoonResourceHelper.java @@ -7,16 +7,15 @@ */ package spoon.compiler; -import spoon.Launcher; -import spoon.support.compiler.FileSystemFile; -import spoon.support.compiler.FileSystemFolder; -import spoon.support.compiler.ZipFolder; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import spoon.Launcher; +import spoon.support.compiler.FileSystemFile; +import spoon.support.compiler.FileSystemFolder; +import spoon.support.compiler.ZipFolder; /** * This class defines a helper for manipulating resources. diff --git a/src/main/java/spoon/compiler/builder/EncodingProvider.java b/src/main/java/spoon/compiler/builder/EncodingProvider.java index c4de3864cc2..67abba073ec 100644 --- a/src/main/java/spoon/compiler/builder/EncodingProvider.java +++ b/src/main/java/spoon/compiler/builder/EncodingProvider.java @@ -7,8 +7,8 @@ */ package spoon.compiler.builder; -import spoon.compiler.SpoonFile; import java.nio.charset.Charset; +import spoon.compiler.SpoonFile; public interface EncodingProvider { diff --git a/src/main/java/spoon/compiler/builder/SourceOptions.java b/src/main/java/spoon/compiler/builder/SourceOptions.java index 620b5fba518..02cf9d23dc6 100644 --- a/src/main/java/spoon/compiler/builder/SourceOptions.java +++ b/src/main/java/spoon/compiler/builder/SourceOptions.java @@ -7,14 +7,13 @@ */ package spoon.compiler.builder; -import spoon.compiler.SpoonFile; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; +import spoon.compiler.SpoonFile; public class SourceOptions> extends Options { public SourceOptions() { diff --git a/src/main/java/spoon/experimental/SpoonifierVisitor.java b/src/main/java/spoon/experimental/SpoonifierVisitor.java index 1d3acd05128..8551f4fd198 100644 --- a/src/main/java/spoon/experimental/SpoonifierVisitor.java +++ b/src/main/java/spoon/experimental/SpoonifierVisitor.java @@ -7,6 +7,13 @@ */ package spoon.experimental; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.StringEscapeUtils; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtComment; @@ -32,14 +39,6 @@ import spoon.reflect.visitor.CtInheritanceScanner; import spoon.reflect.visitor.CtScanner; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Visitor that generates factory calls to recreate the AST visited. * diff --git a/src/main/java/spoon/experimental/package-info.java b/src/main/java/spoon/experimental/package-info.java index 465cd86bfa0..c2d8d4b91f8 100644 --- a/src/main/java/spoon/experimental/package-info.java +++ b/src/main/java/spoon/experimental/package-info.java @@ -9,4 +9,3 @@ * this is unstable code, subject to potential complete redesign, not only in snapshots but also in releases. you can use this code but you'll probably be impacted upon future changes. */ package spoon.experimental; - diff --git a/src/main/java/spoon/javadoc/internal/Javadoc.java b/src/main/java/spoon/javadoc/internal/Javadoc.java index f8f7a7290aa..9e9e3a1a276 100644 --- a/src/main/java/spoon/javadoc/internal/Javadoc.java +++ b/src/main/java/spoon/javadoc/internal/Javadoc.java @@ -14,7 +14,6 @@ */ package spoon.javadoc.internal; -import static spoon.javadoc.internal.JavadocInlineTag.nextWord; import java.io.Serializable; import java.util.Arrays; import java.util.Collections; @@ -25,6 +24,8 @@ import org.apache.commons.lang3.tuple.Pair; import spoon.reflect.code.CtComment; +import static spoon.javadoc.internal.JavadocInlineTag.nextWord; + /** * The structured content of a single Javadoc comment. * diff --git a/src/main/java/spoon/javadoc/internal/JavadocBlockTag.java b/src/main/java/spoon/javadoc/internal/JavadocBlockTag.java index 9e42c22a901..e0eb245e4cb 100644 --- a/src/main/java/spoon/javadoc/internal/JavadocBlockTag.java +++ b/src/main/java/spoon/javadoc/internal/JavadocBlockTag.java @@ -14,9 +14,8 @@ */ package spoon.javadoc.internal; -import spoon.reflect.code.CtJavaDocTag; - import java.io.Serializable; +import spoon.reflect.code.CtJavaDocTag; /** * A block tag. diff --git a/src/main/java/spoon/metamodel/MMMethod.java b/src/main/java/spoon/metamodel/MMMethod.java index 7ee4610ec64..795c05c1664 100644 --- a/src/main/java/spoon/metamodel/MMMethod.java +++ b/src/main/java/spoon/metamodel/MMMethod.java @@ -7,15 +7,14 @@ */ package spoon.metamodel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.SpoonException; import spoon.reflect.declaration.CtMethod; import spoon.reflect.reference.CtTypeReference; import spoon.support.adaption.TypeAdaptor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * Represents a method used to get or set a {@link MetamodelProperty} of a {@link MetamodelConcept}. */ diff --git a/src/main/java/spoon/metamodel/MMMethodKind.java b/src/main/java/spoon/metamodel/MMMethodKind.java index 51632e7a267..11dcca9befc 100644 --- a/src/main/java/spoon/metamodel/MMMethodKind.java +++ b/src/main/java/spoon/metamodel/MMMethodKind.java @@ -8,7 +8,6 @@ package spoon.metamodel; import java.util.function.Predicate; - import spoon.SpoonException; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; diff --git a/src/main/java/spoon/metamodel/Metamodel.java b/src/main/java/spoon/metamodel/Metamodel.java index 146b129c117..b2ab1afdc88 100644 --- a/src/main/java/spoon/metamodel/Metamodel.java +++ b/src/main/java/spoon/metamodel/Metamodel.java @@ -18,9 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.jspecify.annotations.Nullable; - import spoon.Launcher; import spoon.SpoonException; import spoon.reflect.annotations.PropertyGetter; diff --git a/src/main/java/spoon/metamodel/MetamodelConcept.java b/src/main/java/spoon/metamodel/MetamodelConcept.java index 41a17565d5c..e38e06701bc 100644 --- a/src/main/java/spoon/metamodel/MetamodelConcept.java +++ b/src/main/java/spoon/metamodel/MetamodelConcept.java @@ -7,15 +7,12 @@ */ package spoon.metamodel; -import static spoon.metamodel.Metamodel.addUniqueObject; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - import spoon.SpoonException; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtInterface; @@ -24,6 +21,8 @@ import spoon.reflect.path.CtRole; import spoon.support.adaption.TypeAdaptor; +import static spoon.metamodel.Metamodel.addUniqueObject; + /** * Represents a concept of the Spoon metamodel (eg {@link CtClass}). */ diff --git a/src/main/java/spoon/metamodel/MetamodelProperty.java b/src/main/java/spoon/metamodel/MetamodelProperty.java index 6fec9567163..495348e8e41 100644 --- a/src/main/java/spoon/metamodel/MetamodelProperty.java +++ b/src/main/java/spoon/metamodel/MetamodelProperty.java @@ -7,8 +7,6 @@ */ package spoon.metamodel; -import static spoon.metamodel.Metamodel.addUniqueObject; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -20,9 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.jspecify.annotations.Nullable; - import spoon.SpoonException; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; @@ -38,6 +34,8 @@ import spoon.support.UnsettableProperty; import spoon.support.util.RtHelper; +import static spoon.metamodel.Metamodel.addUniqueObject; + /** * Represents a property of the Spoon metamodel. * A property: diff --git a/src/main/java/spoon/metamodel/package-info.java b/src/main/java/spoon/metamodel/package-info.java index e7f5a483827..044cc6508b1 100644 --- a/src/main/java/spoon/metamodel/package-info.java +++ b/src/main/java/spoon/metamodel/package-info.java @@ -11,4 +11,3 @@ * So this is the metametamodel. */ package spoon.metamodel; - diff --git a/src/main/java/spoon/pattern/Generator.java b/src/main/java/spoon/pattern/Generator.java index 1fb113670b3..f05fbcc244f 100644 --- a/src/main/java/spoon/pattern/Generator.java +++ b/src/main/java/spoon/pattern/Generator.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; - import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; diff --git a/src/main/java/spoon/pattern/InlinedStatementConfigurator.java b/src/main/java/spoon/pattern/InlinedStatementConfigurator.java index 2d4545246e8..f0d9785f3a5 100644 --- a/src/main/java/spoon/pattern/InlinedStatementConfigurator.java +++ b/src/main/java/spoon/pattern/InlinedStatementConfigurator.java @@ -7,12 +7,9 @@ */ package spoon.pattern; -import static spoon.pattern.PatternBuilder.bodyToStatements; - import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; - import spoon.SpoonException; import spoon.pattern.internal.node.ForEachNode; import spoon.pattern.internal.node.ListOfNodes; @@ -32,6 +29,8 @@ import spoon.reflect.visitor.CtAbstractVisitor; import spoon.support.Experimental; +import static spoon.pattern.PatternBuilder.bodyToStatements; + /** * Builds inline statements of Pattern * diff --git a/src/main/java/spoon/pattern/Match.java b/src/main/java/spoon/pattern/Match.java index 42792402ee8..604d0ea4cf7 100644 --- a/src/main/java/spoon/pattern/Match.java +++ b/src/main/java/spoon/pattern/Match.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; - import spoon.SpoonException; import spoon.reflect.declaration.CtElement; import spoon.support.util.ImmutableMap; diff --git a/src/main/java/spoon/pattern/Pattern.java b/src/main/java/spoon/pattern/Pattern.java index cb4aade463c..54706511180 100644 --- a/src/main/java/spoon/pattern/Pattern.java +++ b/src/main/java/spoon/pattern/Pattern.java @@ -14,7 +14,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import spoon.SpoonException; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.PatternPrinter; diff --git a/src/main/java/spoon/pattern/PatternBuilder.java b/src/main/java/spoon/pattern/PatternBuilder.java index 31454334bd0..de30e1c8aca 100644 --- a/src/main/java/spoon/pattern/PatternBuilder.java +++ b/src/main/java/spoon/pattern/PatternBuilder.java @@ -18,7 +18,6 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; - import spoon.SpoonException; import spoon.pattern.internal.ValueConvertor; import spoon.pattern.internal.ValueConvertorImpl; diff --git a/src/main/java/spoon/pattern/PatternBuilderHelper.java b/src/main/java/spoon/pattern/PatternBuilderHelper.java index dab20ee335f..8fe969b7c1a 100644 --- a/src/main/java/spoon/pattern/PatternBuilderHelper.java +++ b/src/main/java/spoon/pattern/PatternBuilderHelper.java @@ -7,6 +7,9 @@ */ package spoon.pattern; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.SpoonException; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtReturn; @@ -19,10 +22,6 @@ import spoon.reflect.visitor.Filter; import spoon.support.Experimental; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * Utility class to select parts of AST to be used as a model of a {@link PatternBuilder}. * diff --git a/src/main/java/spoon/pattern/PatternParameterConfigurator.java b/src/main/java/spoon/pattern/PatternParameterConfigurator.java index 7f9ecf8952b..1ef620d6656 100644 --- a/src/main/java/spoon/pattern/PatternParameterConfigurator.java +++ b/src/main/java/spoon/pattern/PatternParameterConfigurator.java @@ -7,6 +7,10 @@ */ package spoon.pattern; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; import spoon.SpoonException; import spoon.metamodel.Metamodel; import spoon.pattern.internal.ValueConvertor; @@ -60,11 +64,6 @@ import spoon.template.Template; import spoon.template.TemplateParameter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; - import static spoon.pattern.PatternBuilder.getLocalTypeRefBySimpleName; /** diff --git a/src/main/java/spoon/pattern/internal/DefaultGenerator.java b/src/main/java/spoon/pattern/internal/DefaultGenerator.java index 56b7faaa1bc..8f3e874093b 100644 --- a/src/main/java/spoon/pattern/internal/DefaultGenerator.java +++ b/src/main/java/spoon/pattern/internal/DefaultGenerator.java @@ -7,6 +7,9 @@ */ package spoon.pattern.internal; +import java.util.List; +import java.util.Map; +import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.pattern.Generator; import spoon.pattern.PatternBuilder; @@ -31,11 +34,6 @@ import spoon.support.util.ImmutableMap; import spoon.support.util.ImmutableMapImpl; -import java.util.List; -import java.util.Map; - -import org.jspecify.annotations.Nullable; - /** * Drives generation process */ diff --git a/src/main/java/spoon/pattern/internal/PatternPrinter.java b/src/main/java/spoon/pattern/internal/PatternPrinter.java index ddb898467fc..a60b02ce90d 100644 --- a/src/main/java/spoon/pattern/internal/PatternPrinter.java +++ b/src/main/java/spoon/pattern/internal/PatternPrinter.java @@ -12,7 +12,6 @@ import java.util.Map; import java.util.TreeMap; import java.util.function.Consumer; - import spoon.metamodel.Metamodel; import spoon.metamodel.MetamodelConcept; import spoon.metamodel.MetamodelProperty; diff --git a/src/main/java/spoon/pattern/internal/ResultHolder.java b/src/main/java/spoon/pattern/internal/ResultHolder.java index 29d34046e92..486168c899f 100644 --- a/src/main/java/spoon/pattern/internal/ResultHolder.java +++ b/src/main/java/spoon/pattern/internal/ResultHolder.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.ListIterator; import java.util.function.Function; - import spoon.SpoonException; /** diff --git a/src/main/java/spoon/pattern/internal/ValueConvertorImpl.java b/src/main/java/spoon/pattern/internal/ValueConvertorImpl.java index 7982d6a4847..b92d25d936e 100644 --- a/src/main/java/spoon/pattern/internal/ValueConvertorImpl.java +++ b/src/main/java/spoon/pattern/internal/ValueConvertorImpl.java @@ -8,7 +8,6 @@ package spoon.pattern.internal; import java.util.List; - import spoon.SpoonException; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtExpression; diff --git a/src/main/java/spoon/pattern/internal/matcher/ChainOfMatchersImpl.java b/src/main/java/spoon/pattern/internal/matcher/ChainOfMatchersImpl.java index fd4f8b11101..d6045d22331 100644 --- a/src/main/java/spoon/pattern/internal/matcher/ChainOfMatchersImpl.java +++ b/src/main/java/spoon/pattern/internal/matcher/ChainOfMatchersImpl.java @@ -8,7 +8,6 @@ package spoon.pattern.internal.matcher; import java.util.List; - import spoon.SpoonException; import spoon.pattern.internal.node.RootNode; diff --git a/src/main/java/spoon/pattern/internal/matcher/MatchingScanner.java b/src/main/java/spoon/pattern/internal/matcher/MatchingScanner.java index e8d02363bbe..4245400fa5e 100644 --- a/src/main/java/spoon/pattern/internal/matcher/MatchingScanner.java +++ b/src/main/java/spoon/pattern/internal/matcher/MatchingScanner.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import spoon.SpoonException; import spoon.pattern.Match; import spoon.pattern.internal.node.ListOfNodes; diff --git a/src/main/java/spoon/pattern/internal/matcher/TobeMatched.java b/src/main/java/spoon/pattern/internal/matcher/TobeMatched.java index ea5dcb1e1bb..54763adf5ab 100644 --- a/src/main/java/spoon/pattern/internal/matcher/TobeMatched.java +++ b/src/main/java/spoon/pattern/internal/matcher/TobeMatched.java @@ -7,7 +7,6 @@ */ package spoon.pattern.internal.matcher; -import static java.util.stream.Collectors.toUnmodifiableList; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -16,13 +15,13 @@ import java.util.Objects; import java.util.Set; import java.util.function.BiFunction; - import org.jspecify.annotations.Nullable; - import spoon.SpoonException; import spoon.reflect.meta.ContainerKind; import spoon.support.util.ImmutableMap; +import static java.util.stream.Collectors.toUnmodifiableList; + /** * Describes what next has to be matched. * It consists of current `parameters` represented by {@link ImmutableMap} diff --git a/src/main/java/spoon/pattern/internal/node/ConstantNode.java b/src/main/java/spoon/pattern/internal/node/ConstantNode.java index ad536d08c7a..6e7375a0d72 100644 --- a/src/main/java/spoon/pattern/internal/node/ConstantNode.java +++ b/src/main/java/spoon/pattern/internal/node/ConstantNode.java @@ -7,14 +7,13 @@ */ package spoon.pattern.internal.node; +import java.util.function.BiConsumer; import spoon.pattern.Quantifier; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; import spoon.pattern.internal.parameter.ParameterInfo; import spoon.support.util.ImmutableMap; -import java.util.function.BiConsumer; - /** * Generates/Matches a copy of single template object */ @@ -74,4 +73,3 @@ public boolean isTryNextMatch(ImmutableMap parameters) { return false; } } - diff --git a/src/main/java/spoon/pattern/internal/node/ElementNode.java b/src/main/java/spoon/pattern/internal/node/ElementNode.java index a432d887f39..b15386ab70d 100644 --- a/src/main/java/spoon/pattern/internal/node/ElementNode.java +++ b/src/main/java/spoon/pattern/internal/node/ElementNode.java @@ -7,6 +7,17 @@ */ package spoon.pattern.internal.node; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; +import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.metamodel.Metamodel; import spoon.metamodel.MetamodelConcept; @@ -22,19 +33,6 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.support.util.ImmutableMap; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; - -import org.jspecify.annotations.Nullable; - import static spoon.pattern.internal.matcher.TobeMatched.getMatchedParameters; /** diff --git a/src/main/java/spoon/pattern/internal/node/ForEachNode.java b/src/main/java/spoon/pattern/internal/node/ForEachNode.java index 8c66d0da5df..7e82a05fc02 100644 --- a/src/main/java/spoon/pattern/internal/node/ForEachNode.java +++ b/src/main/java/spoon/pattern/internal/node/ForEachNode.java @@ -7,6 +7,8 @@ */ package spoon.pattern.internal.node; +import java.util.Map; +import java.util.function.BiConsumer; import spoon.pattern.Quantifier; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; @@ -19,9 +21,6 @@ import spoon.reflect.factory.Factory; import spoon.support.util.ImmutableMap; -import java.util.Map; -import java.util.function.BiConsumer; - /** * Pattern node of multiple occurrences of the same model, just with different parameters. * Example with three occurrences of model `System.out.println(_x_)`, with parameter `_x_` diff --git a/src/main/java/spoon/pattern/internal/node/ListOfNodes.java b/src/main/java/spoon/pattern/internal/node/ListOfNodes.java index 288bcff5a24..22b246ee028 100644 --- a/src/main/java/spoon/pattern/internal/node/ListOfNodes.java +++ b/src/main/java/spoon/pattern/internal/node/ListOfNodes.java @@ -7,6 +7,8 @@ */ package spoon.pattern.internal.node; +import java.util.List; +import java.util.function.BiConsumer; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; import spoon.pattern.internal.matcher.ChainOfMatchersImpl; @@ -15,9 +17,6 @@ import spoon.pattern.internal.parameter.ParameterInfo; import spoon.support.util.ImmutableMap; -import java.util.List; -import java.util.function.BiConsumer; - /** * List of {@link RootNode}s. The {@link RootNode}s are processed in same order like they were inserted in the list */ diff --git a/src/main/java/spoon/pattern/internal/node/MapEntryNode.java b/src/main/java/spoon/pattern/internal/node/MapEntryNode.java index 4b3c39fba1f..13e74d63c48 100644 --- a/src/main/java/spoon/pattern/internal/node/MapEntryNode.java +++ b/src/main/java/spoon/pattern/internal/node/MapEntryNode.java @@ -7,6 +7,8 @@ */ package spoon.pattern.internal.node; +import java.util.Map; +import java.util.function.BiConsumer; import spoon.SpoonException; import spoon.pattern.Quantifier; import spoon.pattern.internal.DefaultGenerator; @@ -17,9 +19,6 @@ import spoon.reflect.meta.ContainerKind; import spoon.support.util.ImmutableMap; -import java.util.Map; -import java.util.function.BiConsumer; - import static spoon.pattern.internal.matcher.TobeMatched.getMatchedParameters; /** diff --git a/src/main/java/spoon/pattern/internal/node/ParameterNode.java b/src/main/java/spoon/pattern/internal/node/ParameterNode.java index 8a9276ea978..ca225e11ea4 100644 --- a/src/main/java/spoon/pattern/internal/node/ParameterNode.java +++ b/src/main/java/spoon/pattern/internal/node/ParameterNode.java @@ -7,6 +7,7 @@ */ package spoon.pattern.internal.node; +import java.util.function.BiConsumer; import spoon.pattern.Quantifier; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; @@ -14,8 +15,6 @@ import spoon.reflect.declaration.CtElement; import spoon.support.util.ImmutableMap; -import java.util.function.BiConsumer; - /** * Represents pattern model variable * Delivers/Matches 0, 1 or more values of defined parameter. diff --git a/src/main/java/spoon/pattern/internal/node/RootNode.java b/src/main/java/spoon/pattern/internal/node/RootNode.java index 9c9366ca84d..90d10b781ea 100644 --- a/src/main/java/spoon/pattern/internal/node/RootNode.java +++ b/src/main/java/spoon/pattern/internal/node/RootNode.java @@ -8,7 +8,6 @@ package spoon.pattern.internal.node; import java.util.function.BiConsumer; - import spoon.pattern.Generator; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; diff --git a/src/main/java/spoon/pattern/internal/node/StringNode.java b/src/main/java/spoon/pattern/internal/node/StringNode.java index 7d645f24512..2029ab5f467 100644 --- a/src/main/java/spoon/pattern/internal/node/StringNode.java +++ b/src/main/java/spoon/pattern/internal/node/StringNode.java @@ -7,13 +7,6 @@ */ package spoon.pattern.internal.node; -import spoon.SpoonException; -import spoon.pattern.Quantifier; -import spoon.pattern.internal.DefaultGenerator; -import spoon.pattern.internal.ResultHolder; -import spoon.pattern.internal.parameter.ParameterInfo; -import spoon.support.util.ImmutableMap; - import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; @@ -23,6 +16,12 @@ import java.util.function.BiConsumer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import spoon.SpoonException; +import spoon.pattern.Quantifier; +import spoon.pattern.internal.DefaultGenerator; +import spoon.pattern.internal.ResultHolder; +import spoon.pattern.internal.parameter.ParameterInfo; +import spoon.support.util.ImmutableMap; /** * Delivers single String value, which is created by replacing string markers in constant String template diff --git a/src/main/java/spoon/pattern/internal/node/SwitchNode.java b/src/main/java/spoon/pattern/internal/node/SwitchNode.java index 695aaa17836..bdf9e44137c 100644 --- a/src/main/java/spoon/pattern/internal/node/SwitchNode.java +++ b/src/main/java/spoon/pattern/internal/node/SwitchNode.java @@ -7,6 +7,9 @@ */ package spoon.pattern.internal.node; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; import spoon.SpoonException; import spoon.pattern.internal.DefaultGenerator; import spoon.pattern.internal.ResultHolder; @@ -21,10 +24,6 @@ import spoon.reflect.factory.Factory; import spoon.support.util.ImmutableMap; -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiConsumer; - /** * List of conditional cases * {code} diff --git a/src/main/java/spoon/pattern/internal/parameter/AbstractParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/AbstractParameterInfo.java index 6aa5b2430e5..03025af5b5a 100644 --- a/src/main/java/spoon/pattern/internal/parameter/AbstractParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/AbstractParameterInfo.java @@ -14,7 +14,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; - import spoon.Launcher; import spoon.SpoonException; import spoon.pattern.Quantifier; diff --git a/src/main/java/spoon/pattern/internal/parameter/ComputedParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/ComputedParameterInfo.java index 996b87b3cea..3c3c7c9d838 100644 --- a/src/main/java/spoon/pattern/internal/parameter/ComputedParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/ComputedParameterInfo.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.function.Function; - import spoon.SpoonException; import spoon.pattern.internal.ResultHolder; import spoon.reflect.factory.Factory; diff --git a/src/main/java/spoon/pattern/internal/parameter/ListParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/ListParameterInfo.java index 8c3629f9e8a..cb0f959a81f 100644 --- a/src/main/java/spoon/pattern/internal/parameter/ListParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/ListParameterInfo.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Set; import java.util.function.Function; - import spoon.support.util.ImmutableMap; /** diff --git a/src/main/java/spoon/pattern/internal/parameter/MapParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/MapParameterInfo.java index b291b16da94..aa90ea51c63 100644 --- a/src/main/java/spoon/pattern/internal/parameter/MapParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/MapParameterInfo.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.function.Function; - import spoon.support.util.ImmutableMap; import spoon.support.util.ImmutableMapImpl; diff --git a/src/main/java/spoon/pattern/internal/parameter/ParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/ParameterInfo.java index 5683465754e..6461d2c701a 100644 --- a/src/main/java/spoon/pattern/internal/parameter/ParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/ParameterInfo.java @@ -8,7 +8,6 @@ package spoon.pattern.internal.parameter; import org.jspecify.annotations.Nullable; - import spoon.pattern.Pattern; import spoon.pattern.Quantifier; import spoon.pattern.internal.ResultHolder; diff --git a/src/main/java/spoon/pattern/internal/parameter/SetParameterInfo.java b/src/main/java/spoon/pattern/internal/parameter/SetParameterInfo.java index 219add07644..06b746ec6c8 100644 --- a/src/main/java/spoon/pattern/internal/parameter/SetParameterInfo.java +++ b/src/main/java/spoon/pattern/internal/parameter/SetParameterInfo.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Set; import java.util.function.Function; - import spoon.support.util.ImmutableMap; /** diff --git a/src/main/java/spoon/processing/AbstractAnnotationProcessor.java b/src/main/java/spoon/processing/AbstractAnnotationProcessor.java index c4978a86b97..a51e242c943 100644 --- a/src/main/java/spoon/processing/AbstractAnnotationProcessor.java +++ b/src/main/java/spoon/processing/AbstractAnnotationProcessor.java @@ -14,7 +14,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; - import spoon.Launcher; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/processing/AbstractManualProcessor.java b/src/main/java/spoon/processing/AbstractManualProcessor.java index 53814bbda5f..dc20d1340d6 100644 --- a/src/main/java/spoon/processing/AbstractManualProcessor.java +++ b/src/main/java/spoon/processing/AbstractManualProcessor.java @@ -7,13 +7,12 @@ */ package spoon.processing; +import java.util.Set; import spoon.compiler.Environment; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; import spoon.testing.utils.ProcessorUtils; -import java.util.Set; - /** * This class defines an abstract processor to be subclassed by the user for * defining new manual processors. A manual processor should override the init diff --git a/src/main/java/spoon/processing/AbstractParallelProcessor.java b/src/main/java/spoon/processing/AbstractParallelProcessor.java index 560f240fd4b..72c1bfdad5d 100644 --- a/src/main/java/spoon/processing/AbstractParallelProcessor.java +++ b/src/main/java/spoon/processing/AbstractParallelProcessor.java @@ -17,7 +17,6 @@ import java.util.concurrent.Future; import java.util.function.Consumer; import java.util.stream.StreamSupport; - import spoon.SpoonException; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/processing/AbstractProcessor.java b/src/main/java/spoon/processing/AbstractProcessor.java index e8fa4d7d52b..5066804ef9a 100644 --- a/src/main/java/spoon/processing/AbstractProcessor.java +++ b/src/main/java/spoon/processing/AbstractProcessor.java @@ -7,6 +7,9 @@ */ package spoon.processing; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.declaration.CtElement; @@ -14,10 +17,6 @@ import spoon.support.Level; import spoon.testing.utils.ProcessorUtils; -import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Set; - /** * This class defines an abstract processor to be subclassed by the user for * defining new processors. diff --git a/src/main/java/spoon/processing/AnnotationProcessor.java b/src/main/java/spoon/processing/AnnotationProcessor.java index 736a92b8574..6b19357e6b5 100644 --- a/src/main/java/spoon/processing/AnnotationProcessor.java +++ b/src/main/java/spoon/processing/AnnotationProcessor.java @@ -9,7 +9,6 @@ import java.lang.annotation.Annotation; import java.util.Set; - import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/processing/FileGenerator.java b/src/main/java/spoon/processing/FileGenerator.java index c453034e15c..f347c3f63e5 100644 --- a/src/main/java/spoon/processing/FileGenerator.java +++ b/src/main/java/spoon/processing/FileGenerator.java @@ -9,7 +9,6 @@ import java.io.File; import java.util.List; - import spoon.reflect.declaration.CtElement; /** diff --git a/src/main/java/spoon/processing/ProcessingManager.java b/src/main/java/spoon/processing/ProcessingManager.java index eb0ec23ab47..261cde32ba2 100644 --- a/src/main/java/spoon/processing/ProcessingManager.java +++ b/src/main/java/spoon/processing/ProcessingManager.java @@ -8,7 +8,6 @@ package spoon.processing; import java.util.Collection; - import spoon.reflect.declaration.CtElement; /** diff --git a/src/main/java/spoon/processing/Processor.java b/src/main/java/spoon/processing/Processor.java index f217bfb957d..d4fefcb6c16 100644 --- a/src/main/java/spoon/processing/Processor.java +++ b/src/main/java/spoon/processing/Processor.java @@ -7,11 +7,10 @@ */ package spoon.processing; +import java.util.Set; import spoon.compiler.Environment; import spoon.reflect.declaration.CtElement; -import java.util.Set; - /** * This interface defines a generic code processor. To define a new processor, * the user should subclass {@link spoon.processing.AbstractProcessor}, the diff --git a/src/main/java/spoon/processing/ProcessorPropertiesImpl.java b/src/main/java/spoon/processing/ProcessorPropertiesImpl.java index 3f5030702f9..746b2423e53 100644 --- a/src/main/java/spoon/processing/ProcessorPropertiesImpl.java +++ b/src/main/java/spoon/processing/ProcessorPropertiesImpl.java @@ -7,10 +7,9 @@ */ package spoon.processing; -import org.apache.commons.lang3.ClassUtils; - import java.util.HashMap; import java.util.Map; +import org.apache.commons.lang3.ClassUtils; public class ProcessorPropertiesImpl implements ProcessorProperties { private final Map _properties = new HashMap<>(); diff --git a/src/main/java/spoon/refactoring/AbstractRenameRefactoring.java b/src/main/java/spoon/refactoring/AbstractRenameRefactoring.java index f65c70ba3fb..795e7e0d5c8 100644 --- a/src/main/java/spoon/refactoring/AbstractRenameRefactoring.java +++ b/src/main/java/spoon/refactoring/AbstractRenameRefactoring.java @@ -8,7 +8,6 @@ package spoon.refactoring; import java.util.regex.Pattern; - import spoon.SpoonException; import spoon.reflect.declaration.CtNamedElement; diff --git a/src/main/java/spoon/refactoring/CtParameterRemoveRefactoring.java b/src/main/java/spoon/refactoring/CtParameterRemoveRefactoring.java index 7837c1d5aed..dba171d1eed 100644 --- a/src/main/java/spoon/refactoring/CtParameterRemoveRefactoring.java +++ b/src/main/java/spoon/refactoring/CtParameterRemoveRefactoring.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import spoon.SpoonException; import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; diff --git a/src/main/java/spoon/refactoring/CtRenameLocalVariableRefactoring.java b/src/main/java/spoon/refactoring/CtRenameLocalVariableRefactoring.java index 5c13d6d519d..d771c77ec03 100644 --- a/src/main/java/spoon/refactoring/CtRenameLocalVariableRefactoring.java +++ b/src/main/java/spoon/refactoring/CtRenameLocalVariableRefactoring.java @@ -9,7 +9,6 @@ import java.util.Collection; import java.util.regex.Pattern; - import spoon.SpoonException; import spoon.reflect.code.CtCatchVariable; import spoon.reflect.code.CtLocalVariable; diff --git a/src/main/java/spoon/refactoring/MethodCallState.java b/src/main/java/spoon/refactoring/MethodCallState.java index d7871b07762..0b05a7babaa 100644 --- a/src/main/java/spoon/refactoring/MethodCallState.java +++ b/src/main/java/spoon/refactoring/MethodCallState.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.Collection; - import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtType; diff --git a/src/main/java/spoon/refactoring/MethodInvocationSearch.java b/src/main/java/spoon/refactoring/MethodInvocationSearch.java index f7eb40f53a0..25e1a75818a 100644 --- a/src/main/java/spoon/refactoring/MethodInvocationSearch.java +++ b/src/main/java/spoon/refactoring/MethodInvocationSearch.java @@ -7,17 +7,16 @@ */ package spoon.refactoring; -import java.util.HashSet; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; - import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtLambda; diff --git a/src/main/java/spoon/refactoring/Refactoring.java b/src/main/java/spoon/refactoring/Refactoring.java index 1f0bc3b32fd..aabb9efe7b5 100644 --- a/src/main/java/spoon/refactoring/Refactoring.java +++ b/src/main/java/spoon/refactoring/Refactoring.java @@ -7,6 +7,7 @@ */ package spoon.refactoring; +import java.util.List; import spoon.SpoonException; import spoon.reflect.code.CtLocalVariable; import spoon.reflect.declaration.CtExecutable; @@ -20,8 +21,6 @@ import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.List; - /** * Contains all methods to refactor code elements in the AST. */ diff --git a/src/main/java/spoon/reflect/CtModel.java b/src/main/java/spoon/reflect/CtModel.java index 317d06d034e..6f4cfaa7a95 100644 --- a/src/main/java/spoon/reflect/CtModel.java +++ b/src/main/java/spoon/reflect/CtModel.java @@ -7,6 +7,9 @@ */ package spoon.reflect; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; import spoon.SpoonModelBuilder; import spoon.processing.Processor; import spoon.reflect.declaration.CtElement; @@ -16,10 +19,6 @@ import spoon.reflect.visitor.Filter; import spoon.reflect.visitor.chain.CtQueryable; -import java.io.Serializable; -import java.util.Collection; -import java.util.List; - /** represents a Java program, modeled by a set of compile-time (Ct) objects * where each object is a program element (for instance, a CtClass represents a class). */ diff --git a/src/main/java/spoon/reflect/CtModelImpl.java b/src/main/java/spoon/reflect/CtModelImpl.java index fa24c7432bd..5254d6c9014 100644 --- a/src/main/java/spoon/reflect/CtModelImpl.java +++ b/src/main/java/spoon/reflect/CtModelImpl.java @@ -7,6 +7,10 @@ */ package spoon.reflect; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import spoon.processing.Processor; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtModule; @@ -23,11 +27,6 @@ import spoon.support.QueueProcessingManager; import spoon.support.reflect.declaration.CtPackageImpl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - public class CtModelImpl implements CtModel { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java b/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java index 9204f637d55..adbea8ab98a 100644 --- a/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java +++ b/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java @@ -17,16 +17,16 @@ public final class ModelElementContainerDefaultCapacities { /* * Author Roman Leventov - * - * Some element types were analyzed through JDK 7 sources, - * others chosen for my feelings only. - * - * For those I have precise averages, I choose to take a ceiling of that - * average as the default capacity. This choice is biased towards performing - * less container resizes, rather deadly memory efficiency. Not sure this is - * the right choice, for most Spoon use-cases, but anyway this is better - * than ArrayList's default of 10. - */ + * + * Some element types were analyzed through JDK 7 sources, + * others chosen for my feelings only. + * + * For those I have precise averages, I choose to take a ceiling of that + * average as the default capacity. This choice is biased towards performing + * less container resizes, rather deadly memory efficiency. Not sure this is + * the right choice, for most Spoon use-cases, but anyway this is better + * than ArrayList's default of 10. + */ // JDK 7 average is 1.063 (methods), 1.207 (constructors) public static final int PARAMETERS_CONTAINER_DEFAULT_CAPACITY = 2; diff --git a/src/main/java/spoon/reflect/ModelStreamer.java b/src/main/java/spoon/reflect/ModelStreamer.java index e220c291062..3811813c544 100644 --- a/src/main/java/spoon/reflect/ModelStreamer.java +++ b/src/main/java/spoon/reflect/ModelStreamer.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; - import spoon.compiler.Environment; import spoon.reflect.factory.Factory; import spoon.support.CompressionType; diff --git a/src/main/java/spoon/reflect/annotations/MetamodelPropertyField.java b/src/main/java/spoon/reflect/annotations/MetamodelPropertyField.java index 312f716ef97..23764725cfb 100644 --- a/src/main/java/spoon/reflect/annotations/MetamodelPropertyField.java +++ b/src/main/java/spoon/reflect/annotations/MetamodelPropertyField.java @@ -7,13 +7,12 @@ */ package spoon.reflect.annotations; -import spoon.reflect.declaration.CtNamedElement; -import spoon.reflect.path.CtRole; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import spoon.reflect.declaration.CtNamedElement; +import spoon.reflect.path.CtRole; /** * Tells that a field is a property of the metamodel diff --git a/src/main/java/spoon/reflect/annotations/PropertyGetter.java b/src/main/java/spoon/reflect/annotations/PropertyGetter.java index 797e1d587b4..44492a13dfb 100644 --- a/src/main/java/spoon/reflect/annotations/PropertyGetter.java +++ b/src/main/java/spoon/reflect/annotations/PropertyGetter.java @@ -7,12 +7,11 @@ */ package spoon.reflect.annotations; -import spoon.reflect.path.CtRole; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import spoon.reflect.path.CtRole; /** * Specifies that a method is an official metamodel getter in the Spoon metamodel. diff --git a/src/main/java/spoon/reflect/annotations/PropertySetter.java b/src/main/java/spoon/reflect/annotations/PropertySetter.java index 7745dab3423..aad85010192 100644 --- a/src/main/java/spoon/reflect/annotations/PropertySetter.java +++ b/src/main/java/spoon/reflect/annotations/PropertySetter.java @@ -7,12 +7,11 @@ */ package spoon.reflect.annotations; -import spoon.reflect.path.CtRole; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import spoon.reflect.path.CtRole; /** * Specifies that a method is an official metamodel setter in the Spoon metamodel. diff --git a/src/main/java/spoon/reflect/code/CtAbstractInvocation.java b/src/main/java/spoon/reflect/code/CtAbstractInvocation.java index a2d39dc8d2c..00fc207d3f9 100644 --- a/src/main/java/spoon/reflect/code/CtAbstractInvocation.java +++ b/src/main/java/spoon/reflect/code/CtAbstractInvocation.java @@ -7,12 +7,11 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.reference.CtExecutableReference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; - -import java.util.List; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.reference.CtExecutableReference; import static spoon.reflect.path.CtRole.ARGUMENT; import static spoon.reflect.path.CtRole.EXECUTABLE_REF; diff --git a/src/main/java/spoon/reflect/code/CtAbstractSwitch.java b/src/main/java/spoon/reflect/code/CtAbstractSwitch.java index 84a91877e01..53f62a5281f 100644 --- a/src/main/java/spoon/reflect/code/CtAbstractSwitch.java +++ b/src/main/java/spoon/reflect/code/CtAbstractSwitch.java @@ -7,12 +7,11 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtElement; -import java.util.List; - import static spoon.reflect.path.CtRole.CASE; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/reflect/code/CtAnnotationFieldAccess.java b/src/main/java/spoon/reflect/code/CtAnnotationFieldAccess.java index ff8570c867a..c03eb6d3316 100644 --- a/src/main/java/spoon/reflect/code/CtAnnotationFieldAccess.java +++ b/src/main/java/spoon/reflect/code/CtAnnotationFieldAccess.java @@ -7,8 +7,8 @@ */ package spoon.reflect.code; -import spoon.reflect.reference.CtFieldReference; import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.reference.CtFieldReference; import static spoon.reflect.path.CtRole.VARIABLE; diff --git a/src/main/java/spoon/reflect/code/CtBinaryOperator.java b/src/main/java/spoon/reflect/code/CtBinaryOperator.java index b731116acd4..5b17838357a 100644 --- a/src/main/java/spoon/reflect/code/CtBinaryOperator.java +++ b/src/main/java/spoon/reflect/code/CtBinaryOperator.java @@ -10,8 +10,8 @@ import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import static spoon.reflect.path.CtRole.OPERATOR_KIND; import static spoon.reflect.path.CtRole.LEFT_OPERAND; +import static spoon.reflect.path.CtRole.OPERATOR_KIND; import static spoon.reflect.path.CtRole.RIGHT_OPERAND; /** diff --git a/src/main/java/spoon/reflect/code/CtBodyHolder.java b/src/main/java/spoon/reflect/code/CtBodyHolder.java index 0c8694943b9..b8df6546bd2 100644 --- a/src/main/java/spoon/reflect/code/CtBodyHolder.java +++ b/src/main/java/spoon/reflect/code/CtBodyHolder.java @@ -7,9 +7,9 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.CtElement; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.declaration.CtElement; import static spoon.reflect.path.CtRole.BODY; diff --git a/src/main/java/spoon/reflect/code/CtCase.java b/src/main/java/spoon/reflect/code/CtCase.java index b6888801314..a31ebaa2424 100644 --- a/src/main/java/spoon/reflect/code/CtCase.java +++ b/src/main/java/spoon/reflect/code/CtCase.java @@ -7,13 +7,12 @@ */ package spoon.reflect.code; +import java.util.List; import org.jspecify.annotations.Nullable; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; -import java.util.List; - import static spoon.reflect.path.CtRole.CASE_KIND; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/reflect/code/CtComment.java b/src/main/java/spoon/reflect/code/CtComment.java index 69f276e67c0..90a8b84c714 100644 --- a/src/main/java/spoon/reflect/code/CtComment.java +++ b/src/main/java/spoon/reflect/code/CtComment.java @@ -11,8 +11,8 @@ import spoon.reflect.annotations.PropertySetter; import spoon.support.DerivedProperty; -import static spoon.reflect.path.CtRole.COMMENT_TYPE; import static spoon.reflect.path.CtRole.COMMENT_CONTENT; +import static spoon.reflect.path.CtRole.COMMENT_TYPE; /** * This code element defines a comment @@ -72,7 +72,7 @@ enum CommentType { /** * Get the type of the comment - * @return the comment type + * @return the comment type */ @PropertyGetter(role = COMMENT_TYPE) CommentType getCommentType(); diff --git a/src/main/java/spoon/reflect/code/CtConstructorCall.java b/src/main/java/spoon/reflect/code/CtConstructorCall.java index d747e7f7797..68a4fbf9ff2 100644 --- a/src/main/java/spoon/reflect/code/CtConstructorCall.java +++ b/src/main/java/spoon/reflect/code/CtConstructorCall.java @@ -7,15 +7,14 @@ */ package spoon.reflect.code; +import java.util.List; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.reference.CtActualTypeContainer; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.DefaultCoreFactory; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; - -import java.util.List; import static spoon.reflect.path.CtRole.TYPE; import static spoon.reflect.path.CtRole.TYPE_ARGUMENT; diff --git a/src/main/java/spoon/reflect/code/CtExecutableReferenceExpression.java b/src/main/java/spoon/reflect/code/CtExecutableReferenceExpression.java index 8336ae1d921..db564bf3c8f 100644 --- a/src/main/java/spoon/reflect/code/CtExecutableReferenceExpression.java +++ b/src/main/java/spoon/reflect/code/CtExecutableReferenceExpression.java @@ -7,9 +7,9 @@ */ package spoon.reflect.code; -import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtExecutableReference; import static spoon.reflect.path.CtRole.EXECUTABLE_REF; diff --git a/src/main/java/spoon/reflect/code/CtExpression.java b/src/main/java/spoon/reflect/code/CtExpression.java index 0d21acd643d..fe3c635a40e 100644 --- a/src/main/java/spoon/reflect/code/CtExpression.java +++ b/src/main/java/spoon/reflect/code/CtExpression.java @@ -7,14 +7,13 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.CtTypedElement; -import spoon.reflect.reference.CtTypeReference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.declaration.CtTypedElement; +import spoon.reflect.reference.CtTypeReference; import spoon.template.TemplateParameter; -import java.util.List; - import static spoon.reflect.path.CtRole.CAST; /** diff --git a/src/main/java/spoon/reflect/code/CtFieldAccess.java b/src/main/java/spoon/reflect/code/CtFieldAccess.java index 767e1e88994..9b1b811e2e2 100644 --- a/src/main/java/spoon/reflect/code/CtFieldAccess.java +++ b/src/main/java/spoon/reflect/code/CtFieldAccess.java @@ -7,8 +7,8 @@ */ package spoon.reflect.code; -import spoon.reflect.reference.CtFieldReference; import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.reference.CtFieldReference; import static spoon.reflect.path.CtRole.VARIABLE; diff --git a/src/main/java/spoon/reflect/code/CtFor.java b/src/main/java/spoon/reflect/code/CtFor.java index 106d55d7a72..c449174f523 100644 --- a/src/main/java/spoon/reflect/code/CtFor.java +++ b/src/main/java/spoon/reflect/code/CtFor.java @@ -7,11 +7,10 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.List; - import static spoon.reflect.path.CtRole.EXPRESSION; import static spoon.reflect.path.CtRole.FOR_INIT; import static spoon.reflect.path.CtRole.FOR_UPDATE; diff --git a/src/main/java/spoon/reflect/code/CtInvocation.java b/src/main/java/spoon/reflect/code/CtInvocation.java index f9bcc3376b3..d725077b9db 100644 --- a/src/main/java/spoon/reflect/code/CtInvocation.java +++ b/src/main/java/spoon/reflect/code/CtInvocation.java @@ -7,14 +7,13 @@ */ package spoon.reflect.code; +import java.util.List; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.reference.CtActualTypeContainer; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; - -import java.util.List; import static spoon.reflect.path.CtRole.TYPE; import static spoon.reflect.path.CtRole.TYPE_ARGUMENT; diff --git a/src/main/java/spoon/reflect/code/CtJavaDoc.java b/src/main/java/spoon/reflect/code/CtJavaDoc.java index 9e48d5bacbe..05f68a37cce 100644 --- a/src/main/java/spoon/reflect/code/CtJavaDoc.java +++ b/src/main/java/spoon/reflect/code/CtJavaDoc.java @@ -7,12 +7,11 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.javadoc.internal.JavadocDescriptionElement; -import spoon.support.DerivedProperty; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; - -import java.util.List; +import spoon.support.DerivedProperty; import static spoon.reflect.path.CtRole.COMMENT_TAG; diff --git a/src/main/java/spoon/reflect/code/CtJavaDocTag.java b/src/main/java/spoon/reflect/code/CtJavaDocTag.java index 13eea9facea..fffa6e98be4 100644 --- a/src/main/java/spoon/reflect/code/CtJavaDocTag.java +++ b/src/main/java/spoon/reflect/code/CtJavaDocTag.java @@ -7,14 +7,13 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.CtElement; +import java.util.Arrays; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.declaration.CtElement; -import java.util.Arrays; - -import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE; import static spoon.reflect.path.CtRole.COMMENT_CONTENT; +import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE; import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE_REALNAME; import static spoon.reflect.path.CtRole.JAVADOC_TAG_VALUE; diff --git a/src/main/java/spoon/reflect/code/CtLambda.java b/src/main/java/spoon/reflect/code/CtLambda.java index f20e6d20aa7..d565d7f20a2 100644 --- a/src/main/java/spoon/reflect/code/CtLambda.java +++ b/src/main/java/spoon/reflect/code/CtLambda.java @@ -7,18 +7,17 @@ */ package spoon.reflect.code; +import java.util.Set; import org.jspecify.annotations.Nullable; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtReceiverParameter; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import spoon.support.UnsettableProperty; -import java.util.Set; - import static spoon.reflect.path.CtRole.EXPRESSION; /** diff --git a/src/main/java/spoon/reflect/code/CtNewArray.java b/src/main/java/spoon/reflect/code/CtNewArray.java index b7a5fa605bc..c07820d0898 100644 --- a/src/main/java/spoon/reflect/code/CtNewArray.java +++ b/src/main/java/spoon/reflect/code/CtNewArray.java @@ -7,11 +7,10 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.List; - import static spoon.reflect.path.CtRole.DIMENSION; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/reflect/code/CtNewClass.java b/src/main/java/spoon/reflect/code/CtNewClass.java index fc09af8868c..851f3c76b88 100644 --- a/src/main/java/spoon/reflect/code/CtNewClass.java +++ b/src/main/java/spoon/reflect/code/CtNewClass.java @@ -7,6 +7,7 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtClass; @@ -15,8 +16,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import java.util.List; - import static spoon.reflect.path.CtRole.NESTED_TYPE; import static spoon.reflect.path.CtRole.TYPE_ARGUMENT; diff --git a/src/main/java/spoon/reflect/code/CtRHSReceiver.java b/src/main/java/spoon/reflect/code/CtRHSReceiver.java index 0811a6e5cd8..b8846179518 100644 --- a/src/main/java/spoon/reflect/code/CtRHSReceiver.java +++ b/src/main/java/spoon/reflect/code/CtRHSReceiver.java @@ -7,9 +7,9 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.CtField; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.declaration.CtField; import static spoon.reflect.path.CtRole.ASSIGNMENT; diff --git a/src/main/java/spoon/reflect/code/CtRecordPattern.java b/src/main/java/spoon/reflect/code/CtRecordPattern.java index 398fa566a60..b942fe85346 100644 --- a/src/main/java/spoon/reflect/code/CtRecordPattern.java +++ b/src/main/java/spoon/reflect/code/CtRecordPattern.java @@ -7,14 +7,13 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; import spoon.support.UnsettableProperty; -import java.util.List; - // TODO (440) metamodel /** diff --git a/src/main/java/spoon/reflect/code/CtStatement.java b/src/main/java/spoon/reflect/code/CtStatement.java index 12e4073a453..99059208a27 100644 --- a/src/main/java/spoon/reflect/code/CtStatement.java +++ b/src/main/java/spoon/reflect/code/CtStatement.java @@ -7,9 +7,9 @@ */ package spoon.reflect.code; -import spoon.reflect.declaration.ParentNotInitializedException; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.declaration.ParentNotInitializedException; import static spoon.reflect.path.CtRole.LABEL; diff --git a/src/main/java/spoon/reflect/code/CtStatementList.java b/src/main/java/spoon/reflect/code/CtStatementList.java index 21999a14046..27a8fb54dae 100644 --- a/src/main/java/spoon/reflect/code/CtStatementList.java +++ b/src/main/java/spoon/reflect/code/CtStatementList.java @@ -7,13 +7,12 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.visitor.Filter; import spoon.support.DerivedProperty; -import java.util.List; - import static spoon.reflect.path.CtRole.STATEMENT; /** diff --git a/src/main/java/spoon/reflect/code/CtTry.java b/src/main/java/spoon/reflect/code/CtTry.java index b359e2f550d..0d4f055395d 100644 --- a/src/main/java/spoon/reflect/code/CtTry.java +++ b/src/main/java/spoon/reflect/code/CtTry.java @@ -7,12 +7,11 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.template.TemplateParameter; -import java.util.List; - import static spoon.reflect.path.CtRole.BODY; import static spoon.reflect.path.CtRole.CATCH; import static spoon.reflect.path.CtRole.FINALIZER; diff --git a/src/main/java/spoon/reflect/code/CtTryWithResource.java b/src/main/java/spoon/reflect/code/CtTryWithResource.java index 16774c5b1a7..27ed565d8e3 100644 --- a/src/main/java/spoon/reflect/code/CtTryWithResource.java +++ b/src/main/java/spoon/reflect/code/CtTryWithResource.java @@ -7,11 +7,10 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.List; - import static spoon.reflect.path.CtRole.TRY_RESOURCE; /** diff --git a/src/main/java/spoon/reflect/code/CtTypePattern.java b/src/main/java/spoon/reflect/code/CtTypePattern.java index 400cbab2dbf..9bd195bbb05 100644 --- a/src/main/java/spoon/reflect/code/CtTypePattern.java +++ b/src/main/java/spoon/reflect/code/CtTypePattern.java @@ -7,13 +7,12 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.reference.CtTypeReference; import spoon.support.UnsettableProperty; -import java.util.List; - import static spoon.reflect.path.CtRole.VARIABLE; /** diff --git a/src/main/java/spoon/reflect/code/CtUnnamedPattern.java b/src/main/java/spoon/reflect/code/CtUnnamedPattern.java index a12717413a6..48e74bdb048 100644 --- a/src/main/java/spoon/reflect/code/CtUnnamedPattern.java +++ b/src/main/java/spoon/reflect/code/CtUnnamedPattern.java @@ -7,11 +7,10 @@ */ package spoon.reflect.code; +import java.util.List; import spoon.reflect.reference.CtTypeReference; import spoon.support.UnsettableProperty; -import java.util.List; - /** * This code element defines an unnamed pattern, introduced in Java 2 * by JEP 456. diff --git a/src/main/java/spoon/reflect/code/CtVariableAccess.java b/src/main/java/spoon/reflect/code/CtVariableAccess.java index 7b46568706b..00960d78c98 100644 --- a/src/main/java/spoon/reflect/code/CtVariableAccess.java +++ b/src/main/java/spoon/reflect/code/CtVariableAccess.java @@ -7,11 +7,11 @@ */ package spoon.reflect.code; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtVariableReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import static spoon.reflect.path.CtRole.VARIABLE; diff --git a/src/main/java/spoon/reflect/cu/SourcePosition.java b/src/main/java/spoon/reflect/cu/SourcePosition.java index 70df780b9ed..d26a76ae845 100644 --- a/src/main/java/spoon/reflect/cu/SourcePosition.java +++ b/src/main/java/spoon/reflect/cu/SourcePosition.java @@ -7,11 +7,10 @@ */ package spoon.reflect.cu; -import spoon.compiler.Environment; -import spoon.reflect.cu.position.NoSourcePosition; - import java.io.File; import java.io.Serializable; +import spoon.compiler.Environment; +import spoon.reflect.cu.position.NoSourcePosition; /** * This interface represents the position of a program element in a source file. diff --git a/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java b/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java index f724968852e..fdb454ae5c8 100644 --- a/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java +++ b/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java @@ -7,12 +7,11 @@ */ package spoon.reflect.cu.position; +import java.io.File; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.support.reflect.cu.CompilationUnitImpl; -import java.io.File; - /** * This class represents the position of a program element in a source file. */ diff --git a/src/main/java/spoon/reflect/declaration/CtAnnotation.java b/src/main/java/spoon/reflect/declaration/CtAnnotation.java index a44d767bf62..aab8526b2d6 100644 --- a/src/main/java/spoon/reflect/declaration/CtAnnotation.java +++ b/src/main/java/spoon/reflect/declaration/CtAnnotation.java @@ -7,6 +7,11 @@ */ package spoon.reflect.declaration; +import java.lang.annotation.Annotation; +import java.util.List; +import java.util.Map; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFieldAccess; import spoon.reflect.code.CtLiteral; @@ -15,14 +20,8 @@ import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import spoon.support.UnsettableProperty; -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Map; - import static spoon.reflect.path.CtRole.ANNOTATION_TYPE; import static spoon.reflect.path.CtRole.VALUE; diff --git a/src/main/java/spoon/reflect/declaration/CtAnnotationMethod.java b/src/main/java/spoon/reflect/declaration/CtAnnotationMethod.java index 4f6760d4ed3..163098fa0a2 100644 --- a/src/main/java/spoon/reflect/declaration/CtAnnotationMethod.java +++ b/src/main/java/spoon/reflect/declaration/CtAnnotationMethod.java @@ -7,18 +7,17 @@ */ package spoon.reflect.declaration; +import java.util.List; +import java.util.Set; import org.jspecify.annotations.Nullable; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtBodyHolder; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtStatement; import spoon.reflect.reference.CtTypeReference; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import spoon.support.UnsettableProperty; -import java.util.List; -import java.util.Set; - import static spoon.reflect.path.CtRole.DEFAULT_EXPRESSION; /** diff --git a/src/main/java/spoon/reflect/declaration/CtAnnotationType.java b/src/main/java/spoon/reflect/declaration/CtAnnotationType.java index 110b6227546..c2790900443 100644 --- a/src/main/java/spoon/reflect/declaration/CtAnnotationType.java +++ b/src/main/java/spoon/reflect/declaration/CtAnnotationType.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; -import spoon.support.DerivedProperty; -import spoon.support.UnsettableProperty; - import java.lang.annotation.Annotation; import java.util.List; import java.util.Set; +import spoon.reflect.reference.CtTypeReference; +import spoon.support.DerivedProperty; +import spoon.support.UnsettableProperty; /** * This element defines an annotation type. diff --git a/src/main/java/spoon/reflect/declaration/CtAnonymousExecutable.java b/src/main/java/spoon/reflect/declaration/CtAnonymousExecutable.java index 7de160ec7b7..c4a5a967559 100644 --- a/src/main/java/spoon/reflect/declaration/CtAnonymousExecutable.java +++ b/src/main/java/spoon/reflect/declaration/CtAnonymousExecutable.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; +import java.util.List; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.reflect.reference.CtTypeReference; import spoon.support.UnsettableProperty; -import java.util.List; -import java.util.Set; - /** * This element defines an anonymous executable block declaration in a class. * diff --git a/src/main/java/spoon/reflect/declaration/CtClass.java b/src/main/java/spoon/reflect/declaration/CtClass.java index 531dc6dca1b..cb047d0887b 100644 --- a/src/main/java/spoon/reflect/declaration/CtClass.java +++ b/src/main/java/spoon/reflect/declaration/CtClass.java @@ -7,18 +7,17 @@ */ package spoon.reflect.declaration; +import java.util.List; +import java.util.Set; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtStatement; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; -import java.util.List; -import java.util.Set; - -import static spoon.reflect.path.CtRole.CONSTRUCTOR; import static spoon.reflect.path.CtRole.ANNONYMOUS_EXECUTABLE; +import static spoon.reflect.path.CtRole.CONSTRUCTOR; /** * This element represents a class declaration. diff --git a/src/main/java/spoon/reflect/declaration/CtCompilationUnit.java b/src/main/java/spoon/reflect/declaration/CtCompilationUnit.java index 606d827e1e3..15778099f46 100644 --- a/src/main/java/spoon/reflect/declaration/CtCompilationUnit.java +++ b/src/main/java/spoon/reflect/declaration/CtCompilationUnit.java @@ -10,7 +10,6 @@ import java.io.File; import java.util.Collection; import java.util.List; - import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.cu.SourcePosition; diff --git a/src/main/java/spoon/reflect/declaration/CtConstructor.java b/src/main/java/spoon/reflect/declaration/CtConstructor.java index ee79386b105..1db64bb4a02 100644 --- a/src/main/java/spoon/reflect/declaration/CtConstructor.java +++ b/src/main/java/spoon/reflect/declaration/CtConstructor.java @@ -7,13 +7,14 @@ */ package spoon.reflect.declaration; -import static spoon.reflect.path.CtRole.NAME; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; import spoon.support.UnsettableProperty; +import static spoon.reflect.path.CtRole.NAME; + /** * This element defines a constructor declaration. */ diff --git a/src/main/java/spoon/reflect/declaration/CtElement.java b/src/main/java/spoon/reflect/declaration/CtElement.java index 183d36d842e..f0a64c1c3f4 100644 --- a/src/main/java/spoon/reflect/declaration/CtElement.java +++ b/src/main/java/spoon/reflect/declaration/CtElement.java @@ -7,8 +7,17 @@ */ package spoon.reflect.declaration; +import java.io.Serializable; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import spoon.compiler.Environment; import spoon.processing.FactoryAccessor; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtComment; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.SourcePositionHolder; @@ -20,19 +29,9 @@ import spoon.reflect.visitor.Root; import spoon.reflect.visitor.chain.CtQueryable; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import spoon.support.Experimental; import spoon.support.sniper.internal.ElementSourceFragment; -import java.io.Serializable; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - import static spoon.reflect.path.CtRole.ANNOTATION; import static spoon.reflect.path.CtRole.COMMENT; import static spoon.reflect.path.CtRole.IS_IMPLICIT; diff --git a/src/main/java/spoon/reflect/declaration/CtEnum.java b/src/main/java/spoon/reflect/declaration/CtEnum.java index fe6dc822367..a05f434e15f 100644 --- a/src/main/java/spoon/reflect/declaration/CtEnum.java +++ b/src/main/java/spoon/reflect/declaration/CtEnum.java @@ -7,16 +7,15 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; +import java.util.Collection; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.util.Collection; -import java.util.List; -import java.util.Set; - import static spoon.reflect.path.CtRole.VALUE; /** diff --git a/src/main/java/spoon/reflect/declaration/CtExecutable.java b/src/main/java/spoon/reflect/declaration/CtExecutable.java index bfb9f593814..f2a6d6f0040 100644 --- a/src/main/java/spoon/reflect/declaration/CtExecutable.java +++ b/src/main/java/spoon/reflect/declaration/CtExecutable.java @@ -7,6 +7,8 @@ */ package spoon.reflect.declaration; +import java.util.List; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; @@ -17,9 +19,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import java.util.List; -import java.util.Set; - import static spoon.reflect.path.CtRole.PARAMETER; import static spoon.reflect.path.CtRole.THROWN; diff --git a/src/main/java/spoon/reflect/declaration/CtFormalTypeDeclarer.java b/src/main/java/spoon/reflect/declaration/CtFormalTypeDeclarer.java index 62c4fdcfcd6..bf3686ae1a7 100644 --- a/src/main/java/spoon/reflect/declaration/CtFormalTypeDeclarer.java +++ b/src/main/java/spoon/reflect/declaration/CtFormalTypeDeclarer.java @@ -7,11 +7,10 @@ */ package spoon.reflect.declaration; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.List; - import static spoon.reflect.path.CtRole.TYPE_PARAMETER; /** diff --git a/src/main/java/spoon/reflect/declaration/CtMethod.java b/src/main/java/spoon/reflect/declaration/CtMethod.java index bf3453d2892..29c0eec53eb 100644 --- a/src/main/java/spoon/reflect/declaration/CtMethod.java +++ b/src/main/java/spoon/reflect/declaration/CtMethod.java @@ -7,12 +7,11 @@ */ package spoon.reflect.declaration; +import java.util.Collection; import spoon.refactoring.Refactoring; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.Collection; - import static spoon.reflect.path.CtRole.IS_DEFAULT; diff --git a/src/main/java/spoon/reflect/declaration/CtModifiable.java b/src/main/java/spoon/reflect/declaration/CtModifiable.java index f5198c991e2..3fa40246579 100644 --- a/src/main/java/spoon/reflect/declaration/CtModifiable.java +++ b/src/main/java/spoon/reflect/declaration/CtModifiable.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.support.DerivedProperty; import spoon.support.reflect.CtExtendedModifier; -import java.util.Set; - import static spoon.reflect.path.CtRole.EMODIFIER; import static spoon.reflect.path.CtRole.MODIFIER; diff --git a/src/main/java/spoon/reflect/declaration/CtModule.java b/src/main/java/spoon/reflect/declaration/CtModule.java index 6ce8fcecbe3..7e9bbbd7b52 100644 --- a/src/main/java/spoon/reflect/declaration/CtModule.java +++ b/src/main/java/spoon/reflect/declaration/CtModule.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.reference.CtModuleReference; import spoon.support.DerivedProperty; -import java.util.List; - import static spoon.reflect.path.CtRole.EXPORTED_PACKAGE; import static spoon.reflect.path.CtRole.MODIFIER; import static spoon.reflect.path.CtRole.MODULE_DIRECTIVE; diff --git a/src/main/java/spoon/reflect/declaration/CtModuleRequirement.java b/src/main/java/spoon/reflect/declaration/CtModuleRequirement.java index 93aa7dac0b1..9d804dc9586 100644 --- a/src/main/java/spoon/reflect/declaration/CtModuleRequirement.java +++ b/src/main/java/spoon/reflect/declaration/CtModuleRequirement.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtModuleReference; -import java.util.Set; - /** * Represents a require module in a Java module definition * diff --git a/src/main/java/spoon/reflect/declaration/CtMultiTypedElement.java b/src/main/java/spoon/reflect/declaration/CtMultiTypedElement.java index 2d7b03c7d90..b3883960b21 100644 --- a/src/main/java/spoon/reflect/declaration/CtMultiTypedElement.java +++ b/src/main/java/spoon/reflect/declaration/CtMultiTypedElement.java @@ -7,11 +7,10 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; - -import java.util.List; +import spoon.reflect.reference.CtTypeReference; import static spoon.reflect.path.CtRole.MULTI_TYPE; diff --git a/src/main/java/spoon/reflect/declaration/CtNamedElement.java b/src/main/java/spoon/reflect/declaration/CtNamedElement.java index ce87cd03ea0..48c467bcd2a 100644 --- a/src/main/java/spoon/reflect/declaration/CtNamedElement.java +++ b/src/main/java/spoon/reflect/declaration/CtNamedElement.java @@ -7,10 +7,10 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtReference; -import spoon.support.DerivedProperty; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtReference; +import spoon.support.DerivedProperty; import static spoon.reflect.path.CtRole.NAME; diff --git a/src/main/java/spoon/reflect/declaration/CtPackage.java b/src/main/java/spoon/reflect/declaration/CtPackage.java index e8ad46b3729..72d6d9f3d6d 100644 --- a/src/main/java/spoon/reflect/declaration/CtPackage.java +++ b/src/main/java/spoon/reflect/declaration/CtPackage.java @@ -7,15 +7,14 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtPackageReference; -import spoon.support.DerivedProperty; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtPackageReference; +import spoon.support.DerivedProperty; -import java.util.Set; - -import static spoon.reflect.path.CtRole.SUB_PACKAGE; import static spoon.reflect.path.CtRole.CONTAINED_TYPE; +import static spoon.reflect.path.CtRole.SUB_PACKAGE; /** * This element defines a package declaration. The packages are represented by a diff --git a/src/main/java/spoon/reflect/declaration/CtPackageExport.java b/src/main/java/spoon/reflect/declaration/CtPackageExport.java index 2d849bdf1f1..b5c5a121710 100644 --- a/src/main/java/spoon/reflect/declaration/CtPackageExport.java +++ b/src/main/java/spoon/reflect/declaration/CtPackageExport.java @@ -7,14 +7,13 @@ */ package spoon.reflect.declaration; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtModuleReference; import spoon.reflect.reference.CtPackageReference; -import java.util.List; - /** * Represents an exported or opened package in a Java module * diff --git a/src/main/java/spoon/reflect/declaration/CtParameter.java b/src/main/java/spoon/reflect/declaration/CtParameter.java index 69423c09917..d26924c274a 100644 --- a/src/main/java/spoon/reflect/declaration/CtParameter.java +++ b/src/main/java/spoon/reflect/declaration/CtParameter.java @@ -7,11 +7,11 @@ */ package spoon.reflect.declaration; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtExpression; import spoon.reflect.reference.CtParameterReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import spoon.support.UnsettableProperty; import static spoon.reflect.path.CtRole.IS_INFERRED; diff --git a/src/main/java/spoon/reflect/declaration/CtProvidedService.java b/src/main/java/spoon/reflect/declaration/CtProvidedService.java index 6c6314f0c14..2b52e8f241c 100644 --- a/src/main/java/spoon/reflect/declaration/CtProvidedService.java +++ b/src/main/java/spoon/reflect/declaration/CtProvidedService.java @@ -7,13 +7,12 @@ */ package spoon.reflect.declaration; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.util.List; - /** * Represents a provided service in a {@link CtModule}. * The provides directive specifies a service for which the with clause specifies one or more service providers to java.util.ServiceLoader. diff --git a/src/main/java/spoon/reflect/declaration/CtSealable.java b/src/main/java/spoon/reflect/declaration/CtSealable.java index ef0a203e0f6..7a77c81fdb6 100644 --- a/src/main/java/spoon/reflect/declaration/CtSealable.java +++ b/src/main/java/spoon/reflect/declaration/CtSealable.java @@ -7,14 +7,13 @@ */ package spoon.reflect.declaration; +import java.util.Collection; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.util.Collection; -import java.util.Set; - /** * This interface represents any type that can be sealed. * See JLS 8.1.1.2 diff --git a/src/main/java/spoon/reflect/declaration/CtShadowable.java b/src/main/java/spoon/reflect/declaration/CtShadowable.java index fbce477bcee..f309461d300 100644 --- a/src/main/java/spoon/reflect/declaration/CtShadowable.java +++ b/src/main/java/spoon/reflect/declaration/CtShadowable.java @@ -7,9 +7,9 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtTypeReference; import static spoon.reflect.path.CtRole.IS_SHADOW; diff --git a/src/main/java/spoon/reflect/declaration/CtType.java b/src/main/java/spoon/reflect/declaration/CtType.java index cf8466b52b5..c29a41717ba 100644 --- a/src/main/java/spoon/reflect/declaration/CtType.java +++ b/src/main/java/spoon/reflect/declaration/CtType.java @@ -7,17 +7,16 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; -import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; - import java.util.List; import java.util.Set; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtTypeReference; +import spoon.support.DerivedProperty; -import static spoon.reflect.path.CtRole.METHOD; import static spoon.reflect.path.CtRole.FIELD; import static spoon.reflect.path.CtRole.INTERFACE; +import static spoon.reflect.path.CtRole.METHOD; import static spoon.reflect.path.CtRole.NAME; import static spoon.reflect.path.CtRole.NESTED_TYPE; import static spoon.reflect.path.CtRole.SUPER_TYPE; diff --git a/src/main/java/spoon/reflect/declaration/CtTypeInformation.java b/src/main/java/spoon/reflect/declaration/CtTypeInformation.java index 7b06b69f355..125a885b894 100644 --- a/src/main/java/spoon/reflect/declaration/CtTypeInformation.java +++ b/src/main/java/spoon/reflect/declaration/CtTypeInformation.java @@ -7,14 +7,13 @@ */ package spoon.reflect.declaration; +import java.util.Collection; +import java.util.Set; +import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; - -import java.util.Collection; -import java.util.Set; import static spoon.reflect.path.CtRole.INTERFACE; import static spoon.reflect.path.CtRole.MODIFIER; diff --git a/src/main/java/spoon/reflect/declaration/CtTypeParameter.java b/src/main/java/spoon/reflect/declaration/CtTypeParameter.java index f34cb171b36..d3141d035d7 100644 --- a/src/main/java/spoon/reflect/declaration/CtTypeParameter.java +++ b/src/main/java/spoon/reflect/declaration/CtTypeParameter.java @@ -7,14 +7,13 @@ */ package spoon.reflect.declaration; +import java.util.List; +import java.util.Set; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.util.List; -import java.util.Set; - /** * This element defines a declaration of a type parameter (aka generics). * For example, in class A<E> { ... }, the "E" is modeled as an instance of CtTypeParameter. diff --git a/src/main/java/spoon/reflect/declaration/CtTypedElement.java b/src/main/java/spoon/reflect/declaration/CtTypedElement.java index 85ce2297d8e..908c9de3992 100644 --- a/src/main/java/spoon/reflect/declaration/CtTypedElement.java +++ b/src/main/java/spoon/reflect/declaration/CtTypedElement.java @@ -7,9 +7,9 @@ */ package spoon.reflect.declaration; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; +import spoon.reflect.reference.CtTypeReference; import static spoon.reflect.path.CtRole.TYPE; diff --git a/src/main/java/spoon/reflect/declaration/CtVariable.java b/src/main/java/spoon/reflect/declaration/CtVariable.java index da05871e312..0de6c25dc22 100644 --- a/src/main/java/spoon/reflect/declaration/CtVariable.java +++ b/src/main/java/spoon/reflect/declaration/CtVariable.java @@ -7,11 +7,11 @@ */ package spoon.reflect.declaration; +import spoon.reflect.annotations.PropertyGetter; +import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtExpression; import spoon.reflect.reference.CtVariableReference; import spoon.support.DerivedProperty; -import spoon.reflect.annotations.PropertyGetter; -import spoon.reflect.annotations.PropertySetter; import static spoon.reflect.path.CtRole.DEFAULT_EXPRESSION; diff --git a/src/main/java/spoon/reflect/factory/AnnotationFactory.java b/src/main/java/spoon/reflect/factory/AnnotationFactory.java index 738b556bbe8..54e0082b0fe 100644 --- a/src/main/java/spoon/reflect/factory/AnnotationFactory.java +++ b/src/main/java/spoon/reflect/factory/AnnotationFactory.java @@ -7,6 +7,9 @@ */ package spoon.reflect.factory; +import java.lang.annotation.Annotation; +import java.lang.annotation.Repeatable; +import java.lang.reflect.Method; import spoon.SpoonException; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnnotationType; @@ -17,10 +20,6 @@ import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; -import java.lang.annotation.Repeatable; -import java.lang.reflect.Method; - /** * The {@link CtAnnotationType} sub-factory. */ diff --git a/src/main/java/spoon/reflect/factory/CodeFactory.java b/src/main/java/spoon/reflect/factory/CodeFactory.java index 541278cc8f4..d496513d00b 100644 --- a/src/main/java/spoon/reflect/factory/CodeFactory.java +++ b/src/main/java/spoon/reflect/factory/CodeFactory.java @@ -7,6 +7,13 @@ */ package spoon.reflect.factory; +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; import spoon.SpoonException; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtAssignment; @@ -53,14 +60,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtVariableReference; -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; - /** * This sub-factory contains utility methods to create code elements. To avoid * over-using reflection, consider using {@link spoon.template.Template}. diff --git a/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java b/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java index 90c70bc6f86..a569524bf57 100644 --- a/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java +++ b/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java @@ -7,6 +7,11 @@ */ package spoon.reflect.factory; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.TreeMap; import spoon.SpoonException; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.position.NoSourcePosition; @@ -16,12 +21,6 @@ import spoon.support.compiler.VirtualFile; import spoon.support.compiler.jdt.JDTSnippetCompiler; -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.Map; -import java.util.TreeMap; - /** * A factory to create some evaluation utilities on the Spoon metamodel. */ diff --git a/src/main/java/spoon/reflect/factory/ConstructorFactory.java b/src/main/java/spoon/reflect/factory/ConstructorFactory.java index 39adc1b0b65..b1ce970a4c9 100644 --- a/src/main/java/spoon/reflect/factory/ConstructorFactory.java +++ b/src/main/java/spoon/reflect/factory/ConstructorFactory.java @@ -7,6 +7,11 @@ */ package spoon.reflect.factory; +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtClass; @@ -17,12 +22,6 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - /** * The {@link CtConstructor} sub-factory. */ diff --git a/src/main/java/spoon/reflect/factory/CoreFactory.java b/src/main/java/spoon/reflect/factory/CoreFactory.java index 3a854111e07..2a79c1fa28d 100644 --- a/src/main/java/spoon/reflect/factory/CoreFactory.java +++ b/src/main/java/spoon/reflect/factory/CoreFactory.java @@ -8,7 +8,6 @@ package spoon.reflect.factory; import java.lang.annotation.Annotation; - import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; import spoon.reflect.code.CtArrayWrite; diff --git a/src/main/java/spoon/reflect/factory/ExecutableFactory.java b/src/main/java/spoon/reflect/factory/ExecutableFactory.java index 2a34e916b1b..4115a925276 100644 --- a/src/main/java/spoon/reflect/factory/ExecutableFactory.java +++ b/src/main/java/spoon/reflect/factory/ExecutableFactory.java @@ -7,6 +7,10 @@ */ package spoon.reflect.factory; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtLambda; import spoon.reflect.declaration.CtAnonymousExecutable; @@ -23,11 +27,6 @@ import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.StringTokenizer; - import static spoon.reflect.ModelElementContainerDefaultCapacities.PARAMETERS_CONTAINER_DEFAULT_CAPACITY; /** diff --git a/src/main/java/spoon/reflect/factory/Factory.java b/src/main/java/spoon/reflect/factory/Factory.java index c428ad9fe9c..caf5d2cb834 100644 --- a/src/main/java/spoon/reflect/factory/Factory.java +++ b/src/main/java/spoon/reflect/factory/Factory.java @@ -7,6 +7,9 @@ */ package spoon.reflect.factory; +import java.lang.annotation.Annotation; +import java.util.List; +import java.util.Set; import spoon.compiler.Environment; import spoon.reflect.CtModel; import spoon.reflect.code.BinaryOperatorKind; @@ -80,17 +83,18 @@ import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtFormalTypeDeclarer; +import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtModule; -import spoon.reflect.declaration.CtPackageExport; -import spoon.reflect.declaration.CtProvidedService; -import spoon.reflect.declaration.CtRecord; -import spoon.reflect.declaration.CtRecordComponent; import spoon.reflect.declaration.CtModuleRequirement; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtPackageDeclaration; +import spoon.reflect.declaration.CtPackageExport; import spoon.reflect.declaration.CtParameter; +import spoon.reflect.declaration.CtProvidedService; +import spoon.reflect.declaration.CtRecord; +import spoon.reflect.declaration.CtRecordComponent; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeParameter; import spoon.reflect.declaration.CtUsedService; @@ -101,26 +105,21 @@ import spoon.reflect.reference.CtCatchVariableReference; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtIntersectionTypeReference; import spoon.reflect.reference.CtLocalVariableReference; import spoon.reflect.reference.CtModuleReference; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtParameterReference; import spoon.reflect.reference.CtReference; +import spoon.reflect.reference.CtTypeMemberWildcardImportReference; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtUnboundVariableReference; import spoon.reflect.reference.CtVariableReference; import spoon.reflect.reference.CtWildcardReference; -import spoon.reflect.reference.CtTypeMemberWildcardImportReference; import spoon.reflect.visitor.chain.CtQuery; import spoon.support.visitor.GenericTypeAdapter; -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Set; - /** * Provides the sub-factories required by Spoon. * diff --git a/src/main/java/spoon/reflect/factory/FactoryImpl.java b/src/main/java/spoon/reflect/factory/FactoryImpl.java index d8b5cbb1141..a9be93c57d1 100644 --- a/src/main/java/spoon/reflect/factory/FactoryImpl.java +++ b/src/main/java/spoon/reflect/factory/FactoryImpl.java @@ -7,6 +7,15 @@ */ package spoon.reflect.factory; +import java.io.IOException; +import java.io.Serializable; +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; import spoon.compiler.Environment; import spoon.reflect.CtModel; import spoon.reflect.CtModelImpl; @@ -120,16 +129,6 @@ import spoon.support.StandardEnvironment; import spoon.support.visitor.GenericTypeAdapter; -import java.io.IOException; -import java.io.Serializable; -import java.lang.annotation.Annotation; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - /** * Implements {@link Factory} */ diff --git a/src/main/java/spoon/reflect/factory/FieldFactory.java b/src/main/java/spoon/reflect/factory/FieldFactory.java index 66d004ee946..f15751413cc 100644 --- a/src/main/java/spoon/reflect/factory/FieldFactory.java +++ b/src/main/java/spoon/reflect/factory/FieldFactory.java @@ -7,6 +7,8 @@ */ package spoon.reflect.factory; +import java.lang.reflect.Field; +import java.util.Set; import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtType; @@ -14,9 +16,6 @@ import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtTypeReference; -import java.lang.reflect.Field; -import java.util.Set; - /** * The {@link CtField} sub-factory. */ diff --git a/src/main/java/spoon/reflect/factory/MethodFactory.java b/src/main/java/spoon/reflect/factory/MethodFactory.java index 1455497a354..79d19a9dac2 100644 --- a/src/main/java/spoon/reflect/factory/MethodFactory.java +++ b/src/main/java/spoon/reflect/factory/MethodFactory.java @@ -7,6 +7,13 @@ */ package spoon.reflect.factory; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import spoon.reflect.code.CtBlock; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtMethod; @@ -17,14 +24,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.template.Substitution; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.ArrayList; -import java.util.Arrays; - /** * The {@link CtMethod} sub-factory. */ diff --git a/src/main/java/spoon/reflect/factory/ModuleFactory.java b/src/main/java/spoon/reflect/factory/ModuleFactory.java index 11ab6b1e17d..5d50cda99aa 100644 --- a/src/main/java/spoon/reflect/factory/ModuleFactory.java +++ b/src/main/java/spoon/reflect/factory/ModuleFactory.java @@ -154,4 +154,3 @@ public CtUsedService createUsedService(CtTypeReference typeReference) { return factory.Core().createUsedService().setServiceType(typeReference); } } - diff --git a/src/main/java/spoon/reflect/factory/PackageFactory.java b/src/main/java/spoon/reflect/factory/PackageFactory.java index a1984c6c75d..a0f719f5944 100644 --- a/src/main/java/spoon/reflect/factory/PackageFactory.java +++ b/src/main/java/spoon/reflect/factory/PackageFactory.java @@ -249,4 +249,3 @@ private List getSubPackageList(CtPackage pack) { } } - diff --git a/src/main/java/spoon/reflect/factory/SubFactory.java b/src/main/java/spoon/reflect/factory/SubFactory.java index b0708b4161e..dfbfc57f0fd 100644 --- a/src/main/java/spoon/reflect/factory/SubFactory.java +++ b/src/main/java/spoon/reflect/factory/SubFactory.java @@ -22,4 +22,3 @@ public SubFactory(Factory factory) { this.factory = factory; } } - diff --git a/src/main/java/spoon/reflect/factory/TypeFactory.java b/src/main/java/spoon/reflect/factory/TypeFactory.java index 244b094422a..15be5754b30 100644 --- a/src/main/java/spoon/reflect/factory/TypeFactory.java +++ b/src/main/java/spoon/reflect/factory/TypeFactory.java @@ -7,8 +7,20 @@ */ package spoon.reflect.factory; +import java.lang.reflect.TypeVariable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import spoon.Launcher; import spoon.SpoonException; +import spoon.experimental.CtUnresolvedImport; import spoon.reflect.code.CtNewClass; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.position.NoSourcePosition; @@ -16,20 +28,19 @@ import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtFormalTypeDeclarer; +import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeParameter; -import spoon.experimental.CtUnresolvedImport; import spoon.reflect.reference.CtActualTypeContainer; import spoon.reflect.reference.CtArrayTypeReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtIntersectionTypeReference; import spoon.reflect.reference.CtReference; +import spoon.reflect.reference.CtTypeMemberWildcardImportReference; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; -import spoon.reflect.reference.CtTypeMemberWildcardImportReference; import spoon.reflect.visitor.CtAbstractVisitor; import spoon.reflect.visitor.CtScanner; import spoon.reflect.visitor.filter.TypeFilter; @@ -40,18 +51,6 @@ import spoon.support.visitor.MethodTypingContext; import spoon.support.visitor.java.JavaReflectionTreeBuilder; -import java.lang.reflect.TypeVariable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; - /** * The {@link CtType} sub-factory. */ diff --git a/src/main/java/spoon/reflect/meta/RoleHandler.java b/src/main/java/spoon/reflect/meta/RoleHandler.java index 77d8245930e..0c6dc99d6d1 100644 --- a/src/main/java/spoon/reflect/meta/RoleHandler.java +++ b/src/main/java/spoon/reflect/meta/RoleHandler.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import spoon.reflect.path.CtRole; /** diff --git a/src/main/java/spoon/reflect/meta/impl/AbstractRoleHandler.java b/src/main/java/spoon/reflect/meta/impl/AbstractRoleHandler.java index 7af9a1f3fe0..f7d411e442a 100644 --- a/src/main/java/spoon/reflect/meta/impl/AbstractRoleHandler.java +++ b/src/main/java/spoon/reflect/meta/impl/AbstractRoleHandler.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import spoon.SpoonException; import spoon.reflect.meta.RoleHandler; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/reflect/meta/impl/ListHandler.java b/src/main/java/spoon/reflect/meta/impl/ListHandler.java index de0ac21643d..a983a3832dc 100644 --- a/src/main/java/spoon/reflect/meta/impl/ListHandler.java +++ b/src/main/java/spoon/reflect/meta/impl/ListHandler.java @@ -11,7 +11,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import spoon.reflect.meta.ContainerKind; import spoon.reflect.meta.RoleHandler; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/reflect/meta/impl/MapHandler.java b/src/main/java/spoon/reflect/meta/impl/MapHandler.java index 8a7f2c93064..a13589b998c 100644 --- a/src/main/java/spoon/reflect/meta/impl/MapHandler.java +++ b/src/main/java/spoon/reflect/meta/impl/MapHandler.java @@ -12,7 +12,6 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; - import spoon.reflect.meta.ContainerKind; import spoon.reflect.meta.RoleHandler; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/reflect/meta/impl/RoleHandlerHelper.java b/src/main/java/spoon/reflect/meta/impl/RoleHandlerHelper.java index d12d1cbf453..03dfde1e5f7 100644 --- a/src/main/java/spoon/reflect/meta/impl/RoleHandlerHelper.java +++ b/src/main/java/spoon/reflect/meta/impl/RoleHandlerHelper.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; - import spoon.SpoonException; import spoon.reflect.declaration.CtElement; import spoon.reflect.meta.RoleHandler; diff --git a/src/main/java/spoon/reflect/meta/impl/SetHandler.java b/src/main/java/spoon/reflect/meta/impl/SetHandler.java index ca2a667fad8..53efe34e4aa 100644 --- a/src/main/java/spoon/reflect/meta/impl/SetHandler.java +++ b/src/main/java/spoon/reflect/meta/impl/SetHandler.java @@ -12,7 +12,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; - import spoon.reflect.meta.ContainerKind; import spoon.reflect.meta.RoleHandler; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/reflect/meta/impl/SingleHandler.java b/src/main/java/spoon/reflect/meta/impl/SingleHandler.java index d61504a69d3..8c45a6fdba3 100644 --- a/src/main/java/spoon/reflect/meta/impl/SingleHandler.java +++ b/src/main/java/spoon/reflect/meta/impl/SingleHandler.java @@ -9,7 +9,6 @@ import java.util.AbstractList; import java.util.Collections; - import spoon.SpoonException; import spoon.reflect.meta.ContainerKind; import spoon.reflect.meta.RoleHandler; diff --git a/src/main/java/spoon/reflect/path/CtElementPathBuilder.java b/src/main/java/spoon/reflect/path/CtElementPathBuilder.java index 5c39afe4e4e..8aa0dabeaf7 100644 --- a/src/main/java/spoon/reflect/path/CtElementPathBuilder.java +++ b/src/main/java/spoon/reflect/path/CtElementPathBuilder.java @@ -7,6 +7,10 @@ */ package spoon.reflect.path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import spoon.reflect.CtModelImpl; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtElement; @@ -19,11 +23,6 @@ import spoon.reflect.path.impl.CtRolePathElement; import spoon.reflect.reference.CtReference; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - /** * This builder allow to create some CtPath from CtElements * diff --git a/src/main/java/spoon/reflect/path/CtPath.java b/src/main/java/spoon/reflect/path/CtPath.java index 57e023ab4e2..8527bbd2069 100644 --- a/src/main/java/spoon/reflect/path/CtPath.java +++ b/src/main/java/spoon/reflect/path/CtPath.java @@ -7,9 +7,8 @@ */ package spoon.reflect.path; -import spoon.reflect.declaration.CtElement; - import java.util.List; +import spoon.reflect.declaration.CtElement; /** * A CtPath allows to define the path to a CtElement in the Spoon model, eg ".spoon.test.path.Foo.foo#body#statement[index=0]" diff --git a/src/main/java/spoon/reflect/path/CtPathBuilder.java b/src/main/java/spoon/reflect/path/CtPathBuilder.java index d2e0a76c4d6..8bbe51edb4a 100644 --- a/src/main/java/spoon/reflect/path/CtPathBuilder.java +++ b/src/main/java/spoon/reflect/path/CtPathBuilder.java @@ -7,6 +7,8 @@ */ package spoon.reflect.path; +import java.util.LinkedList; +import java.util.List; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.impl.CtNamedPathElement; import spoon.reflect.path.impl.CtPathElement; @@ -14,9 +16,6 @@ import spoon.reflect.path.impl.CtRolePathElement; import spoon.reflect.path.impl.CtTypedNameElement; -import java.util.LinkedList; -import java.util.List; - /** * This builder allow to create some CtPath. *

diff --git a/src/main/java/spoon/reflect/path/CtPathStringBuilder.java b/src/main/java/spoon/reflect/path/CtPathStringBuilder.java index 8645360ee37..b14065c5b95 100644 --- a/src/main/java/spoon/reflect/path/CtPathStringBuilder.java +++ b/src/main/java/spoon/reflect/path/CtPathStringBuilder.java @@ -8,19 +8,18 @@ package spoon.reflect.path; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; +import java.util.regex.Pattern; import spoon.SpoonException; import spoon.reflect.path.impl.AbstractPathElement; import spoon.reflect.path.impl.CtNamedPathElement; import spoon.reflect.path.impl.CtPathElement; import spoon.reflect.path.impl.CtPathImpl; -import spoon.reflect.path.impl.CtTypedNameElement; import spoon.reflect.path.impl.CtRolePathElement; - -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.NoSuchElementException; -import java.util.StringTokenizer; -import java.util.regex.Pattern; +import spoon.reflect.path.impl.CtTypedNameElement; /** * Created by nicolas on 27/08/2015. diff --git a/src/main/java/spoon/reflect/path/CtRole.java b/src/main/java/spoon/reflect/path/CtRole.java index eaf76ac785e..be13f0cd7f6 100644 --- a/src/main/java/spoon/reflect/path/CtRole.java +++ b/src/main/java/spoon/reflect/path/CtRole.java @@ -11,7 +11,6 @@ import java.util.Collections; import java.util.List; import java.util.function.Predicate; - import spoon.SpoonException; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtConstructor; diff --git a/src/main/java/spoon/reflect/path/impl/AbstractPathElement.java b/src/main/java/spoon/reflect/path/impl/AbstractPathElement.java index 9232f08f011..d713ad47639 100644 --- a/src/main/java/spoon/reflect/path/impl/AbstractPathElement.java +++ b/src/main/java/spoon/reflect/path/impl/AbstractPathElement.java @@ -7,14 +7,13 @@ */ package spoon.reflect.path.impl; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.visitor.CtScanner; - import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.StringJoiner; import java.util.TreeMap; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.visitor.CtScanner; /** * Partial implementation for CtPathElement diff --git a/src/main/java/spoon/reflect/path/impl/CtNamedPathElement.java b/src/main/java/spoon/reflect/path/impl/CtNamedPathElement.java index 39d47d35fe5..768d225a6a4 100644 --- a/src/main/java/spoon/reflect/path/impl/CtNamedPathElement.java +++ b/src/main/java/spoon/reflect/path/impl/CtNamedPathElement.java @@ -7,13 +7,6 @@ */ package spoon.reflect.path.impl; -import spoon.reflect.declaration.CtConstructor; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtExecutable; -import spoon.reflect.declaration.CtNamedElement; -import spoon.reflect.reference.CtReference; -import spoon.reflect.visitor.CtInheritanceScanner; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -21,6 +14,12 @@ import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import spoon.reflect.declaration.CtConstructor; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtExecutable; +import spoon.reflect.declaration.CtNamedElement; +import spoon.reflect.reference.CtReference; +import spoon.reflect.visitor.CtInheritanceScanner; /** * A CtPathElement that match on CtNamedElement#getSimpleName diff --git a/src/main/java/spoon/reflect/path/impl/CtPathElement.java b/src/main/java/spoon/reflect/path/impl/CtPathElement.java index 50b4ebf6582..04f5bb3ac9c 100644 --- a/src/main/java/spoon/reflect/path/impl/CtPathElement.java +++ b/src/main/java/spoon/reflect/path/impl/CtPathElement.java @@ -7,9 +7,8 @@ */ package spoon.reflect.path.impl; -import spoon.reflect.declaration.CtElement; - import java.util.Collection; +import spoon.reflect.declaration.CtElement; /** * A single path element from a CtPath. diff --git a/src/main/java/spoon/reflect/path/impl/CtPathImpl.java b/src/main/java/spoon/reflect/path/impl/CtPathImpl.java index ab065d1ff0b..d7093210b25 100644 --- a/src/main/java/spoon/reflect/path/impl/CtPathImpl.java +++ b/src/main/java/spoon/reflect/path/impl/CtPathImpl.java @@ -7,14 +7,13 @@ */ package spoon.reflect.path.impl; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.path.CtPath; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.path.CtPath; /** * Default implementation for a CtPath diff --git a/src/main/java/spoon/reflect/path/impl/CtRolePathElement.java b/src/main/java/spoon/reflect/path/impl/CtRolePathElement.java index ab7c146a10a..952741e5798 100644 --- a/src/main/java/spoon/reflect/path/impl/CtRolePathElement.java +++ b/src/main/java/spoon/reflect/path/impl/CtRolePathElement.java @@ -7,6 +7,10 @@ */ package spoon.reflect.path.impl; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.meta.RoleHandler; @@ -15,11 +19,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtReference; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.Map; - /** * A CtPathElement that define some roles for matching. *

diff --git a/src/main/java/spoon/reflect/path/impl/CtTypedNameElement.java b/src/main/java/spoon/reflect/path/impl/CtTypedNameElement.java index 1e48334800c..76ab41c85e1 100644 --- a/src/main/java/spoon/reflect/path/impl/CtTypedNameElement.java +++ b/src/main/java/spoon/reflect/path/impl/CtTypedNameElement.java @@ -7,10 +7,9 @@ */ package spoon.reflect.path.impl; -import spoon.reflect.declaration.CtElement; - import java.util.ArrayList; import java.util.Collection; +import spoon.reflect.declaration.CtElement; /** * spoon.reflect.path.impl.CtPathElement that match on CtNamedElement diff --git a/src/main/java/spoon/reflect/reference/CtActualTypeContainer.java b/src/main/java/spoon/reflect/reference/CtActualTypeContainer.java index 1df34afbeaf..104a1f82c2c 100644 --- a/src/main/java/spoon/reflect/reference/CtActualTypeContainer.java +++ b/src/main/java/spoon/reflect/reference/CtActualTypeContainer.java @@ -7,12 +7,11 @@ */ package spoon.reflect.reference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.path.CtRole; -import java.util.List; - /** * This interface defines the capability related to binding generics (aka type parameters). diff --git a/src/main/java/spoon/reflect/reference/CtExecutableReference.java b/src/main/java/spoon/reflect/reference/CtExecutableReference.java index 6eaed52c466..71ebe943ba5 100644 --- a/src/main/java/spoon/reflect/reference/CtExecutableReference.java +++ b/src/main/java/spoon/reflect/reference/CtExecutableReference.java @@ -7,16 +7,15 @@ */ package spoon.reflect.reference; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.path.CtRole; import spoon.support.DerivedProperty; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.List; - /** * This interface defines a reference to a diff --git a/src/main/java/spoon/reflect/reference/CtFieldReference.java b/src/main/java/spoon/reflect/reference/CtFieldReference.java index a85074d2262..264c953b9c5 100644 --- a/src/main/java/spoon/reflect/reference/CtFieldReference.java +++ b/src/main/java/spoon/reflect/reference/CtFieldReference.java @@ -7,14 +7,13 @@ */ package spoon.reflect.reference; +import java.lang.reflect.Member; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtField; import spoon.reflect.path.CtRole; import spoon.support.DerivedProperty; -import java.lang.reflect.Member; - /** * This interface defines a reference to a diff --git a/src/main/java/spoon/reflect/reference/CtIntersectionTypeReference.java b/src/main/java/spoon/reflect/reference/CtIntersectionTypeReference.java index 10c167be377..6ce1ecf5f5b 100644 --- a/src/main/java/spoon/reflect/reference/CtIntersectionTypeReference.java +++ b/src/main/java/spoon/reflect/reference/CtIntersectionTypeReference.java @@ -7,11 +7,10 @@ */ package spoon.reflect.reference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; -import java.util.List; - import static spoon.reflect.path.CtRole.BOUND; /** diff --git a/src/main/java/spoon/reflect/reference/CtReference.java b/src/main/java/spoon/reflect/reference/CtReference.java index e88bc8ea3ba..700e2f3c587 100644 --- a/src/main/java/spoon/reflect/reference/CtReference.java +++ b/src/main/java/spoon/reflect/reference/CtReference.java @@ -7,6 +7,7 @@ */ package spoon.reflect.reference; +import java.util.List; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.code.CtComment; @@ -15,8 +16,6 @@ import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.util.List; - /** * This is the root interface for named program element references, such as fields, types, diff --git a/src/main/java/spoon/reflect/reference/CtTypeMemberWildcardImportReference.java b/src/main/java/spoon/reflect/reference/CtTypeMemberWildcardImportReference.java index 1f35ca2e834..24730043e42 100644 --- a/src/main/java/spoon/reflect/reference/CtTypeMemberWildcardImportReference.java +++ b/src/main/java/spoon/reflect/reference/CtTypeMemberWildcardImportReference.java @@ -9,7 +9,6 @@ import java.lang.annotation.Annotation; import java.util.List; - import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtAnnotation; diff --git a/src/main/java/spoon/reflect/reference/CtTypeParameterReference.java b/src/main/java/spoon/reflect/reference/CtTypeParameterReference.java index 3b2c72d48a5..aa24e0be8f2 100644 --- a/src/main/java/spoon/reflect/reference/CtTypeParameterReference.java +++ b/src/main/java/spoon/reflect/reference/CtTypeParameterReference.java @@ -7,12 +7,11 @@ */ package spoon.reflect.reference; +import java.util.List; import spoon.reflect.declaration.CtTypeParameter; import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.util.List; - /** * This interface defines a reference to a type parameter (aka generics). diff --git a/src/main/java/spoon/reflect/reference/CtTypeReference.java b/src/main/java/spoon/reflect/reference/CtTypeReference.java index bb3d73f29f7..b89f38b8dd5 100644 --- a/src/main/java/spoon/reflect/reference/CtTypeReference.java +++ b/src/main/java/spoon/reflect/reference/CtTypeReference.java @@ -7,6 +7,7 @@ */ package spoon.reflect.reference; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtShadowable; @@ -19,8 +20,6 @@ import spoon.support.DerivedProperty; import spoon.support.SpoonClassNotFoundException; -import java.util.Set; - import static spoon.reflect.path.CtRole.PACKAGE_REF; /** diff --git a/src/main/java/spoon/reflect/reference/CtUnboundVariableReference.java b/src/main/java/spoon/reflect/reference/CtUnboundVariableReference.java index 7ee747ea7b1..d6bfe64f0b9 100644 --- a/src/main/java/spoon/reflect/reference/CtUnboundVariableReference.java +++ b/src/main/java/spoon/reflect/reference/CtUnboundVariableReference.java @@ -7,13 +7,12 @@ */ package spoon.reflect.reference; +import java.lang.annotation.Annotation; +import java.util.List; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; import spoon.support.UnsettableProperty; -import java.lang.annotation.Annotation; -import java.util.List; - /** * This interface defines a reference to an unbound * {@link spoon.reflect.declaration.CtVariable}. diff --git a/src/main/java/spoon/reflect/reference/CtVariableReference.java b/src/main/java/spoon/reflect/reference/CtVariableReference.java index c8250d8946b..c33b9a90f71 100644 --- a/src/main/java/spoon/reflect/reference/CtVariableReference.java +++ b/src/main/java/spoon/reflect/reference/CtVariableReference.java @@ -7,6 +7,7 @@ */ package spoon.reflect.reference; +import java.util.Set; import spoon.reflect.annotations.PropertyGetter; import spoon.reflect.annotations.PropertySetter; import spoon.reflect.declaration.CtVariable; @@ -14,8 +15,6 @@ import spoon.reflect.path.CtRole; import spoon.support.DerivedProperty; -import java.util.Set; - /** * This interface defines a reference to a diff --git a/src/main/java/spoon/reflect/visitor/AccessibleVariablesFinder.java b/src/main/java/spoon/reflect/visitor/AccessibleVariablesFinder.java index 33d07826e63..6b0070d6305 100644 --- a/src/main/java/spoon/reflect/visitor/AccessibleVariablesFinder.java +++ b/src/main/java/spoon/reflect/visitor/AccessibleVariablesFinder.java @@ -7,6 +7,10 @@ */ package spoon.reflect.visitor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; import spoon.reflect.code.CtCatch; import spoon.reflect.code.CtFor; import spoon.reflect.code.CtForEach; @@ -25,11 +29,6 @@ import spoon.reflect.declaration.ModifierKind; import spoon.reflect.reference.CtTypeReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - /** * Find local variables catch, parameters, fields, super fields * @author tdurieux diff --git a/src/main/java/spoon/reflect/visitor/CacheBasedConflictFinder.java b/src/main/java/spoon/reflect/visitor/CacheBasedConflictFinder.java index 2916769881b..7834aff1ae6 100644 --- a/src/main/java/spoon/reflect/visitor/CacheBasedConflictFinder.java +++ b/src/main/java/spoon/reflect/visitor/CacheBasedConflictFinder.java @@ -10,7 +10,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; - import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtPackageReference; diff --git a/src/main/java/spoon/reflect/visitor/CtAbstractImportVisitor.java b/src/main/java/spoon/reflect/visitor/CtAbstractImportVisitor.java index 15dfa4559a0..1e661eb2277 100644 --- a/src/main/java/spoon/reflect/visitor/CtAbstractImportVisitor.java +++ b/src/main/java/spoon/reflect/visitor/CtAbstractImportVisitor.java @@ -11,8 +11,8 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtPackageReference; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtTypeMemberWildcardImportReference; +import spoon.reflect.reference.CtTypeReference; /** * Provides an empty implementation of {@link CtImportVisitor}. diff --git a/src/main/java/spoon/reflect/visitor/CtAbstractVisitor.java b/src/main/java/spoon/reflect/visitor/CtAbstractVisitor.java index 99d361e36c8..c3883da2e70 100644 --- a/src/main/java/spoon/reflect/visitor/CtAbstractVisitor.java +++ b/src/main/java/spoon/reflect/visitor/CtAbstractVisitor.java @@ -8,7 +8,6 @@ package spoon.reflect.visitor; import java.lang.annotation.Annotation; - import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; import spoon.reflect.code.CtArrayWrite; diff --git a/src/main/java/spoon/reflect/visitor/CtBFSIterator.java b/src/main/java/spoon/reflect/visitor/CtBFSIterator.java index 0f997c9e95e..3423be57169 100644 --- a/src/main/java/spoon/reflect/visitor/CtBFSIterator.java +++ b/src/main/java/spoon/reflect/visitor/CtBFSIterator.java @@ -7,10 +7,9 @@ */ package spoon.reflect.visitor; -import spoon.reflect.declaration.CtElement; - import java.util.ArrayDeque; import java.util.Iterator; +import spoon.reflect.declaration.CtElement; /** * A class to be able to iterate over the children elements in the tree of a given node, in breadth-first order. */ diff --git a/src/main/java/spoon/reflect/visitor/CtDequeScanner.java b/src/main/java/spoon/reflect/visitor/CtDequeScanner.java index e3c8b397f97..32bf223b9c6 100644 --- a/src/main/java/spoon/reflect/visitor/CtDequeScanner.java +++ b/src/main/java/spoon/reflect/visitor/CtDequeScanner.java @@ -7,10 +7,9 @@ */ package spoon.reflect.visitor; -import spoon.reflect.declaration.CtElement; - import java.util.ArrayDeque; import java.util.Deque; +import spoon.reflect.declaration.CtElement; /** * This class defines a scanner that maintains a scanning stack for contextual diff --git a/src/main/java/spoon/reflect/visitor/CtImportVisitor.java b/src/main/java/spoon/reflect/visitor/CtImportVisitor.java index 00f23f009cd..8712f9e84d3 100644 --- a/src/main/java/spoon/reflect/visitor/CtImportVisitor.java +++ b/src/main/java/spoon/reflect/visitor/CtImportVisitor.java @@ -11,8 +11,8 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtPackageReference; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtTypeMemberWildcardImportReference; +import spoon.reflect.reference.CtTypeReference; /** * This interface defines the visitor for the different types of CtImport diff --git a/src/main/java/spoon/reflect/visitor/CtInheritanceScanner.java b/src/main/java/spoon/reflect/visitor/CtInheritanceScanner.java index 0981b274ec3..149e552d272 100644 --- a/src/main/java/spoon/reflect/visitor/CtInheritanceScanner.java +++ b/src/main/java/spoon/reflect/visitor/CtInheritanceScanner.java @@ -7,6 +7,8 @@ */ package spoon.reflect.visitor; +import java.lang.annotation.Annotation; +import java.util.Collection; import spoon.reflect.code.CtAbstractInvocation; import spoon.reflect.code.CtAbstractSwitch; import spoon.reflect.code.CtAnnotationFieldAccess; @@ -91,22 +93,23 @@ import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtFormalTypeDeclarer; +import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtModifiable; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtModuleDirective; -import spoon.reflect.declaration.CtPackageExport; -import spoon.reflect.declaration.CtProvidedService; -import spoon.reflect.declaration.CtReceiverParameter; -import spoon.reflect.declaration.CtRecord; -import spoon.reflect.declaration.CtRecordComponent; import spoon.reflect.declaration.CtModuleRequirement; import spoon.reflect.declaration.CtMultiTypedElement; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtPackageDeclaration; +import spoon.reflect.declaration.CtPackageExport; import spoon.reflect.declaration.CtParameter; +import spoon.reflect.declaration.CtProvidedService; +import spoon.reflect.declaration.CtReceiverParameter; +import spoon.reflect.declaration.CtRecord; +import spoon.reflect.declaration.CtRecordComponent; import spoon.reflect.declaration.CtSealable; import spoon.reflect.declaration.CtShadowable; import spoon.reflect.declaration.CtType; @@ -121,22 +124,18 @@ import spoon.reflect.reference.CtCatchVariableReference; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtIntersectionTypeReference; import spoon.reflect.reference.CtLocalVariableReference; import spoon.reflect.reference.CtModuleReference; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtParameterReference; import spoon.reflect.reference.CtReference; +import spoon.reflect.reference.CtTypeMemberWildcardImportReference; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtUnboundVariableReference; import spoon.reflect.reference.CtVariableReference; import spoon.reflect.reference.CtWildcardReference; -import spoon.reflect.reference.CtTypeMemberWildcardImportReference; - -import java.lang.annotation.Annotation; -import java.util.Collection; /** * This class provides an abstract implementation of the visitor that allows its diff --git a/src/main/java/spoon/reflect/visitor/CtIterator.java b/src/main/java/spoon/reflect/visitor/CtIterator.java index f31af2c0f9a..77de26cf1f2 100644 --- a/src/main/java/spoon/reflect/visitor/CtIterator.java +++ b/src/main/java/spoon/reflect/visitor/CtIterator.java @@ -7,13 +7,12 @@ */ package spoon.reflect.visitor; -import spoon.reflect.declaration.CtElement; - import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; import java.util.Iterator; import java.util.NoSuchElementException; +import spoon.reflect.declaration.CtElement; /** * A class to be able to iterate over the children elements in the tree of a given node, in depth-first order. diff --git a/src/main/java/spoon/reflect/visitor/CtScanner.java b/src/main/java/spoon/reflect/visitor/CtScanner.java index ee221b9208a..7b4e536c2e2 100644 --- a/src/main/java/spoon/reflect/visitor/CtScanner.java +++ b/src/main/java/spoon/reflect/visitor/CtScanner.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; - import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; import spoon.reflect.code.CtArrayWrite; @@ -1126,4 +1125,3 @@ public void visitCtUnnamedPattern(CtUnnamedPattern unnamedPattern) { exit(unnamedPattern); } } - diff --git a/src/main/java/spoon/reflect/visitor/CtVisitor.java b/src/main/java/spoon/reflect/visitor/CtVisitor.java index e38e946f935..ab6ca0cc4f5 100644 --- a/src/main/java/spoon/reflect/visitor/CtVisitor.java +++ b/src/main/java/spoon/reflect/visitor/CtVisitor.java @@ -8,7 +8,6 @@ package spoon.reflect.visitor; import java.lang.annotation.Annotation; - import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; import spoon.reflect.code.CtArrayWrite; diff --git a/src/main/java/spoon/reflect/visitor/DefaultImportComparator.java b/src/main/java/spoon/reflect/visitor/DefaultImportComparator.java index 16f1e246bc9..47e47a3eacf 100644 --- a/src/main/java/spoon/reflect/visitor/DefaultImportComparator.java +++ b/src/main/java/spoon/reflect/visitor/DefaultImportComparator.java @@ -8,7 +8,6 @@ package spoon.reflect.visitor; import java.util.Comparator; - import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtImportKind; diff --git a/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java b/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java index 76af0925e80..65c38163597 100644 --- a/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java +++ b/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java @@ -7,6 +7,14 @@ */ package spoon.reflect.visitor; +import java.lang.annotation.Annotation; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spoon.SpoonException; @@ -128,15 +136,6 @@ import spoon.support.reflect.reference.CtArrayTypeReferenceImpl; import spoon.support.util.ModelList; -import java.lang.annotation.Annotation; -import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - import static spoon.reflect.visitor.ElementPrinterHelper.PrintTypeArguments.ALSO_PRINT_DIAMOND_OPERATOR; import static spoon.reflect.visitor.ElementPrinterHelper.PrintTypeArguments.ONLY_PRINT_EXPLICIT_TYPES; diff --git a/src/main/java/spoon/reflect/visitor/EarlyTerminatingScanner.java b/src/main/java/spoon/reflect/visitor/EarlyTerminatingScanner.java index fa9f9baebfc..567a85b3e75 100644 --- a/src/main/java/spoon/reflect/visitor/EarlyTerminatingScanner.java +++ b/src/main/java/spoon/reflect/visitor/EarlyTerminatingScanner.java @@ -7,16 +7,15 @@ */ package spoon.reflect.visitor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; import spoon.reflect.visitor.chain.CtScannerListener; import spoon.reflect.visitor.chain.ScanningMode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - /** * Extends {@link CtScanner}, to support early termination of scanning process and scan listeners. * It is useful when your algorithm is searching for a specific node only. diff --git a/src/main/java/spoon/reflect/visitor/ElementPrinterHelper.java b/src/main/java/spoon/reflect/visitor/ElementPrinterHelper.java index 6348b86d05d..fc652f9bdb6 100644 --- a/src/main/java/spoon/reflect/visitor/ElementPrinterHelper.java +++ b/src/main/java/spoon/reflect/visitor/ElementPrinterHelper.java @@ -7,6 +7,15 @@ */ package spoon.reflect.visitor; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.function.Consumer; import spoon.compiler.Environment; import spoon.experimental.CtUnresolvedImport; import spoon.reflect.code.CtBlock; @@ -42,16 +51,6 @@ import spoon.reflect.visitor.printer.CommentOffset; import spoon.support.reflect.CtExtendedModifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.function.Consumer; - public class ElementPrinterHelper { private final DefaultJavaPrettyPrinter prettyPrinter; private final Environment env; diff --git a/src/main/java/spoon/reflect/visitor/ImportAnalyzer.java b/src/main/java/spoon/reflect/visitor/ImportAnalyzer.java index 9aa2dddd087..6b21a1125e8 100644 --- a/src/main/java/spoon/reflect/visitor/ImportAnalyzer.java +++ b/src/main/java/spoon/reflect/visitor/ImportAnalyzer.java @@ -7,6 +7,8 @@ */ package spoon.reflect.visitor; +import java.util.EnumSet; +import java.util.Set; import spoon.processing.AbstractProcessor; import spoon.processing.Processor; import spoon.reflect.code.CtConstructorCall; @@ -23,9 +25,6 @@ import spoon.reflect.visitor.chain.ScanningMode; import spoon.support.Experimental; -import java.util.EnumSet; -import java.util.Set; - /** *{@link Processor} of {@link CtCompilationUnit}, which scans CtCompilationUnit modules, packages and types * with purpose to find type references and expressions which might influence import directives. diff --git a/src/main/java/spoon/reflect/visitor/ImportCleaner.java b/src/main/java/spoon/reflect/visitor/ImportCleaner.java index 83106f249ac..884d6f1d1d3 100644 --- a/src/main/java/spoon/reflect/visitor/ImportCleaner.java +++ b/src/main/java/spoon/reflect/visitor/ImportCleaner.java @@ -7,6 +7,16 @@ */ package spoon.reflect.visitor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import spoon.SpoonException; import spoon.experimental.CtUnresolvedImport; import spoon.javadoc.internal.JavadocDescriptionElement; @@ -39,17 +49,6 @@ import spoon.support.util.ModelList; import spoon.support.visitor.equals.EqualsVisitor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - /** * Updates list of import statements of compilation unit following {@link CtElement#isImplicit()}. diff --git a/src/main/java/spoon/reflect/visitor/ImportConflictDetector.java b/src/main/java/spoon/reflect/visitor/ImportConflictDetector.java index bcfd41ec18a..1e837213cea 100644 --- a/src/main/java/spoon/reflect/visitor/ImportConflictDetector.java +++ b/src/main/java/spoon/reflect/visitor/ImportConflictDetector.java @@ -7,6 +7,7 @@ */ package spoon.reflect.visitor; +import java.util.Map; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFieldAccess; import spoon.reflect.code.CtInvocation; @@ -26,8 +27,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.support.Experimental; -import java.util.Map; - /** * Detects conflicts needed to be required be a fully-qualified name. * diff --git a/src/main/java/spoon/reflect/visitor/ImportScanner.java b/src/main/java/spoon/reflect/visitor/ImportScanner.java index 5c77aea0636..33febf8f783 100644 --- a/src/main/java/spoon/reflect/visitor/ImportScanner.java +++ b/src/main/java/spoon/reflect/visitor/ImportScanner.java @@ -7,13 +7,12 @@ */ package spoon.reflect.visitor; +import java.util.Set; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtReference; import spoon.support.Experimental; -import java.util.Set; - /** * Used to compute the imports required to write readable code with no fully qualified names. * The import scanner API might still change in future release, that's why it is marked as experimental. diff --git a/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java b/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java index c4c026cae8e..618702871fe 100644 --- a/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java +++ b/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java @@ -7,6 +7,20 @@ */ package spoon.reflect.visitor; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import spoon.experimental.CtUnresolvedImport; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtCatchVariable; @@ -22,6 +36,7 @@ import spoon.reflect.declaration.CtEnum; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtField; +import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtPackage; @@ -32,28 +47,12 @@ import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtReference; import spoon.reflect.reference.CtTypeReference; import spoon.support.SpoonClassNotFoundException; import spoon.support.reflect.reference.CtTypeMemberWildcardImportReferenceImpl; -import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * A scanner that calculates the imports for a given model. * diff --git a/src/main/java/spoon/reflect/visitor/JavaIdentifiers.java b/src/main/java/spoon/reflect/visitor/JavaIdentifiers.java index 645fc2e2860..669e3928e5c 100644 --- a/src/main/java/spoon/reflect/visitor/JavaIdentifiers.java +++ b/src/main/java/spoon/reflect/visitor/JavaIdentifiers.java @@ -7,11 +7,10 @@ */ package spoon.reflect.visitor; -import spoon.reflect.reference.CtExecutableReference; - import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; +import spoon.reflect.reference.CtExecutableReference; /** * This enum defines the Java keywords and some helper method to determine if diff --git a/src/main/java/spoon/reflect/visitor/LexicalScope.java b/src/main/java/spoon/reflect/visitor/LexicalScope.java index 6a5dccc6646..2b444bc0b80 100644 --- a/src/main/java/spoon/reflect/visitor/LexicalScope.java +++ b/src/main/java/spoon/reflect/visitor/LexicalScope.java @@ -7,12 +7,11 @@ */ package spoon.reflect.visitor; +import java.util.function.Function; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtNamedElement; import spoon.support.Experimental; -import java.util.function.Function; - /** * Represents that a lexical scope in the language * diff --git a/src/main/java/spoon/reflect/visitor/LexicalScopeScanner.java b/src/main/java/spoon/reflect/visitor/LexicalScopeScanner.java index 0872a006c89..8f00fc96113 100644 --- a/src/main/java/spoon/reflect/visitor/LexicalScopeScanner.java +++ b/src/main/java/spoon/reflect/visitor/LexicalScopeScanner.java @@ -7,6 +7,11 @@ */ package spoon.reflect.visitor; +import java.lang.annotation.Annotation; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtCatch; import spoon.reflect.code.CtLambda; @@ -20,12 +25,6 @@ import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; -import java.lang.annotation.Annotation; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashMap; -import java.util.Map; - /** * A {@link CtScanner} which provides current lexical scope * of currently scanned AST node. diff --git a/src/main/java/spoon/reflect/visitor/ModelConsistencyChecker.java b/src/main/java/spoon/reflect/visitor/ModelConsistencyChecker.java index 78d7bef10cf..6f1a2a4108b 100644 --- a/src/main/java/spoon/reflect/visitor/ModelConsistencyChecker.java +++ b/src/main/java/spoon/reflect/visitor/ModelConsistencyChecker.java @@ -7,17 +7,16 @@ */ package spoon.reflect.visitor; -import spoon.compiler.Environment; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtNamedElement; -import spoon.support.Internal; -import spoon.support.Level; - import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; import java.util.stream.Collectors; +import spoon.compiler.Environment; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtNamedElement; +import spoon.support.Internal; +import spoon.support.Level; /** * This scanner checks that a program model is consistent with regards to the diff --git a/src/main/java/spoon/reflect/visitor/NameScopeImpl.java b/src/main/java/spoon/reflect/visitor/NameScopeImpl.java index 8613b8fa2a5..e5613b59bc7 100644 --- a/src/main/java/spoon/reflect/visitor/NameScopeImpl.java +++ b/src/main/java/spoon/reflect/visitor/NameScopeImpl.java @@ -12,7 +12,6 @@ import java.util.Map; import java.util.Optional; import java.util.function.Function; - import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtParameter; diff --git a/src/main/java/spoon/reflect/visitor/OperatorHelper.java b/src/main/java/spoon/reflect/visitor/OperatorHelper.java index 78520a38cd6..001c72c37ad 100644 --- a/src/main/java/spoon/reflect/visitor/OperatorHelper.java +++ b/src/main/java/spoon/reflect/visitor/OperatorHelper.java @@ -7,6 +7,8 @@ */ package spoon.reflect.visitor; +import java.util.Optional; +import java.util.Set; import spoon.SpoonException; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtExpression; @@ -16,9 +18,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.support.Internal; -import java.util.Optional; -import java.util.Set; - /** * Computes source code representation of the operator */ diff --git a/src/main/java/spoon/reflect/visitor/PrettyPrinter.java b/src/main/java/spoon/reflect/visitor/PrettyPrinter.java index b4324c9490b..c7f07ed774b 100644 --- a/src/main/java/spoon/reflect/visitor/PrettyPrinter.java +++ b/src/main/java/spoon/reflect/visitor/PrettyPrinter.java @@ -7,15 +7,14 @@ */ package spoon.reflect.visitor; +import java.util.List; +import java.util.Map; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; -import java.util.List; -import java.util.Map; - /** * This interface defines the pretty printers. */ diff --git a/src/main/java/spoon/reflect/visitor/PrinterHelper.java b/src/main/java/spoon/reflect/visitor/PrinterHelper.java index 82072fde69c..eb837e1a6ef 100644 --- a/src/main/java/spoon/reflect/visitor/PrinterHelper.java +++ b/src/main/java/spoon/reflect/visitor/PrinterHelper.java @@ -7,16 +7,15 @@ */ package spoon.reflect.visitor; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import spoon.compiler.Environment; import spoon.reflect.cu.SourcePosition; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; import spoon.support.reflect.cu.position.PartialSourcePositionImpl; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - /** * Supports configurable printing of text with indentations and line and column counting */ diff --git a/src/main/java/spoon/reflect/visitor/PrintingContext.java b/src/main/java/spoon/reflect/visitor/PrintingContext.java index 0307c9b1c84..8087ef022b8 100644 --- a/src/main/java/spoon/reflect/visitor/PrintingContext.java +++ b/src/main/java/spoon/reflect/visitor/PrintingContext.java @@ -7,16 +7,15 @@ */ package spoon.reflect.visitor; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.EnumSet; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtTypeReference; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.EnumSet; - public class PrintingContext { private CtStatement statement; private EnumSet states = EnumSet.noneOf(PrintingOptions.class); diff --git a/src/main/java/spoon/reflect/visitor/Query.java b/src/main/java/spoon/reflect/visitor/Query.java index 0ce2601242c..742eb14d846 100644 --- a/src/main/java/spoon/reflect/visitor/Query.java +++ b/src/main/java/spoon/reflect/visitor/Query.java @@ -7,14 +7,13 @@ */ package spoon.reflect.visitor; +import java.util.List; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtReference; import spoon.reflect.visitor.chain.CtFunction; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.List; - /** * This class provides some useful methods to retrieve program elements and * reference through a {@link spoon.reflect.visitor.CtScanner}-based deep diff --git a/src/main/java/spoon/reflect/visitor/TypeNameScope.java b/src/main/java/spoon/reflect/visitor/TypeNameScope.java index 72974ef14ab..1326c1081db 100644 --- a/src/main/java/spoon/reflect/visitor/TypeNameScope.java +++ b/src/main/java/spoon/reflect/visitor/TypeNameScope.java @@ -11,7 +11,6 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; - import spoon.experimental.CtUnresolvedImport; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtField; diff --git a/src/main/java/spoon/reflect/visitor/chain/CtQuery.java b/src/main/java/spoon/reflect/visitor/chain/CtQuery.java index 75a3af27332..2fb959d8546 100644 --- a/src/main/java/spoon/reflect/visitor/chain/CtQuery.java +++ b/src/main/java/spoon/reflect/visitor/chain/CtQuery.java @@ -7,12 +7,11 @@ */ package spoon.reflect.visitor.chain; +import java.util.List; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.Filter; -import java.util.List; - /** *

CtQuery represents a query, which can be used to traverse a spoon model and collect * children elements in several ways.

@@ -89,7 +88,7 @@ public interface CtQuery extends CtQueryable { * * This avoids to create useless intermediate lists. * - * @param consumer The consumer which accepts the results of the query + * @param consumer The consumer which accepts the results of the query */ void forEach(CtConsumer consumer); diff --git a/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java b/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java index a995111df12..b8635c6f098 100644 --- a/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java +++ b/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java @@ -7,14 +7,6 @@ */ package spoon.reflect.visitor.chain; -import spoon.Launcher; -import spoon.SpoonException; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtType; -import spoon.reflect.visitor.Filter; -import spoon.reflect.visitor.filter.CtScannerFunction; -import spoon.support.util.RtHelper; - import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.ArrayList; @@ -22,6 +14,13 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import spoon.Launcher; +import spoon.SpoonException; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtType; +import spoon.reflect.visitor.Filter; +import spoon.reflect.visitor.filter.CtScannerFunction; +import spoon.support.util.RtHelper; /** * The facade of {@link CtQuery} which represents a query bound to the {@link CtElement}, diff --git a/src/main/java/spoon/reflect/visitor/filter/AbstractFilter.java b/src/main/java/spoon/reflect/visitor/filter/AbstractFilter.java index d99030d5c68..794f2a2888f 100644 --- a/src/main/java/spoon/reflect/visitor/filter/AbstractFilter.java +++ b/src/main/java/spoon/reflect/visitor/filter/AbstractFilter.java @@ -8,7 +8,6 @@ package spoon.reflect.visitor.filter; import java.lang.reflect.Method; - import spoon.SpoonException; import spoon.reflect.declaration.CtElement; import spoon.reflect.visitor.Filter; diff --git a/src/main/java/spoon/reflect/visitor/filter/AllMethodsSameSignatureFunction.java b/src/main/java/spoon/reflect/visitor/filter/AllMethodsSameSignatureFunction.java index 9aeadd29966..794f76821d1 100644 --- a/src/main/java/spoon/reflect/visitor/filter/AllMethodsSameSignatureFunction.java +++ b/src/main/java/spoon/reflect/visitor/filter/AllMethodsSameSignatureFunction.java @@ -12,7 +12,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import spoon.SpoonException; import spoon.reflect.code.CtLambda; import spoon.reflect.declaration.CtExecutable; diff --git a/src/main/java/spoon/reflect/visitor/filter/AllTypeMembersFunction.java b/src/main/java/spoon/reflect/visitor/filter/AllTypeMembersFunction.java index b0d8bb3381a..882ae90a2aa 100644 --- a/src/main/java/spoon/reflect/visitor/filter/AllTypeMembersFunction.java +++ b/src/main/java/spoon/reflect/visitor/filter/AllTypeMembersFunction.java @@ -9,7 +9,6 @@ import java.util.HashSet; import java.util.Set; - import spoon.SpoonException; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeInformation; diff --git a/src/main/java/spoon/reflect/visitor/filter/AnnotationFilter.java b/src/main/java/spoon/reflect/visitor/filter/AnnotationFilter.java index 53118d9b935..03b8eee44c6 100644 --- a/src/main/java/spoon/reflect/visitor/filter/AnnotationFilter.java +++ b/src/main/java/spoon/reflect/visitor/filter/AnnotationFilter.java @@ -8,7 +8,6 @@ package spoon.reflect.visitor.filter; import java.lang.annotation.Annotation; - import spoon.reflect.declaration.CtElement; /** diff --git a/src/main/java/spoon/reflect/visitor/filter/ExecutableReferenceFilter.java b/src/main/java/spoon/reflect/visitor/filter/ExecutableReferenceFilter.java index ed415fa6c07..3fac2a2d025 100644 --- a/src/main/java/spoon/reflect/visitor/filter/ExecutableReferenceFilter.java +++ b/src/main/java/spoon/reflect/visitor/filter/ExecutableReferenceFilter.java @@ -7,6 +7,10 @@ */ package spoon.reflect.visitor.filter; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Set; import spoon.SpoonException; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; @@ -16,11 +20,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.Filter; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Set; - /** * This filter matches all the {@link CtExecutableReference} referencing defined one or more {@link CtExecutable}s. */ diff --git a/src/main/java/spoon/reflect/visitor/filter/LambdaFilter.java b/src/main/java/spoon/reflect/visitor/filter/LambdaFilter.java index be46a7a78f2..f3f8cb6e66c 100644 --- a/src/main/java/spoon/reflect/visitor/filter/LambdaFilter.java +++ b/src/main/java/spoon/reflect/visitor/filter/LambdaFilter.java @@ -9,7 +9,6 @@ import java.util.HashSet; import java.util.Set; - import spoon.reflect.code.CtLambda; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtType; diff --git a/src/main/java/spoon/reflect/visitor/filter/PotentialVariableDeclarationFunction.java b/src/main/java/spoon/reflect/visitor/filter/PotentialVariableDeclarationFunction.java index c03fef1ac48..369c35b3abb 100644 --- a/src/main/java/spoon/reflect/visitor/filter/PotentialVariableDeclarationFunction.java +++ b/src/main/java/spoon/reflect/visitor/filter/PotentialVariableDeclarationFunction.java @@ -7,6 +7,7 @@ */ package spoon.reflect.visitor.filter; +import java.util.List; import spoon.reflect.code.CaseKind; import spoon.reflect.code.CtBodyHolder; import spoon.reflect.code.CtCase; @@ -31,8 +32,6 @@ import spoon.reflect.visitor.chain.CtQuery; import spoon.reflect.visitor.chain.CtQueryAware; -import java.util.List; - /** * This mapping function searches for all {@link CtVariable} instances, * which might be a declaration of an input {@link CtElement}. diff --git a/src/main/java/spoon/reflect/visitor/filter/RegexFilter.java b/src/main/java/spoon/reflect/visitor/filter/RegexFilter.java index 2bfbba9d328..58b3771ef60 100644 --- a/src/main/java/spoon/reflect/visitor/filter/RegexFilter.java +++ b/src/main/java/spoon/reflect/visitor/filter/RegexFilter.java @@ -9,7 +9,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; - import spoon.reflect.declaration.CtElement; import spoon.reflect.visitor.Filter; diff --git a/src/main/java/spoon/reflect/visitor/filter/SuperInheritanceHierarchyFunction.java b/src/main/java/spoon/reflect/visitor/filter/SuperInheritanceHierarchyFunction.java index 9f930059ece..685474ab204 100644 --- a/src/main/java/spoon/reflect/visitor/filter/SuperInheritanceHierarchyFunction.java +++ b/src/main/java/spoon/reflect/visitor/filter/SuperInheritanceHierarchyFunction.java @@ -7,6 +7,7 @@ */ package spoon.reflect.visitor.filter; +import java.util.Set; import spoon.Launcher; import spoon.SpoonException; import spoon.reflect.declaration.CtClass; @@ -22,8 +23,6 @@ import spoon.reflect.visitor.chain.ScanningMode; import spoon.support.SpoonClassNotFoundException; -import java.util.Set; - /** * Expects a {@link CtTypeInformation} as input * and produces all super classes and super interfaces recursively.
diff --git a/src/main/java/spoon/support/DefaultCoreFactory.java b/src/main/java/spoon/support/DefaultCoreFactory.java index 7be746e00b3..badd45a8e3d 100644 --- a/src/main/java/spoon/support/DefaultCoreFactory.java +++ b/src/main/java/spoon/support/DefaultCoreFactory.java @@ -11,7 +11,6 @@ import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.Set; - import spoon.experimental.CtUnresolvedImport; import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtArrayRead; diff --git a/src/main/java/spoon/support/DefaultOutputDestinationHandler.java b/src/main/java/spoon/support/DefaultOutputDestinationHandler.java index e60dc3b29b7..d9a7fcb8d71 100644 --- a/src/main/java/spoon/support/DefaultOutputDestinationHandler.java +++ b/src/main/java/spoon/support/DefaultOutputDestinationHandler.java @@ -7,16 +7,15 @@ */ package spoon.support; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; import spoon.compiler.Environment; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; - /** * Default behavior for the destination of the spoon. */ diff --git a/src/main/java/spoon/support/DerivedProperty.java b/src/main/java/spoon/support/DerivedProperty.java index 9688ecdbc36..2d9df2f9057 100644 --- a/src/main/java/spoon/support/DerivedProperty.java +++ b/src/main/java/spoon/support/DerivedProperty.java @@ -7,12 +7,11 @@ */ package spoon.support; -import spoon.reflect.declaration.CtType; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import spoon.reflect.declaration.CtType; /** * Tells that a metamodel property is derived, ie computed from the value of another property. diff --git a/src/main/java/spoon/support/JavaOutputProcessor.java b/src/main/java/spoon/support/JavaOutputProcessor.java index e0b8b70f00e..7825c523ea8 100644 --- a/src/main/java/spoon/support/JavaOutputProcessor.java +++ b/src/main/java/spoon/support/JavaOutputProcessor.java @@ -7,6 +7,15 @@ */ package spoon.support; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import spoon.Launcher; import spoon.SpoonException; import spoon.compiler.Environment; @@ -21,16 +30,6 @@ import spoon.reflect.visitor.PrettyPrinter; import spoon.support.compiler.SpoonProgress; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * A processor that generates compilable Java source files from the meta-model. */ diff --git a/src/main/java/spoon/support/OutputDestinationHandler.java b/src/main/java/spoon/support/OutputDestinationHandler.java index de31e77613f..dd1ab303609 100644 --- a/src/main/java/spoon/support/OutputDestinationHandler.java +++ b/src/main/java/spoon/support/OutputDestinationHandler.java @@ -7,13 +7,12 @@ */ package spoon.support; +import java.io.File; +import java.nio.file.Path; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; -import java.io.File; -import java.nio.file.Path; - public interface OutputDestinationHandler { Path getOutputPath(CtModule module, CtPackage pack, CtType type); diff --git a/src/main/java/spoon/support/QueueProcessingManager.java b/src/main/java/spoon/support/QueueProcessingManager.java index ed8b9a18591..327278d7926 100644 --- a/src/main/java/spoon/support/QueueProcessingManager.java +++ b/src/main/java/spoon/support/QueueProcessingManager.java @@ -7,6 +7,11 @@ */ package spoon.support; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; import spoon.SpoonException; import spoon.processing.ProcessInterruption; import spoon.processing.ProcessingManager; @@ -16,12 +21,6 @@ import spoon.support.compiler.SpoonProgress; import spoon.support.visitor.ProcessingVisitor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - /** * This processing manager applies the processors one by one from the given root element. * for p : processors diff --git a/src/main/java/spoon/support/RuntimeProcessingManager.java b/src/main/java/spoon/support/RuntimeProcessingManager.java index 9ab0c986291..258efe13594 100644 --- a/src/main/java/spoon/support/RuntimeProcessingManager.java +++ b/src/main/java/spoon/support/RuntimeProcessingManager.java @@ -7,6 +7,9 @@ */ package spoon.support; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import spoon.processing.ProcessInterruption; import spoon.processing.ProcessingManager; import spoon.processing.Processor; @@ -15,10 +18,6 @@ import spoon.reflect.factory.Factory; import spoon.support.visitor.ProcessingVisitor; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - /** * This processing manager implements a blocking processing policy that consists * of applying the processors in a FIFO order until no processors remain to be diff --git a/src/main/java/spoon/support/SerializationModelStreamer.java b/src/main/java/spoon/support/SerializationModelStreamer.java index d79249caaec..fd99208840a 100644 --- a/src/main/java/spoon/support/SerializationModelStreamer.java +++ b/src/main/java/spoon/support/SerializationModelStreamer.java @@ -16,14 +16,12 @@ import java.io.OutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; - import org.apache.commons.compress.compressors.CompressorException; import org.apache.commons.compress.compressors.CompressorStreamFactory; import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream; import org.apache.commons.compress.compressors.lzma.LZMACompressorInputStream; import org.apache.commons.compress.compressors.lzma.LZMACompressorOutputStream; - import spoon.Launcher; import spoon.reflect.ModelStreamer; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/support/StandardEnvironment.java b/src/main/java/spoon/support/StandardEnvironment.java index cf7c3e31ce2..d6ca0c42a69 100644 --- a/src/main/java/spoon/support/StandardEnvironment.java +++ b/src/main/java/spoon/support/StandardEnvironment.java @@ -8,6 +8,24 @@ package spoon.support; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystemNotFoundException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.function.Supplier; import org.slf4j.Logger; import spoon.Launcher; import spoon.OutputType; @@ -37,25 +55,6 @@ import spoon.support.modelobs.EmptyModelChangeListener; import spoon.support.modelobs.FineModelChangeListener; -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLDecoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileSystemNotFoundException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.function.Supplier; - /** * This class implements a simple Spoon environment that reports messages in the diff --git a/src/main/java/spoon/support/adaption/AdaptionVisitor.java b/src/main/java/spoon/support/adaption/AdaptionVisitor.java index 2824500db90..7cca82cf625 100644 --- a/src/main/java/spoon/support/adaption/AdaptionVisitor.java +++ b/src/main/java/spoon/support/adaption/AdaptionVisitor.java @@ -7,6 +7,8 @@ */ package spoon.support.adaption; +import java.util.List; +import java.util.stream.Collectors; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtIntersectionTypeReference; @@ -15,9 +17,6 @@ import spoon.reflect.reference.CtWildcardReference; import spoon.reflect.visitor.CtAbstractVisitor; -import java.util.List; -import java.util.stream.Collectors; - /** * A visitor that rewrites everything with a generic type according to a {@link Node} hierarchy. This class changes the * type arguments of cloned references and methods to what they should be after adaption. diff --git a/src/main/java/spoon/support/adaption/DeclarationNode.java b/src/main/java/spoon/support/adaption/DeclarationNode.java index 12d53843a7f..afa9654c48d 100644 --- a/src/main/java/spoon/support/adaption/DeclarationNode.java +++ b/src/main/java/spoon/support/adaption/DeclarationNode.java @@ -7,18 +7,17 @@ */ package spoon.support.adaption; -import spoon.SpoonException; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtTypeParameter; -import spoon.reflect.reference.CtTypeParameterReference; -import spoon.reflect.reference.CtTypeReference; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.StringJoiner; import java.util.stream.Collectors; +import spoon.SpoonException; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtTypeParameter; +import spoon.reflect.reference.CtTypeParameterReference; +import spoon.reflect.reference.CtTypeReference; import static spoon.support.adaption.NodePrintHelper.quote; import static spoon.support.adaption.NodePrintHelper.toJsonLikeArray; diff --git a/src/main/java/spoon/support/adaption/GlueNode.java b/src/main/java/spoon/support/adaption/GlueNode.java index b30deb6fb5d..1327d6fc3ae 100644 --- a/src/main/java/spoon/support/adaption/GlueNode.java +++ b/src/main/java/spoon/support/adaption/GlueNode.java @@ -7,17 +7,16 @@ */ package spoon.support.adaption; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtTypeParameter; -import spoon.reflect.reference.CtTypeParameterReference; -import spoon.reflect.reference.CtTypeReference; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.StringJoiner; import java.util.stream.Collectors; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtTypeParameter; +import spoon.reflect.reference.CtTypeParameterReference; +import spoon.reflect.reference.CtTypeReference; import static spoon.support.adaption.NodePrintHelper.quote; import static spoon.support.adaption.NodePrintHelper.toJsonLikeArray; diff --git a/src/main/java/spoon/support/adaption/TypeAdaptor.java b/src/main/java/spoon/support/adaption/TypeAdaptor.java index dacd5de41bc..d702f6d0fad 100644 --- a/src/main/java/spoon/support/adaption/TypeAdaptor.java +++ b/src/main/java/spoon/support/adaption/TypeAdaptor.java @@ -7,6 +7,13 @@ */ package spoon.support.adaption; +import java.util.ArrayDeque; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Queue; +import java.util.Set; +import java.util.stream.Collectors; import spoon.SpoonException; import spoon.processing.FactoryAccessor; import spoon.reflect.declaration.CtConstructor; @@ -23,14 +30,6 @@ import spoon.support.visitor.ClassTypingContext; import spoon.support.visitor.MethodTypingContext; -import java.util.ArrayDeque; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Queue; -import java.util.Set; -import java.util.stream.Collectors; - /** * Determines subtyping relationships and adapts generics from a super- to a subclass. */ diff --git a/src/main/java/spoon/support/comparator/CtLineElementComparator.java b/src/main/java/spoon/support/comparator/CtLineElementComparator.java index 3b129daadf7..f224d5ee0f1 100644 --- a/src/main/java/spoon/support/comparator/CtLineElementComparator.java +++ b/src/main/java/spoon/support/comparator/CtLineElementComparator.java @@ -9,7 +9,6 @@ import java.io.Serializable; import java.util.Comparator; - import spoon.reflect.declaration.CtElement; /** diff --git a/src/main/java/spoon/support/comparator/DeepRepresentationComparator.java b/src/main/java/spoon/support/comparator/DeepRepresentationComparator.java index 4f25d2052bb..c535b55da93 100644 --- a/src/main/java/spoon/support/comparator/DeepRepresentationComparator.java +++ b/src/main/java/spoon/support/comparator/DeepRepresentationComparator.java @@ -7,10 +7,9 @@ */ package spoon.support.comparator; -import spoon.reflect.declaration.CtElement; - import java.io.Serializable; import java.util.Comparator; +import spoon.reflect.declaration.CtElement; /** * Compares based on a toString representation. diff --git a/src/main/java/spoon/support/comparator/FixedOrderBasedOnFileNameCompilationUnitComparator.java b/src/main/java/spoon/support/comparator/FixedOrderBasedOnFileNameCompilationUnitComparator.java index 5355c191726..04d2de47c9a 100644 --- a/src/main/java/spoon/support/comparator/FixedOrderBasedOnFileNameCompilationUnitComparator.java +++ b/src/main/java/spoon/support/comparator/FixedOrderBasedOnFileNameCompilationUnitComparator.java @@ -7,9 +7,8 @@ */ package spoon.support.comparator; -import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; - import java.util.Comparator; +import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; public class FixedOrderBasedOnFileNameCompilationUnitComparator implements Comparator { @Override diff --git a/src/main/java/spoon/support/comparator/QualifiedNameComparator.java b/src/main/java/spoon/support/comparator/QualifiedNameComparator.java index ca6618dab35..30732a0fd25 100644 --- a/src/main/java/spoon/support/comparator/QualifiedNameComparator.java +++ b/src/main/java/spoon/support/comparator/QualifiedNameComparator.java @@ -9,7 +9,6 @@ import java.io.Serializable; import java.util.Comparator; - import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtPackage; @@ -51,4 +50,3 @@ public int compare(CtElement o1, CtElement o2) { } } } - diff --git a/src/main/java/spoon/support/comparator/SignatureComparator.java b/src/main/java/spoon/support/comparator/SignatureComparator.java index a76384c7c6c..cb9369d5db7 100644 --- a/src/main/java/spoon/support/comparator/SignatureComparator.java +++ b/src/main/java/spoon/support/comparator/SignatureComparator.java @@ -7,11 +7,10 @@ */ package spoon.support.comparator; -import spoon.reflect.declaration.CtElement; -import spoon.support.visitor.SignaturePrinter; - import java.io.Serializable; import java.util.Comparator; +import spoon.reflect.declaration.CtElement; +import spoon.support.visitor.SignaturePrinter; /** * Compares executables (method, executable-references) based on a signature. diff --git a/src/main/java/spoon/support/compiler/FileSystemFile.java b/src/main/java/spoon/support/compiler/FileSystemFile.java index a94c683a7be..be4edb47d19 100644 --- a/src/main/java/spoon/support/compiler/FileSystemFile.java +++ b/src/main/java/spoon/support/compiler/FileSystemFile.java @@ -12,7 +12,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; - import spoon.Launcher; import spoon.SpoonException; import spoon.compiler.SpoonFile; diff --git a/src/main/java/spoon/support/compiler/FileSystemFolder.java b/src/main/java/spoon/support/compiler/FileSystemFolder.java index 114c73b6ad6..e7678753986 100644 --- a/src/main/java/spoon/support/compiler/FileSystemFolder.java +++ b/src/main/java/spoon/support/compiler/FileSystemFolder.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; - import spoon.Launcher; import spoon.SpoonException; import spoon.compiler.SpoonFile; diff --git a/src/main/java/spoon/support/compiler/FilteringFolder.java b/src/main/java/spoon/support/compiler/FilteringFolder.java index 17cb731bcb4..a293ec2e419 100644 --- a/src/main/java/spoon/support/compiler/FilteringFolder.java +++ b/src/main/java/spoon/support/compiler/FilteringFolder.java @@ -8,7 +8,6 @@ package spoon.support.compiler; import java.util.ArrayList; - import spoon.compiler.SpoonResource; /** diff --git a/src/main/java/spoon/support/compiler/ProgressLogger.java b/src/main/java/spoon/support/compiler/ProgressLogger.java index 9251954ed29..25a941b0633 100644 --- a/src/main/java/spoon/support/compiler/ProgressLogger.java +++ b/src/main/java/spoon/support/compiler/ProgressLogger.java @@ -7,9 +7,8 @@ */ package spoon.support.compiler; -import spoon.compiler.Environment; - import java.util.GregorianCalendar; +import spoon.compiler.Environment; public class ProgressLogger implements SpoonProgress { private long stepTimer; diff --git a/src/main/java/spoon/support/compiler/SnippetCompilationError.java b/src/main/java/spoon/support/compiler/SnippetCompilationError.java index fea7c38fd5b..ddf43aed3e3 100644 --- a/src/main/java/spoon/support/compiler/SnippetCompilationError.java +++ b/src/main/java/spoon/support/compiler/SnippetCompilationError.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.List; - import spoon.SpoonException; public class SnippetCompilationError extends SpoonException { diff --git a/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java b/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java index d01c368b7b6..4ec86be15a2 100644 --- a/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java +++ b/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java @@ -8,6 +8,13 @@ package spoon.support.compiler; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import spoon.SpoonModelBuilder; import spoon.compiler.ModelBuildingException; import spoon.reflect.code.CtBlock; @@ -33,14 +40,6 @@ import spoon.support.compiler.jdt.PositionBuilder; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** Helper class for working with snippets */ public class SnippetCompilationHelper { diff --git a/src/main/java/spoon/support/compiler/SpoonPom.java b/src/main/java/spoon/support/compiler/SpoonPom.java index 9d4ede1447f..4f93028463f 100644 --- a/src/main/java/spoon/support/compiler/SpoonPom.java +++ b/src/main/java/spoon/support/compiler/SpoonPom.java @@ -7,6 +7,25 @@ */ package spoon.support.compiler; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.maven.model.Build; import org.apache.maven.model.BuildBase; import org.apache.maven.model.Model; @@ -31,26 +50,6 @@ import spoon.compiler.SpoonResourceHelper; import spoon.support.Internal; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class SpoonPom implements SpoonResource { static String mavenVersionParsing = "Maven home: "; static String spoonClasspathTmpFileName = "spoon.classpath.tmp"; diff --git a/src/main/java/spoon/support/compiler/VirtualFile.java b/src/main/java/spoon/support/compiler/VirtualFile.java index aaa19488eac..dcd1835a686 100644 --- a/src/main/java/spoon/support/compiler/VirtualFile.java +++ b/src/main/java/spoon/support/compiler/VirtualFile.java @@ -7,13 +7,12 @@ */ package spoon.support.compiler; -import spoon.compiler.Environment; -import spoon.compiler.SpoonFile; -import spoon.compiler.SpoonFolder; - import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; +import spoon.compiler.Environment; +import spoon.compiler.SpoonFile; +import spoon.compiler.SpoonFolder; public class VirtualFile implements SpoonFile { public static final String VIRTUAL_FILE_NAME = "virtual_file"; diff --git a/src/main/java/spoon/support/compiler/VirtualFolder.java b/src/main/java/spoon/support/compiler/VirtualFolder.java index d326bc7108f..aaf3b8d6ea7 100644 --- a/src/main/java/spoon/support/compiler/VirtualFolder.java +++ b/src/main/java/spoon/support/compiler/VirtualFolder.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; - import spoon.compiler.SpoonFile; import spoon.compiler.SpoonFolder; diff --git a/src/main/java/spoon/support/compiler/ZipFile.java b/src/main/java/spoon/support/compiler/ZipFile.java index 4857cd32800..087e32e3702 100644 --- a/src/main/java/spoon/support/compiler/ZipFile.java +++ b/src/main/java/spoon/support/compiler/ZipFile.java @@ -7,11 +7,6 @@ */ package spoon.support.compiler; -import spoon.SpoonException; -import spoon.compiler.SpoonFile; -import spoon.compiler.SpoonFolder; -import spoon.support.Internal; - import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -20,6 +15,10 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.Objects; +import spoon.SpoonException; +import spoon.compiler.SpoonFile; +import spoon.compiler.SpoonFolder; +import spoon.support.Internal; public class ZipFile implements SpoonFile { diff --git a/src/main/java/spoon/support/compiler/ZipFolder.java b/src/main/java/spoon/support/compiler/ZipFolder.java index cd4fd03f64d..c7386ae168e 100644 --- a/src/main/java/spoon/support/compiler/ZipFolder.java +++ b/src/main/java/spoon/support/compiler/ZipFolder.java @@ -7,13 +7,6 @@ */ package spoon.support.compiler; -import org.apache.commons.io.FileUtils; -import spoon.Launcher; -import spoon.SpoonException; -import spoon.compiler.SpoonFile; -import spoon.compiler.SpoonFolder; -import spoon.compiler.SpoonResourceHelper; - import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -36,6 +29,12 @@ import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import org.apache.commons.io.FileUtils; +import spoon.Launcher; +import spoon.SpoonException; +import spoon.compiler.SpoonFile; +import spoon.compiler.SpoonFolder; +import spoon.compiler.SpoonResourceHelper; public class ZipFolder implements SpoonFolder { diff --git a/src/main/java/spoon/support/compiler/jdt/CompilationUnitFilter.java b/src/main/java/spoon/support/compiler/jdt/CompilationUnitFilter.java index 012b645fbe9..676a9c8cda2 100644 --- a/src/main/java/spoon/support/compiler/jdt/CompilationUnitFilter.java +++ b/src/main/java/spoon/support/compiler/jdt/CompilationUnitFilter.java @@ -23,8 +23,8 @@ public interface CompilationUnitFilter { /** * Tests if the file with path {@code path} should be excluded from the - * {@link spoon.reflect.CtModel} create by - * {@link spoon.SpoonModelBuilder#build(spoon.compiler.builder.JDTBuilder)}. + * {@link spoon.reflect.CtModel} create by + * {@link spoon.SpoonModelBuilder#build(spoon.compiler.builder.JDTBuilder)}. * * @param path * Path to the file that may or may not be excluded. diff --git a/src/main/java/spoon/support/compiler/jdt/CompilationUnitWrapper.java b/src/main/java/spoon/support/compiler/jdt/CompilationUnitWrapper.java index 61107b7a0d8..c49cfb99632 100644 --- a/src/main/java/spoon/support/compiler/jdt/CompilationUnitWrapper.java +++ b/src/main/java/spoon/support/compiler/jdt/CompilationUnitWrapper.java @@ -7,14 +7,12 @@ */ package spoon.support.compiler.jdt; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; - import spoon.reflect.declaration.CtType; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; -import java.util.ArrayList; -import java.util.List; - class CompilationUnitWrapper extends CompilationUnit { private CtType type; diff --git a/src/main/java/spoon/support/compiler/jdt/ContextBuilder.java b/src/main/java/spoon/support/compiler/jdt/ContextBuilder.java index 90303e43504..45e144f3aa7 100644 --- a/src/main/java/spoon/support/compiler/jdt/ContextBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/ContextBuilder.java @@ -7,6 +7,11 @@ */ package spoon.support.compiler.jdt; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.EnumSet; +import java.util.List; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.Expression; @@ -41,13 +46,8 @@ import spoon.support.Internal; import spoon.support.SpoonClassNotFoundException; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.EnumSet; -import java.util.List; - import static java.lang.String.format; + import static spoon.reflect.ModelElementContainerDefaultCapacities.CASTS_CONTAINER_DEFAULT_CAPACITY; @Internal diff --git a/src/main/java/spoon/support/compiler/jdt/FactoryCompilerConfig.java b/src/main/java/spoon/support/compiler/jdt/FactoryCompilerConfig.java index da2ac8ae071..83df5930246 100644 --- a/src/main/java/spoon/support/compiler/jdt/FactoryCompilerConfig.java +++ b/src/main/java/spoon/support/compiler/jdt/FactoryCompilerConfig.java @@ -9,9 +9,7 @@ import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; - import spoon.SpoonModelBuilder; import spoon.reflect.declaration.CtType; diff --git a/src/main/java/spoon/support/compiler/jdt/FileCompilerConfig.java b/src/main/java/spoon/support/compiler/jdt/FileCompilerConfig.java index 711cd0852a1..0223107f089 100644 --- a/src/main/java/spoon/support/compiler/jdt/FileCompilerConfig.java +++ b/src/main/java/spoon/support/compiler/jdt/FileCompilerConfig.java @@ -9,13 +9,11 @@ import java.util.ArrayList; import java.util.List; - +import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; import spoon.SpoonModelBuilder; import spoon.compiler.Environment; import spoon.compiler.SpoonFile; -import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; - public class FileCompilerConfig implements SpoonModelBuilder.InputType { /** diff --git a/src/main/java/spoon/support/compiler/jdt/JDTBasedSpoonCompiler.java b/src/main/java/spoon/support/compiler/jdt/JDTBasedSpoonCompiler.java index 6cebb118446..258bdf1441b 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTBasedSpoonCompiler.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTBasedSpoonCompiler.java @@ -7,6 +7,21 @@ */ package spoon.support.compiler.jdt; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.ASTVisitor; @@ -49,22 +64,6 @@ import spoon.support.modelobs.SourceFragmentCreator; import spoon.support.sniper.SniperJavaPrettyPrinter; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; - /** * Main class of Spoon to build the model. * Highly depends on {@link JDTBatchCompiler} for performing the job. diff --git a/src/main/java/spoon/support/compiler/jdt/JDTBatchCompiler.java b/src/main/java/spoon/support/compiler/jdt/JDTBatchCompiler.java index f8e7695598a..f4e43148df2 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTBatchCompiler.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTBatchCompiler.java @@ -7,6 +7,14 @@ */ package spoon.support.compiler.jdt; +import java.io.File; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; +import java.util.Set; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.CompilationProgress; @@ -26,15 +34,6 @@ import spoon.SpoonException; import spoon.support.compiler.SpoonProgress; -import java.io.File; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - /* * Overrides the getCompilationUnits() from JDT's class to pass the ones we want. * diff --git a/src/main/java/spoon/support/compiler/jdt/JDTCommentBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTCommentBuilder.java index f331a2a1b3f..55897efe088 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTCommentBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTCommentBuilder.java @@ -7,12 +7,22 @@ */ package spoon.support.compiler.jdt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.lang.annotation.Annotation; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.regex.Pattern; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.jspecify.annotations.Nullable; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import spoon.SpoonException; import spoon.reflect.code.CtAbstractSwitch; import spoon.reflect.code.CtBinaryOperator; @@ -58,18 +68,6 @@ import spoon.reflect.visitor.DefaultJavaPrettyPrinter; import spoon.reflect.visitor.EarlyTerminatingScanner; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.lang.annotation.Annotation; -import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.regex.Pattern; - /** * The comment builder that will insert all element of a CompilationUnitDeclaration into the Spoon AST */ diff --git a/src/main/java/spoon/support/compiler/jdt/JDTImportBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTImportBuilder.java index be809bffadb..4a012073d4a 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTImportBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTImportBuilder.java @@ -7,10 +7,15 @@ */ package spoon.support.compiler.jdt; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.ImportReference; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; - import spoon.reflect.cu.CompilationUnit; import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtMethod; @@ -20,13 +25,6 @@ import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtReference; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; - /** * Created by urli on 08/08/2017. */ diff --git a/src/main/java/spoon/support/compiler/jdt/JDTSnippetCompiler.java b/src/main/java/spoon/support/compiler/jdt/JDTSnippetCompiler.java index a9ac5d9d5d5..8056423764d 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTSnippetCompiler.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTSnippetCompiler.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.concurrent.atomic.AtomicLong; - import org.eclipse.jdt.core.compiler.CategorizedProblem; import spoon.SpoonException; import spoon.compiler.Environment; diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java index a042f1046ba..61df319e102 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java @@ -9,7 +9,6 @@ import java.lang.invoke.MethodHandles; import java.util.Set; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression; diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderHelper.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderHelper.java index a3406f5efdf..0ed2f7d5c76 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderHelper.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderHelper.java @@ -7,6 +7,13 @@ */ package spoon.support.compiler.jdt; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.StringJoiner; +import java.util.function.Consumer; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Argument; @@ -76,14 +83,6 @@ import spoon.reflect.reference.CtVariableReference; import spoon.support.reflect.CtExtendedModifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringJoiner; -import java.util.function.Consumer; - import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.getModifiers; import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.isLhsAssignment; diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderQuery.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderQuery.java index 83e4683a7f3..0a247234c73 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderQuery.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilderQuery.java @@ -7,6 +7,9 @@ */ package spoon.support.compiler.jdt; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.Assignment; @@ -29,10 +32,6 @@ import spoon.reflect.declaration.ModifierKind; import spoon.support.reflect.CtExtendedModifier; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - /** Helper class for JDTTreeBuilder. Package visible to reduce API surface. */ class JDTTreeBuilderQuery { private JDTTreeBuilderQuery() { } diff --git a/src/main/java/spoon/support/compiler/jdt/ModifierTarget.java b/src/main/java/spoon/support/compiler/jdt/ModifierTarget.java index 9bddd535051..3cadfd3e937 100644 --- a/src/main/java/spoon/support/compiler/jdt/ModifierTarget.java +++ b/src/main/java/spoon/support/compiler/jdt/ModifierTarget.java @@ -7,11 +7,10 @@ */ package spoon.support.compiler.jdt; -import spoon.reflect.declaration.ModifierKind; - import java.util.Collections; import java.util.EnumSet; import java.util.Set; +import spoon.reflect.declaration.ModifierKind; /** * Defines the elements that can have modifiers assigned to them. diff --git a/src/main/java/spoon/support/compiler/jdt/ParentExiter.java b/src/main/java/spoon/support/compiler/jdt/ParentExiter.java index 776075f4f78..05f2ff49c6d 100644 --- a/src/main/java/spoon/support/compiler/jdt/ParentExiter.java +++ b/src/main/java/spoon/support/compiler/jdt/ParentExiter.java @@ -7,6 +7,11 @@ */ package spoon.support.compiler.jdt; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; @@ -111,12 +116,6 @@ import spoon.reflect.visitor.CtInheritanceScanner; import spoon.reflect.visitor.CtScanner; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import static spoon.reflect.code.BinaryOperatorKind.INSTANCEOF; @SuppressWarnings("unchecked") diff --git a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java index e430f1962f1..f7bccddd74e 100644 --- a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java @@ -7,6 +7,12 @@ */ package spoon.support.compiler.jdt; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.ArrayUtils; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; @@ -48,13 +54,6 @@ import spoon.support.compiler.jdt.ContextBuilder.CastInfo; import spoon.support.reflect.CtExtendedModifier; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.getModifiers; /** diff --git a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java index 842f8c4115c..861afbf1c24 100644 --- a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java @@ -7,6 +7,18 @@ */ package spoon.support.compiler.jdt; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; @@ -89,20 +101,6 @@ import spoon.support.Level; import spoon.support.reflect.CtExtendedModifier; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.searchPackage; import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.searchType; import static spoon.support.compiler.jdt.JDTTreeBuilderQuery.searchTypeBinding; diff --git a/src/main/java/spoon/support/compiler/jdt/TreeBuilderCompiler.java b/src/main/java/spoon/support/compiler/jdt/TreeBuilderCompiler.java index 8c27439ed06..5a7da17112c 100644 --- a/src/main/java/spoon/support/compiler/jdt/TreeBuilderCompiler.java +++ b/src/main/java/spoon/support/compiler/jdt/TreeBuilderCompiler.java @@ -11,7 +11,6 @@ import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.Arrays; - import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.CompilationProgress; import org.eclipse.jdt.internal.compiler.CompilationResult; diff --git a/src/main/java/spoon/support/gui/SpoonModelTree.java b/src/main/java/spoon/support/gui/SpoonModelTree.java index c78eff90043..7a21828686f 100644 --- a/src/main/java/spoon/support/gui/SpoonModelTree.java +++ b/src/main/java/spoon/support/gui/SpoonModelTree.java @@ -21,7 +21,6 @@ import java.util.Queue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; - import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenuItem; @@ -34,7 +33,6 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; - import spoon.Launcher; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; diff --git a/src/main/java/spoon/support/gui/SpoonObjectFieldsTable.java b/src/main/java/spoon/support/gui/SpoonObjectFieldsTable.java index 5f80fd90289..3364b17737b 100644 --- a/src/main/java/spoon/support/gui/SpoonObjectFieldsTable.java +++ b/src/main/java/spoon/support/gui/SpoonObjectFieldsTable.java @@ -171,4 +171,3 @@ private void initialize() { } } - diff --git a/src/main/java/spoon/support/gui/SpoonTreeBuilder.java b/src/main/java/spoon/support/gui/SpoonTreeBuilder.java index d30df3fd19b..89961b1cce6 100644 --- a/src/main/java/spoon/support/gui/SpoonTreeBuilder.java +++ b/src/main/java/spoon/support/gui/SpoonTreeBuilder.java @@ -7,15 +7,14 @@ */ package spoon.support.gui; +import java.util.ArrayDeque; +import java.util.Deque; +import javax.swing.tree.DefaultMutableTreeNode; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.path.CtRole; import spoon.reflect.visitor.CtScanner; -import javax.swing.tree.DefaultMutableTreeNode; -import java.util.ArrayDeque; -import java.util.Deque; - public class SpoonTreeBuilder extends CtScanner { Deque nodes; diff --git a/src/main/java/spoon/support/modelobs/ActionBasedChangeListenerImpl.java b/src/main/java/spoon/support/modelobs/ActionBasedChangeListenerImpl.java index 587ee430e88..fd1f2ad87ba 100644 --- a/src/main/java/spoon/support/modelobs/ActionBasedChangeListenerImpl.java +++ b/src/main/java/spoon/support/modelobs/ActionBasedChangeListenerImpl.java @@ -7,6 +7,13 @@ */ package spoon.support.modelobs; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.path.CtRole; import spoon.support.modelobs.action.Action; import spoon.support.modelobs.action.AddAction; import spoon.support.modelobs.action.DeleteAction; @@ -16,14 +23,6 @@ import spoon.support.modelobs.context.MapContext; import spoon.support.modelobs.context.ObjectContext; import spoon.support.modelobs.context.SetContext; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.path.CtRole; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; /** * This listener will propagate the change to the listener diff --git a/src/main/java/spoon/support/modelobs/ChangeCollector.java b/src/main/java/spoon/support/modelobs/ChangeCollector.java index b33c46dcdb5..eab3d77bee1 100644 --- a/src/main/java/spoon/support/modelobs/ChangeCollector.java +++ b/src/main/java/spoon/support/modelobs/ChangeCollector.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.jspecify.annotations.Nullable; import spoon.compiler.Environment; import spoon.reflect.CtModel; diff --git a/src/main/java/spoon/support/modelobs/EmptyModelChangeListener.java b/src/main/java/spoon/support/modelobs/EmptyModelChangeListener.java index 6a81bb25d64..bb28f9fe0dc 100644 --- a/src/main/java/spoon/support/modelobs/EmptyModelChangeListener.java +++ b/src/main/java/spoon/support/modelobs/EmptyModelChangeListener.java @@ -7,14 +7,13 @@ */ package spoon.support.modelobs; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.path.CtRole; - import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.path.CtRole; /** * is the listener that creates the action on the model. This default listener does nothing. diff --git a/src/main/java/spoon/support/modelobs/action/DeleteAllAction.java b/src/main/java/spoon/support/modelobs/action/DeleteAllAction.java index f801af4f499..28ca8bcc685 100644 --- a/src/main/java/spoon/support/modelobs/action/DeleteAllAction.java +++ b/src/main/java/spoon/support/modelobs/action/DeleteAllAction.java @@ -7,10 +7,9 @@ */ package spoon.support.modelobs.action; -import spoon.support.modelobs.context.Context; - import java.util.Collection; import java.util.Map; +import spoon.support.modelobs.context.Context; /** * defines the delete all action. diff --git a/src/main/java/spoon/support/modelobs/context/CollectionContext.java b/src/main/java/spoon/support/modelobs/context/CollectionContext.java index a62ce8f52e3..a91bbdb1a0d 100644 --- a/src/main/java/spoon/support/modelobs/context/CollectionContext.java +++ b/src/main/java/spoon/support/modelobs/context/CollectionContext.java @@ -7,11 +7,10 @@ */ package spoon.support.modelobs.context; +import java.util.Collection; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; -import java.util.Collection; - public abstract class CollectionContext> extends Context { protected final T copyOfTheCollection; diff --git a/src/main/java/spoon/support/modelobs/context/ListContext.java b/src/main/java/spoon/support/modelobs/context/ListContext.java index ec34ff330ff..6f5e6740fef 100644 --- a/src/main/java/spoon/support/modelobs/context/ListContext.java +++ b/src/main/java/spoon/support/modelobs/context/ListContext.java @@ -7,11 +7,10 @@ */ package spoon.support.modelobs.context; +import java.util.List; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; -import java.util.List; - /** * defines a list context */ diff --git a/src/main/java/spoon/support/modelobs/context/MapContext.java b/src/main/java/spoon/support/modelobs/context/MapContext.java index 20b231d7a18..8ec269090ee 100644 --- a/src/main/java/spoon/support/modelobs/context/MapContext.java +++ b/src/main/java/spoon/support/modelobs/context/MapContext.java @@ -7,11 +7,10 @@ */ package spoon.support.modelobs.context; +import java.util.Map; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; -import java.util.Map; - /** * defines the map context * @param diff --git a/src/main/java/spoon/support/modelobs/context/SetContext.java b/src/main/java/spoon/support/modelobs/context/SetContext.java index 65404f1a8f5..a31905aec24 100644 --- a/src/main/java/spoon/support/modelobs/context/SetContext.java +++ b/src/main/java/spoon/support/modelobs/context/SetContext.java @@ -7,11 +7,10 @@ */ package spoon.support.modelobs.context; +import java.util.Set; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; -import java.util.Set; - public class SetContext extends CollectionContext> { public SetContext(CtElement element, CtRole role, Set original) { diff --git a/src/main/java/spoon/support/reflect/CtExtendedModifier.java b/src/main/java/spoon/support/reflect/CtExtendedModifier.java index 20df26763a1..ead3b8f9b64 100644 --- a/src/main/java/spoon/support/reflect/CtExtendedModifier.java +++ b/src/main/java/spoon/support/reflect/CtExtendedModifier.java @@ -7,14 +7,13 @@ */ package spoon.support.reflect; +import java.io.Serializable; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.SourcePositionHolder; import spoon.reflect.declaration.ModifierKind; import spoon.support.sniper.internal.ElementSourceFragment; -import java.io.Serializable; - /** Represents a modifier (eg "public"). * When a modifier is "implicit", it does not appear in the source code (eg public for interface methods) * ModifierKind in kept for sake of full backward-compatibility. diff --git a/src/main/java/spoon/support/reflect/CtModifierHandler.java b/src/main/java/spoon/support/reflect/CtModifierHandler.java index 66bf2623d8c..d272e39658f 100644 --- a/src/main/java/spoon/support/reflect/CtModifierHandler.java +++ b/src/main/java/spoon/support/reflect/CtModifierHandler.java @@ -7,17 +7,16 @@ */ package spoon.support.reflect; -import spoon.SpoonException; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.factory.Factory; -import spoon.support.reflect.declaration.CtElementImpl; - import java.io.Serializable; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; +import spoon.SpoonException; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.support.reflect.declaration.CtElementImpl; import static spoon.reflect.path.CtRole.MODIFIER; diff --git a/src/main/java/spoon/support/reflect/code/CtAssignmentImpl.java b/src/main/java/spoon/support/reflect/code/CtAssignmentImpl.java index a10d8c307d6..bc8a6d31117 100644 --- a/src/main/java/spoon/support/reflect/code/CtAssignmentImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtAssignmentImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtAssignment; import spoon.reflect.code.CtExpression; @@ -16,9 +18,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.CASTS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.ASSIGNED; import static spoon.reflect.path.CtRole.ASSIGNMENT; diff --git a/src/main/java/spoon/support/reflect/code/CtBlockImpl.java b/src/main/java/spoon/support/reflect/code/CtBlockImpl.java index cdf0fa79111..8fa0838aa90 100644 --- a/src/main/java/spoon/support/reflect/code/CtBlockImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtBlockImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import spoon.reflect.ModelElementContainerDefaultCapacities; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBlock; @@ -23,10 +26,6 @@ import spoon.reflect.visitor.Query; import spoon.support.util.ModelList; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - public class CtBlockImpl extends CtStatementImpl implements CtBlock { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/code/CtBreakImpl.java b/src/main/java/spoon/support/reflect/code/CtBreakImpl.java index 27733ef43a1..0dc0bc3c29a 100644 --- a/src/main/java/spoon/support/reflect/code/CtBreakImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtBreakImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.code; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBreak; import spoon.reflect.code.CtLabelledFlowBreak; @@ -15,8 +16,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.reflect.visitor.filter.ParentFunction; -import java.util.List; - import static spoon.reflect.path.CtRole.TARGET_LABEL; public class CtBreakImpl extends CtStatementImpl implements CtBreak { diff --git a/src/main/java/spoon/support/reflect/code/CtCaseImpl.java b/src/main/java/spoon/support/reflect/code/CtCaseImpl.java index b4ee6c19cd6..13d4c097d0e 100644 --- a/src/main/java/spoon/support/reflect/code/CtCaseImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtCaseImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; import spoon.reflect.ModelElementContainerDefaultCapacities; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CaseKind; @@ -20,11 +24,6 @@ import spoon.reflect.visitor.Query; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - public class CtCaseImpl extends CtStatementImpl implements CtCase { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/code/CtCasePatternImpl.java b/src/main/java/spoon/support/reflect/code/CtCasePatternImpl.java index 7b1b798478c..fddaa946d95 100644 --- a/src/main/java/spoon/support/reflect/code/CtCasePatternImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtCasePatternImpl.java @@ -7,14 +7,13 @@ */ package spoon.support.reflect.code; +import java.io.Serial; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtCasePattern; import spoon.reflect.code.CtPattern; import spoon.reflect.path.CtRole; import spoon.reflect.visitor.CtVisitor; -import java.io.Serial; - public class CtCasePatternImpl extends CtExpressionImpl implements CtCasePattern { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java b/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java index 7003a8d779f..c88ef268741 100644 --- a/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; import spoon.reflect.ModelElementContainerDefaultCapacities; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtCatchVariable; @@ -28,11 +32,6 @@ import spoon.support.reflect.CtModifierHandler; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - public class CtCatchVariableImpl extends CtCodeElementImpl implements CtCatchVariable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/code/CtCommentImpl.java b/src/main/java/spoon/support/reflect/code/CtCommentImpl.java index 095a0815ad6..67a73e7e6b9 100644 --- a/src/main/java/spoon/support/reflect/code/CtCommentImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtCommentImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.code; +import java.util.Objects; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtComment; import spoon.reflect.code.CtJavaDoc; @@ -15,8 +16,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.visitor.CtVisitor; -import java.util.Objects; - import static spoon.support.compiler.jdt.JDTCommentBuilder.cleanComment; public class CtCommentImpl extends CtStatementImpl implements CtComment { diff --git a/src/main/java/spoon/support/reflect/code/CtConstructorCallImpl.java b/src/main/java/spoon/support/reflect/code/CtConstructorCallImpl.java index 78840b9946b..e6c656fc00d 100644 --- a/src/main/java/spoon/support/reflect/code/CtConstructorCallImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtConstructorCallImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtAbstractInvocation; import spoon.reflect.code.CtConstructorCall; @@ -21,9 +23,6 @@ import spoon.support.DerivedProperty; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.PARAMETERS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.ARGUMENT; import static spoon.reflect.path.CtRole.EXECUTABLE_REF; diff --git a/src/main/java/spoon/support/reflect/code/CtContinueImpl.java b/src/main/java/spoon/support/reflect/code/CtContinueImpl.java index 55edd2746c5..08f419a5bd2 100644 --- a/src/main/java/spoon/support/reflect/code/CtContinueImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtContinueImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.code; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtContinue; import spoon.reflect.code.CtLabelledFlowBreak; @@ -15,8 +16,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.reflect.visitor.filter.ParentFunction; -import java.util.List; - import static spoon.reflect.path.CtRole.TARGET_LABEL; public class CtContinueImpl extends CtStatementImpl implements CtContinue { diff --git a/src/main/java/spoon/support/reflect/code/CtExpressionImpl.java b/src/main/java/spoon/support/reflect/code/CtExpressionImpl.java index 6b0374b6228..e25c52c1171 100644 --- a/src/main/java/spoon/support/reflect/code/CtExpressionImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtExpressionImpl.java @@ -7,15 +7,14 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtTypedElement; import spoon.reflect.reference.CtTypeReference; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.CASTS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.CAST; import static spoon.reflect.path.CtRole.TYPE; diff --git a/src/main/java/spoon/support/reflect/code/CtForImpl.java b/src/main/java/spoon/support/reflect/code/CtForImpl.java index 6ec6e7c17fb..26d231af497 100644 --- a/src/main/java/spoon/support/reflect/code/CtForImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtForImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFor; @@ -14,9 +16,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.FOR_INIT_STATEMENTS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.ModelElementContainerDefaultCapacities.FOR_UPDATE_STATEMENTS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/support/reflect/code/CtInvocationImpl.java b/src/main/java/spoon/support/reflect/code/CtInvocationImpl.java index c7eaa354ce0..9b7e7aee73e 100644 --- a/src/main/java/spoon/support/reflect/code/CtInvocationImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtInvocationImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtAbstractInvocation; import spoon.reflect.code.CtExpression; @@ -21,9 +23,6 @@ import spoon.support.DerivedProperty; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.PARAMETERS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.ARGUMENT; import static spoon.reflect.path.CtRole.EXECUTABLE_REF; diff --git a/src/main/java/spoon/support/reflect/code/CtJavaDocImpl.java b/src/main/java/spoon/support/reflect/code/CtJavaDocImpl.java index e998f875a97..1ebcb8b6bcc 100644 --- a/src/main/java/spoon/support/reflect/code/CtJavaDocImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtJavaDocImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.code; +import java.util.List; import spoon.javadoc.internal.Javadoc; import spoon.javadoc.internal.JavadocBlockTag; import spoon.javadoc.internal.JavadocDescriptionElement; @@ -19,8 +20,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.util.ModelList; -import java.util.List; - import static spoon.support.compiler.jdt.JDTCommentBuilder.cleanComment; public class CtJavaDocImpl extends CtCommentImpl implements CtJavaDoc { diff --git a/src/main/java/spoon/support/reflect/code/CtJavaDocTagImpl.java b/src/main/java/spoon/support/reflect/code/CtJavaDocTagImpl.java index c8878af44ec..5270296c950 100644 --- a/src/main/java/spoon/support/reflect/code/CtJavaDocTagImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtJavaDocTagImpl.java @@ -13,8 +13,8 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE; import static spoon.reflect.path.CtRole.COMMENT_CONTENT; +import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE; import static spoon.reflect.path.CtRole.DOCUMENTATION_TYPE_REALNAME; import static spoon.reflect.path.CtRole.JAVADOC_TAG_VALUE; diff --git a/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java b/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java index da71b252a58..13e58ce0d76 100644 --- a/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.LovecraftException; import spoon.SpoonException; @@ -19,12 +22,12 @@ import spoon.reflect.code.CtLocalVariable; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtParameter; import spoon.reflect.declaration.CtReceiverParameter; import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtTypedElement; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.reference.CtExecutableReference; @@ -36,10 +39,6 @@ import spoon.support.util.QualifiedNameBasedSortedSet; import spoon.support.visitor.SignaturePrinter; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - import static spoon.reflect.ModelElementContainerDefaultCapacities.PARAMETERS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.BODY; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java b/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java index 177bd2e109a..7f5e6cb4c37 100644 --- a/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.code; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; @@ -28,8 +29,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.CtModifierHandler; -import java.util.Set; - public class CtLocalVariableImpl extends CtStatementImpl implements CtLocalVariable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/code/CtNewArrayImpl.java b/src/main/java/spoon/support/reflect/code/CtNewArrayImpl.java index 5e0fb435519..c3caa37b880 100644 --- a/src/main/java/spoon/support/reflect/code/CtNewArrayImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtNewArrayImpl.java @@ -7,15 +7,14 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtNewArray; import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.NEW_ARRAY_DEFAULT_EXPRESSIONS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.DIMENSION; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/support/reflect/code/CtRecordPatternImpl.java b/src/main/java/spoon/support/reflect/code/CtRecordPatternImpl.java index fcba8a759c1..cd6995067dc 100644 --- a/src/main/java/spoon/support/reflect/code/CtRecordPatternImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtRecordPatternImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtPattern; import spoon.reflect.code.CtRecordPattern; @@ -15,9 +17,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.path.CtRole.PATTERN; public class CtRecordPatternImpl extends CtExpressionImpl implements CtRecordPattern { diff --git a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java index 9d33b25c95c..7cf3cda2d5a 100644 --- a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBlock; @@ -24,9 +26,6 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.visitor.CtInheritanceScanner; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.path.CtRole.LABEL; public abstract class CtStatementImpl extends CtCodeElementImpl implements CtStatement { diff --git a/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java index 13cfc812c72..85bca509688 100644 --- a/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtStatementList; @@ -18,11 +22,6 @@ import spoon.reflect.visitor.Query; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - import static spoon.reflect.ModelElementContainerDefaultCapacities.BLOCK_STATEMENTS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.STATEMENT; diff --git a/src/main/java/spoon/support/reflect/code/CtSwitchExpressionImpl.java b/src/main/java/spoon/support/reflect/code/CtSwitchExpressionImpl.java index 9875d95ba94..64eaa050baf 100644 --- a/src/main/java/spoon/support/reflect/code/CtSwitchExpressionImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtSwitchExpressionImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtAbstractSwitch; import spoon.reflect.code.CtCase; @@ -15,9 +17,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.SWITCH_CASES_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.CASE; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/support/reflect/code/CtSwitchImpl.java b/src/main/java/spoon/support/reflect/code/CtSwitchImpl.java index 3729293803f..4a7407e9847 100644 --- a/src/main/java/spoon/support/reflect/code/CtSwitchImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtSwitchImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtAbstractSwitch; import spoon.reflect.code.CtCase; @@ -15,9 +17,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.SWITCH_CASES_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.CASE; import static spoon.reflect.path.CtRole.EXPRESSION; diff --git a/src/main/java/spoon/support/reflect/code/CtTryImpl.java b/src/main/java/spoon/support/reflect/code/CtTryImpl.java index df47a9a0a88..448e3933de7 100644 --- a/src/main/java/spoon/support/reflect/code/CtTryImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtTryImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtBodyHolder; @@ -18,9 +20,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.CATCH_CASES_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.BODY; import static spoon.reflect.path.CtRole.CATCH; diff --git a/src/main/java/spoon/support/reflect/code/CtTryWithResourceImpl.java b/src/main/java/spoon/support/reflect/code/CtTryWithResourceImpl.java index 2a358270055..f1a3b15d168 100644 --- a/src/main/java/spoon/support/reflect/code/CtTryWithResourceImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtTryWithResourceImpl.java @@ -7,16 +7,15 @@ */ package spoon.support.reflect.code; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtResource; import spoon.reflect.code.CtTryWithResource; import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import static spoon.reflect.ModelElementContainerDefaultCapacities.RESOURCES_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.TRY_RESOURCE; diff --git a/src/main/java/spoon/support/reflect/cu/position/PartialSourcePositionImpl.java b/src/main/java/spoon/support/reflect/cu/position/PartialSourcePositionImpl.java index 41018af0a92..fd785c44db9 100644 --- a/src/main/java/spoon/support/reflect/cu/position/PartialSourcePositionImpl.java +++ b/src/main/java/spoon/support/reflect/cu/position/PartialSourcePositionImpl.java @@ -7,11 +7,10 @@ */ package spoon.support.reflect.cu.position; +import java.io.File; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.position.NoSourcePosition; -import java.io.File; - /** * This class intends to create a source position containing only a compilation unit. */ diff --git a/src/main/java/spoon/support/reflect/cu/position/SourcePositionImpl.java b/src/main/java/spoon/support/reflect/cu/position/SourcePositionImpl.java index d6e41b66fe6..2f6c3b884e2 100644 --- a/src/main/java/spoon/support/reflect/cu/position/SourcePositionImpl.java +++ b/src/main/java/spoon/support/reflect/cu/position/SourcePositionImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.cu.position; +import java.io.File; +import java.util.Arrays; import spoon.SpoonException; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; @@ -14,9 +16,6 @@ import spoon.reflect.cu.position.DeclarationSourcePosition; import spoon.reflect.cu.position.NoSourcePosition; -import java.io.File; -import java.util.Arrays; - /** * This immutable class represents the position of a Java program element in a source * file. diff --git a/src/main/java/spoon/support/reflect/declaration/CtAnnotationImpl.java b/src/main/java/spoon/support/reflect/declaration/CtAnnotationImpl.java index 5ee3e8e199e..c823bee5de8 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtAnnotationImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtAnnotationImpl.java @@ -7,6 +7,21 @@ */ package spoon.support.reflect.declaration; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; @@ -34,22 +49,6 @@ import spoon.support.reflect.code.CtExpressionImpl; import spoon.support.reflect.eval.EvalHelper; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - /** * The implementation for {@link spoon.reflect.declaration.CtAnnotation}. * diff --git a/src/main/java/spoon/support/reflect/declaration/CtAnnotationMethodImpl.java b/src/main/java/spoon/support/reflect/declaration/CtAnnotationMethodImpl.java index f518353228c..6be6d96cdd1 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtAnnotationMethodImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtAnnotationMethodImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.declaration; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtBodyHolder; @@ -24,9 +26,6 @@ import static spoon.reflect.path.CtRole.DEFAULT_EXPRESSION; -import java.util.List; -import java.util.Set; - /** * The implementation for {@link spoon.reflect.declaration.CtAnnotationMethod}. */ @@ -107,5 +106,3 @@ public CtAnnotationMethod clone() { return (CtAnnotationMethod) super.clone(); } } - - diff --git a/src/main/java/spoon/support/reflect/declaration/CtAnnotationTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtAnnotationTypeImpl.java index 8044d9152cb..00e9c8df75e 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtAnnotationTypeImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtAnnotationTypeImpl.java @@ -7,6 +7,11 @@ */ package spoon.support.reflect.declaration; +import java.lang.annotation.Annotation; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import spoon.reflect.declaration.CtAnnotationMethod; import spoon.reflect.declaration.CtAnnotationType; import spoon.reflect.declaration.CtFormalTypeDeclarer; @@ -18,12 +23,6 @@ import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.lang.annotation.Annotation; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - /** * The implementation for {@link spoon.reflect.declaration.CtAnnotationType}. * diff --git a/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java b/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java index 05210578f1f..f1501ddaacf 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.declaration; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtExecutable; @@ -23,9 +25,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.CtModifierHandler; -import java.util.List; -import java.util.Set; - public class CtAnonymousExecutableImpl extends CtExecutableImpl implements CtAnonymousExecutable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java b/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java index 94d19c342a5..3391293086c 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java @@ -7,6 +7,16 @@ */ package spoon.support.reflect.declaration; +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import spoon.SpoonException; import spoon.SpoonModelBuilder.InputType; import spoon.reflect.annotations.MetamodelPropertyField; @@ -29,17 +39,6 @@ import spoon.support.reflect.eval.VisitorPartialEvaluator; import spoon.support.util.SignatureBasedSortedSet; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - import static spoon.reflect.path.CtRole.ANNONYMOUS_EXECUTABLE; import static spoon.reflect.path.CtRole.CONSTRUCTOR; import static spoon.reflect.path.CtRole.SUPER_TYPE; diff --git a/src/main/java/spoon/support/reflect/declaration/CtCompilationUnitImpl.java b/src/main/java/spoon/support/reflect/declaration/CtCompilationUnitImpl.java index cfeb00f813b..c1d6395e166 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtCompilationUnitImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtCompilationUnitImpl.java @@ -16,8 +16,8 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - import spoon.SpoonException; +import spoon.reflect.ModelElementContainerDefaultCapacities; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; @@ -41,7 +41,6 @@ import spoon.support.reflect.cu.position.PartialSourcePositionImpl; import spoon.support.sniper.internal.ElementSourceFragment; import spoon.support.util.ModelList; -import spoon.reflect.ModelElementContainerDefaultCapacities; /** * Implements a compilation unit. In Java, a compilation unit can contain only one diff --git a/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java b/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java index 08e04b1345d..e121100c45e 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtFormalTypeDeclarer; @@ -26,10 +29,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.CtModifierHandler; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - import static spoon.reflect.ModelElementContainerDefaultCapacities.TYPE_TYPE_PARAMETERS_CONTAINER_DEFAULT_CAPACITY; public class CtConstructorImpl extends CtExecutableImpl implements CtConstructor { diff --git a/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java b/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java index 46e84375453..fa3721a95de 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java @@ -7,6 +7,16 @@ */ package spoon.support.reflect.declaration; +import java.lang.annotation.Annotation; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spoon.reflect.ModelElementContainerDefaultCapacities; @@ -53,16 +63,6 @@ import spoon.support.visitor.equals.CloneHelper; import spoon.support.visitor.equals.EqualsVisitor; import spoon.support.visitor.replace.ReplacementVisitor; -import java.lang.annotation.Annotation; -import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; import static spoon.reflect.visitor.CommentHelper.printComment; diff --git a/src/main/java/spoon/support/reflect/declaration/CtEnumImpl.java b/src/main/java/spoon/support/reflect/declaration/CtEnumImpl.java index 622e2b1ab61..17a40e820c3 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtEnumImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtEnumImpl.java @@ -7,6 +7,12 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtNewClass; import spoon.reflect.declaration.CtEnum; @@ -23,13 +29,6 @@ import spoon.support.UnsettableProperty; import spoon.support.util.SignatureBasedSortedSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - import static spoon.reflect.path.CtRole.VALUE; public class CtEnumImpl> extends CtClassImpl implements CtEnum { diff --git a/src/main/java/spoon/support/reflect/declaration/CtExecutableImpl.java b/src/main/java/spoon/support/reflect/declaration/CtExecutableImpl.java index 570a0e1a430..ceb350f7ff7 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtExecutableImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtExecutableImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtBlock; @@ -22,11 +26,6 @@ import spoon.support.util.QualifiedNameBasedSortedSet; import spoon.support.visitor.SignaturePrinter; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import static spoon.reflect.ModelElementContainerDefaultCapacities.PARAMETERS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.BODY; import static spoon.reflect.path.CtRole.PARAMETER; diff --git a/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java b/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java index e3a311521cd..fadfb1d2b50 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.declaration; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtRHSReceiver; @@ -26,8 +27,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.CtModifierHandler; -import java.util.Set; - /** * The implementation for {@link spoon.reflect.declaration.CtField}. * diff --git a/src/main/java/spoon/support/reflect/declaration/CtImportImpl.java b/src/main/java/spoon/support/reflect/declaration/CtImportImpl.java index 176e42cb439..6e8384aef3e 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtImportImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtImportImpl.java @@ -10,15 +10,15 @@ import spoon.SpoonException; import spoon.experimental.CtUnresolvedImport; import spoon.reflect.annotations.MetamodelPropertyField; +import spoon.reflect.declaration.CtImport; +import spoon.reflect.declaration.CtImportKind; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtReference; -import spoon.reflect.declaration.CtImportKind; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtTypeMemberWildcardImportReference; +import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtImportVisitor; import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.reference.CtTypeMemberWildcardImportReferenceImpl; diff --git a/src/main/java/spoon/support/reflect/declaration/CtInterfaceImpl.java b/src/main/java/spoon/support/reflect/declaration/CtInterfaceImpl.java index de136696c7f..13ff4b8c553 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtInterfaceImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtInterfaceImpl.java @@ -7,6 +7,14 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtCodeElement; import spoon.reflect.code.CtStatement; @@ -24,15 +32,6 @@ import spoon.support.reflect.code.CtStatementImpl; import spoon.support.reflect.eval.VisitorPartialEvaluator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - public class CtInterfaceImpl extends CtTypeImpl implements CtInterface { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java b/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java index 13f99a84af3..4e4a4bddb95 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java @@ -7,6 +7,11 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import spoon.refactoring.Refactoring; import spoon.reflect.ModelElementContainerDefaultCapacities; import spoon.reflect.annotations.MetamodelPropertyField; @@ -25,12 +30,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.CtModifierHandler; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - /** * The implementation for {@link spoon.reflect.declaration.CtMethod}. * diff --git a/src/main/java/spoon/support/reflect/declaration/CtModuleImpl.java b/src/main/java/spoon/support/reflect/declaration/CtModuleImpl.java index 763664065f0..7fee0522e9d 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtModuleImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtModuleImpl.java @@ -7,14 +7,17 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtModuleDirective; +import spoon.reflect.declaration.CtModuleRequirement; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtPackageExport; import spoon.reflect.declaration.CtProvidedService; -import spoon.reflect.declaration.CtModuleRequirement; import spoon.reflect.declaration.CtUsedService; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtModuleReference; @@ -23,10 +26,6 @@ import spoon.support.comparator.CtLineElementComparator; import spoon.support.util.SortedList; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class CtModuleImpl extends CtNamedElementImpl implements CtModule { @MetamodelPropertyField(role = CtRole.MODIFIER) private boolean openModule; diff --git a/src/main/java/spoon/support/reflect/declaration/CtModuleRequirementImpl.java b/src/main/java/spoon/support/reflect/declaration/CtModuleRequirementImpl.java index 9689fabfdff..bca41831c04 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtModuleRequirementImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtModuleRequirementImpl.java @@ -7,15 +7,14 @@ */ package spoon.support.reflect.declaration; +import java.util.HashSet; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtModuleRequirement; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtModuleReference; import spoon.reflect.visitor.CtVisitor; -import java.util.HashSet; -import java.util.Set; - public class CtModuleRequirementImpl extends CtElementImpl implements CtModuleRequirement { @MetamodelPropertyField(role = CtRole.MODIFIER) private Set requiresModifiers = CtElementImpl.emptySet(); diff --git a/src/main/java/spoon/support/reflect/declaration/CtPackageDeclarationImpl.java b/src/main/java/spoon/support/reflect/declaration/CtPackageDeclarationImpl.java index e755e6f004b..d1f31f012fb 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtPackageDeclarationImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtPackageDeclarationImpl.java @@ -8,9 +8,9 @@ package spoon.support.reflect.declaration; import spoon.reflect.annotations.MetamodelPropertyField; +import spoon.reflect.declaration.CtPackageDeclaration; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtPackageReference; -import spoon.reflect.declaration.CtPackageDeclaration; import spoon.reflect.visitor.CtVisitor; public class CtPackageDeclarationImpl extends CtElementImpl implements CtPackageDeclaration { diff --git a/src/main/java/spoon/support/reflect/declaration/CtPackageExportImpl.java b/src/main/java/spoon/support/reflect/declaration/CtPackageExportImpl.java index d286bd4cce4..70b94bb7c26 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtPackageExportImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtPackageExportImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtPackageExport; import spoon.reflect.path.CtRole; @@ -14,10 +17,6 @@ import spoon.reflect.reference.CtPackageReference; import spoon.reflect.visitor.CtVisitor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class CtPackageExportImpl extends CtElementImpl implements CtPackageExport { @MetamodelPropertyField(role = CtRole.PACKAGE_REF) private CtPackageReference packageReference; diff --git a/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java b/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java index 62d0a04eef9..97f7d9fb250 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.declaration; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtExecutable; @@ -26,8 +27,6 @@ import spoon.support.reflect.CtModifierHandler; import spoon.support.reflect.code.CtLocalVariableImpl; -import java.util.Set; - /** * The implementation for {@link spoon.reflect.declaration.CtParameter}. * diff --git a/src/main/java/spoon/support/reflect/declaration/CtProvidedServiceImpl.java b/src/main/java/spoon/support/reflect/declaration/CtProvidedServiceImpl.java index c0425118dd8..2bd18303143 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtProvidedServiceImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtProvidedServiceImpl.java @@ -7,16 +7,15 @@ */ package spoon.support.reflect.declaration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtProvidedService; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtVisitor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class CtProvidedServiceImpl extends CtElementImpl implements CtProvidedService { @MetamodelPropertyField(role = CtRole.SERVICE_TYPE) private CtTypeReference serviceType; diff --git a/src/main/java/spoon/support/reflect/declaration/CtRecordComponentImpl.java b/src/main/java/spoon/support/reflect/declaration/CtRecordComponentImpl.java index 7a478c2d073..56086098b01 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtRecordComponentImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtRecordComponentImpl.java @@ -10,7 +10,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; - import org.jspecify.annotations.Nullable; import spoon.JLSViolation; import spoon.reflect.annotations.MetamodelPropertyField; diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java index 43eabf5a0db..41b1efa2ccf 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java @@ -7,6 +7,16 @@ */ package spoon.support.reflect.declaration; +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; import spoon.SpoonException; import spoon.refactoring.Refactoring; import spoon.reflect.ModelElementContainerDefaultCapacities; @@ -47,8 +57,8 @@ import spoon.reflect.visitor.filter.NamedElementFilter; import spoon.reflect.visitor.filter.ReferenceTypeFilter; import spoon.support.DerivedProperty; -import spoon.support.adaption.TypeAdaptor; import spoon.support.UnsettableProperty; +import spoon.support.adaption.TypeAdaptor; import spoon.support.comparator.CtLineElementComparator; import spoon.support.compiler.SnippetCompilationHelper; import spoon.support.reflect.CtExtendedModifier; @@ -56,17 +66,6 @@ import spoon.support.util.QualifiedNameBasedSortedSet; import spoon.support.util.SignatureBasedSortedSet; -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; - /** * The implementation for {@link spoon.reflect.declaration.CtType}. */ diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java index 61558bc3639..7ef5e8c9d99 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.declaration; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtConstructor; @@ -25,13 +29,8 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtVisitor; import spoon.support.DerivedProperty; -import spoon.support.adaption.TypeAdaptor; import spoon.support.UnsettableProperty; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import spoon.support.adaption.TypeAdaptor; import static spoon.reflect.path.CtRole.SUPER_TYPE; diff --git a/src/main/java/spoon/support/reflect/eval/EvalHelper.java b/src/main/java/spoon/support/reflect/eval/EvalHelper.java index ce42411c456..fe38f90dcbb 100644 --- a/src/main/java/spoon/support/reflect/eval/EvalHelper.java +++ b/src/main/java/spoon/support/reflect/eval/EvalHelper.java @@ -7,6 +7,8 @@ */ package spoon.support.reflect.eval; +import java.lang.reflect.Array; +import java.util.List; import spoon.SpoonException; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFieldRead; @@ -17,9 +19,6 @@ import spoon.reflect.declaration.CtField; import spoon.reflect.reference.CtFieldReference; -import java.lang.reflect.Array; -import java.util.List; - public class EvalHelper { // this class contains only static methods @@ -102,5 +101,3 @@ public static boolean isKnownAtCompileTime(CtExpression exp) { } - - diff --git a/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java b/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java index 1f735355c8a..355cbece8d0 100644 --- a/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java +++ b/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.eval; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.SpoonException; import spoon.reflect.code.CtAnnotationFieldAccess; import spoon.reflect.code.CtAssignment; @@ -49,10 +52,6 @@ import spoon.reflect.visitor.OperatorHelper; import spoon.support.util.RtHelper; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * * Simplifies an AST by performing all operations that are statically known and changes the AST accordingly (eg "0+1" -> "1") diff --git a/src/main/java/spoon/support/reflect/reference/CtArrayTypeReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtArrayTypeReferenceImpl.java index 142a70c90eb..73c288892a0 100644 --- a/src/main/java/spoon/support/reflect/reference/CtArrayTypeReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtArrayTypeReferenceImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.Array; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtReference; @@ -14,8 +15,6 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.SpoonClassNotFoundException; -import java.lang.reflect.Array; - import static spoon.reflect.path.CtRole.TYPE; public class CtArrayTypeReferenceImpl extends CtTypeReferenceImpl implements CtArrayTypeReference { diff --git a/src/main/java/spoon/support/reflect/reference/CtExecutableReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtExecutableReferenceImpl.java index adf76a41bad..e2e7cf57beb 100644 --- a/src/main/java/spoon/support/reflect/reference/CtExecutableReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtExecutableReferenceImpl.java @@ -7,6 +7,14 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; import spoon.Launcher; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; @@ -31,19 +39,10 @@ import spoon.support.util.RtHelper; import spoon.support.visitor.SignaturePrinter; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - import static spoon.reflect.ModelElementContainerDefaultCapacities.METHOD_TYPE_PARAMETERS_CONTAINER_DEFAULT_CAPACITY; +import static spoon.reflect.path.CtRole.ARGUMENT_TYPE; import static spoon.reflect.path.CtRole.DECLARING_TYPE; import static spoon.reflect.path.CtRole.IS_STATIC; -import static spoon.reflect.path.CtRole.ARGUMENT_TYPE; import static spoon.reflect.path.CtRole.TYPE; import static spoon.reflect.path.CtRole.TYPE_ARGUMENT; diff --git a/src/main/java/spoon/support/reflect/reference/CtFieldReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtFieldReferenceImpl.java index e2f902d2f2b..9e12ca59dde 100644 --- a/src/main/java/spoon/support/reflect/reference/CtFieldReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtFieldReferenceImpl.java @@ -7,6 +7,10 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Member; +import java.util.Collections; +import java.util.Set; import spoon.Launcher; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; @@ -23,11 +27,6 @@ import spoon.support.SpoonClassNotFoundException; import spoon.support.util.RtHelper; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Member; -import java.util.Collections; -import java.util.Set; - import static spoon.reflect.path.CtRole.DECLARING_TYPE; import static spoon.reflect.path.CtRole.IS_FINAL; import static spoon.reflect.path.CtRole.IS_STATIC; diff --git a/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java index af7bfee750a..eb755ba39c7 100644 --- a/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java @@ -7,16 +7,15 @@ */ package spoon.support.reflect.reference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.reference.CtIntersectionTypeReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtVisitor; import spoon.support.reflect.declaration.CtElementImpl; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import static spoon.reflect.path.CtRole.BOUND; diff --git a/src/main/java/spoon/support/reflect/reference/CtModuleReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtModuleReferenceImpl.java index 077d05ba300..1d51987bfb6 100644 --- a/src/main/java/spoon/support/reflect/reference/CtModuleReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtModuleReferenceImpl.java @@ -7,12 +7,11 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; import spoon.reflect.declaration.CtModule; import spoon.reflect.reference.CtModuleReference; import spoon.reflect.visitor.CtVisitor; -import java.lang.reflect.AnnotatedElement; - public class CtModuleReferenceImpl extends CtReferenceImpl implements CtModuleReference { public CtModuleReferenceImpl() { diff --git a/src/main/java/spoon/support/reflect/reference/CtPackageReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtPackageReferenceImpl.java index c3e38b4b288..e662ffe9285 100644 --- a/src/main/java/spoon/support/reflect/reference/CtPackageReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtPackageReferenceImpl.java @@ -7,12 +7,11 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; import spoon.reflect.declaration.CtPackage; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.visitor.CtVisitor; -import java.lang.reflect.AnnotatedElement; - public class CtPackageReferenceImpl extends CtReferenceImpl implements CtPackageReference { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/reference/CtParameterReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtParameterReferenceImpl.java index c8326d23d97..eb4b3b8c290 100644 --- a/src/main/java/spoon/support/reflect/reference/CtParameterReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtParameterReferenceImpl.java @@ -7,6 +7,7 @@ */ package spoon.support.reflect.reference; +import java.util.List; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtParameter; @@ -14,8 +15,6 @@ import spoon.reflect.reference.CtParameterReference; import spoon.reflect.visitor.CtVisitor; -import java.util.List; - public class CtParameterReferenceImpl extends CtVariableReferenceImpl implements CtParameterReference { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/reference/CtReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtReferenceImpl.java index 83a51ec1b6d..00bfcc0a047 100644 --- a/src/main/java/spoon/support/reflect/reference/CtReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtReferenceImpl.java @@ -7,6 +7,14 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; import spoon.JLSViolation; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.code.CtComment; @@ -17,14 +25,6 @@ import spoon.support.UnsettableProperty; import spoon.support.reflect.declaration.CtElementImpl; -import java.lang.reflect.AnnotatedElement; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; import static spoon.reflect.path.CtRole.NAME; public abstract class CtReferenceImpl extends CtElementImpl implements CtReference { diff --git a/src/main/java/spoon/support/reflect/reference/CtTypeMemberWildcardImportReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtTypeMemberWildcardImportReferenceImpl.java index b2343960781..a71d2d4b3a5 100644 --- a/src/main/java/spoon/support/reflect/reference/CtTypeMemberWildcardImportReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtTypeMemberWildcardImportReferenceImpl.java @@ -7,26 +7,25 @@ */ package spoon.support.reflect.reference; -import static spoon.reflect.path.CtRole.PACKAGE_REF; - import java.lang.annotation.Annotation; import java.util.Collections; import java.util.List; - import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtType; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtReference; -import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtTypeMemberWildcardImportReference; +import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtVisitor; import spoon.support.DerivedProperty; import spoon.support.Experimental; import spoon.support.UnsettableProperty; import spoon.support.reflect.declaration.CtElementImpl; +import static spoon.reflect.path.CtRole.PACKAGE_REF; + /** * This class intends to be used only to represent the reference of a * static import of all members of a type: diff --git a/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java index d16f3a8325d..ff898eed62a 100644 --- a/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.util.List; +import java.util.Objects; import spoon.SpoonException; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtFormalTypeDeclarer; @@ -21,10 +24,6 @@ import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; -import java.lang.reflect.AnnotatedElement; -import java.util.List; -import java.util.Objects; - public class CtTypeParameterReferenceImpl extends CtTypeReferenceImpl implements CtTypeParameterReference { private static final long serialVersionUID = 1L; diff --git a/src/main/java/spoon/support/reflect/reference/CtTypeReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtTypeReferenceImpl.java index 26f3d46e97e..e3c0a406971 100644 --- a/src/main/java/spoon/support/reflect/reference/CtTypeReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtTypeReferenceImpl.java @@ -7,6 +7,16 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import spoon.Launcher; import spoon.SpoonException; import spoon.reflect.annotations.MetamodelPropertyField; @@ -35,17 +45,6 @@ import spoon.support.adaption.TypeAdaptor; import spoon.support.reflect.declaration.CtElementImpl; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - import static spoon.reflect.ModelElementContainerDefaultCapacities.TYPE_TYPE_PARAMETERS_CONTAINER_DEFAULT_CAPACITY; import static spoon.reflect.path.CtRole.DECLARING_TYPE; import static spoon.reflect.path.CtRole.IS_SHADOW; diff --git a/src/main/java/spoon/support/reflect/reference/CtUnboundVariableReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtUnboundVariableReferenceImpl.java index b3c455922ff..1e0e73567b0 100644 --- a/src/main/java/spoon/support/reflect/reference/CtUnboundVariableReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtUnboundVariableReferenceImpl.java @@ -9,7 +9,6 @@ import java.lang.annotation.Annotation; import java.util.List; - import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; import spoon.reflect.reference.CtUnboundVariableReference; diff --git a/src/main/java/spoon/support/reflect/reference/CtVariableReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtVariableReferenceImpl.java index b0e078e0355..fccc40f090d 100644 --- a/src/main/java/spoon/support/reflect/reference/CtVariableReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtVariableReferenceImpl.java @@ -7,6 +7,9 @@ */ package spoon.support.reflect.reference; +import java.lang.reflect.AnnotatedElement; +import java.util.Collections; +import java.util.Set; import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtVariable; import spoon.reflect.declaration.ModifierKind; @@ -14,10 +17,6 @@ import spoon.reflect.reference.CtVariableReference; import spoon.reflect.visitor.CtVisitor; -import java.lang.reflect.AnnotatedElement; -import java.util.Collections; -import java.util.Set; - import static spoon.reflect.path.CtRole.TYPE; public abstract class CtVariableReferenceImpl extends CtReferenceImpl implements CtVariableReference { diff --git a/src/main/java/spoon/support/reflect/reference/CtWildcardReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtWildcardReferenceImpl.java index 6f94d1953d1..09638f1c851 100644 --- a/src/main/java/spoon/support/reflect/reference/CtWildcardReferenceImpl.java +++ b/src/main/java/spoon/support/reflect/reference/CtWildcardReferenceImpl.java @@ -7,9 +7,6 @@ */ package spoon.support.reflect.reference; -import static spoon.reflect.path.CtRole.BOUNDING_TYPE; -import static spoon.reflect.path.CtRole.IS_UPPER; - import spoon.reflect.annotations.MetamodelPropertyField; import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtReference; @@ -18,6 +15,9 @@ import spoon.reflect.visitor.CtVisitor; import spoon.support.UnsettableProperty; +import static spoon.reflect.path.CtRole.BOUNDING_TYPE; +import static spoon.reflect.path.CtRole.IS_UPPER; + public class CtWildcardReferenceImpl extends CtTypeParameterReferenceImpl implements CtWildcardReference { @MetamodelPropertyField(role = BOUNDING_TYPE) diff --git a/src/main/java/spoon/support/sniper/SniperJavaPrettyPrinter.java b/src/main/java/spoon/support/sniper/SniperJavaPrettyPrinter.java index cf67fc35942..e2ab8bb0037 100644 --- a/src/main/java/spoon/support/sniper/SniperJavaPrettyPrinter.java +++ b/src/main/java/spoon/support/sniper/SniperJavaPrettyPrinter.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; - import org.apache.commons.lang3.tuple.Pair; import spoon.OutputType; import spoon.SpoonException; @@ -38,6 +37,7 @@ import spoon.support.reflect.declaration.CtCompilationUnitImpl; import spoon.support.sniper.internal.ChangeResolver; import spoon.support.sniper.internal.CollectionSourceFragment; +import spoon.support.sniper.internal.DefaultSourceFragmentPrinter; import spoon.support.sniper.internal.ElementPrinterEvent; import spoon.support.sniper.internal.ElementSourceFragment; import spoon.support.sniper.internal.IndentationDetector; @@ -45,10 +45,9 @@ import spoon.support.sniper.internal.MutableTokenWriter; import spoon.support.sniper.internal.PrinterEvent; import spoon.support.sniper.internal.SourceFragment; -import spoon.support.sniper.internal.SourceFragmentPrinter; import spoon.support.sniper.internal.SourceFragmentContextList; import spoon.support.sniper.internal.SourceFragmentContextNormal; -import spoon.support.sniper.internal.DefaultSourceFragmentPrinter; +import spoon.support.sniper.internal.SourceFragmentPrinter; import spoon.support.sniper.internal.TokenPrinterEvent; import spoon.support.sniper.internal.TokenType; import spoon.support.sniper.internal.TokenWriterProxy; diff --git a/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentContextCollection.java b/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentContextCollection.java index d024b1b117b..e96d000318d 100644 --- a/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentContextCollection.java +++ b/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentContextCollection.java @@ -8,7 +8,6 @@ package spoon.support.sniper.internal; import java.util.List; - import spoon.SpoonException; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentPrinter.java b/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentPrinter.java index ade4a3d21c3..48ce0772ef3 100644 --- a/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentPrinter.java +++ b/src/main/java/spoon/support/sniper/internal/AbstractSourceFragmentPrinter.java @@ -10,16 +10,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; - import spoon.SpoonException; import spoon.reflect.code.CtComment; import spoon.reflect.cu.SourcePositionHolder; import spoon.reflect.declaration.CtModifiable; import spoon.reflect.path.CtRole; -import static spoon.support.sniper.internal.ElementSourceFragment.findIndexOfNextFragment; -import static spoon.support.sniper.internal.ElementSourceFragment.filter; import static spoon.support.sniper.internal.ElementSourceFragment.checkCollectionItems; +import static spoon.support.sniper.internal.ElementSourceFragment.filter; +import static spoon.support.sniper.internal.ElementSourceFragment.findIndexOfNextFragment; import static spoon.support.sniper.internal.ElementSourceFragment.isCommentFragment; import static spoon.support.sniper.internal.ElementSourceFragment.isSpaceFragment; diff --git a/src/main/java/spoon/support/sniper/internal/ChangeResolver.java b/src/main/java/spoon/support/sniper/internal/ChangeResolver.java index 00132aa5a10..5adc80b9449 100644 --- a/src/main/java/spoon/support/sniper/internal/ChangeResolver.java +++ b/src/main/java/spoon/support/sniper/internal/ChangeResolver.java @@ -9,7 +9,6 @@ import java.util.Collections; import java.util.Set; - import spoon.SpoonException; import spoon.reflect.cu.SourcePositionHolder; import spoon.reflect.declaration.CtElement; diff --git a/src/main/java/spoon/support/sniper/internal/CollectionSourceFragment.java b/src/main/java/spoon/support/sniper/internal/CollectionSourceFragment.java index b742ed18e27..4b999498827 100644 --- a/src/main/java/spoon/support/sniper/internal/CollectionSourceFragment.java +++ b/src/main/java/spoon/support/sniper/internal/CollectionSourceFragment.java @@ -7,9 +7,8 @@ */ package spoon.support.sniper.internal; -import spoon.support.Experimental; - import java.util.List; +import spoon.support.Experimental; /** * {@link SourceFragment} of List or Set of {@link ElementSourceFragment}s which belong to collection role. diff --git a/src/main/java/spoon/support/sniper/internal/ElementPrinterEvent.java b/src/main/java/spoon/support/sniper/internal/ElementPrinterEvent.java index a5c17e9e72c..3d67e1477ee 100644 --- a/src/main/java/spoon/support/sniper/internal/ElementPrinterEvent.java +++ b/src/main/java/spoon/support/sniper/internal/ElementPrinterEvent.java @@ -42,4 +42,3 @@ public String toString() { return "illformed ElementPrinterEvent"; } } - diff --git a/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java b/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java index 0cadbb55cd8..367dd8779f6 100644 --- a/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java +++ b/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java @@ -8,6 +8,17 @@ package spoon.support.sniper.internal; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.function.Consumer; +import java.util.function.Predicate; import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.reflect.code.CtComment; @@ -32,18 +43,6 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.cu.position.SourcePositionImpl; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Deque; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.function.Consumer; -import java.util.function.Predicate; - /** * Represents a part of source code of an {@link CtElement} * It is connected into a tree of {@link ElementSourceFragment}s. diff --git a/src/main/java/spoon/support/sniper/internal/IndentationDetector.java b/src/main/java/spoon/support/sniper/internal/IndentationDetector.java index 40a2eddb723..e170958cfc0 100644 --- a/src/main/java/spoon/support/sniper/internal/IndentationDetector.java +++ b/src/main/java/spoon/support/sniper/internal/IndentationDetector.java @@ -7,13 +7,12 @@ */ package spoon.support.sniper.internal; -import org.apache.commons.lang3.tuple.Pair; -import spoon.reflect.declaration.CtCompilationUnit; -import spoon.reflect.path.CtRole; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; +import spoon.reflect.declaration.CtCompilationUnit; +import spoon.reflect.path.CtRole; /** * Utility class for detecting the indentation style used in a compilation unit. diff --git a/src/main/java/spoon/support/sniper/internal/SourceFragmentContextList.java b/src/main/java/spoon/support/sniper/internal/SourceFragmentContextList.java index 640263bdefe..b7953834f93 100644 --- a/src/main/java/spoon/support/sniper/internal/SourceFragmentContextList.java +++ b/src/main/java/spoon/support/sniper/internal/SourceFragmentContextList.java @@ -7,9 +7,8 @@ */ package spoon.support.sniper.internal; -import spoon.reflect.declaration.CtElement; - import java.util.List; +import spoon.reflect.declaration.CtElement; /** * Handles printing of changes of the ordered list of elements. diff --git a/src/main/java/spoon/support/sniper/internal/TokenPrinterEvent.java b/src/main/java/spoon/support/sniper/internal/TokenPrinterEvent.java index 6796bed3aa0..0ace304dd46 100644 --- a/src/main/java/spoon/support/sniper/internal/TokenPrinterEvent.java +++ b/src/main/java/spoon/support/sniper/internal/TokenPrinterEvent.java @@ -10,7 +10,6 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; - import org.jspecify.annotations.Nullable; import spoon.reflect.code.CtComment; import spoon.reflect.cu.SourcePositionHolder; @@ -77,4 +76,3 @@ public TokenType getTokenType() { return type; } } - diff --git a/src/main/java/spoon/support/sniper/package-info.java b/src/main/java/spoon/support/sniper/package-info.java index 5d7cb626f96..3d983d375e9 100644 --- a/src/main/java/spoon/support/sniper/package-info.java +++ b/src/main/java/spoon/support/sniper/package-info.java @@ -17,4 +17,3 @@ * See https://github.com/INRIA/spoon/issues/1284 */ package spoon.support.sniper; - diff --git a/src/main/java/spoon/support/template/Parameters.java b/src/main/java/spoon/support/template/Parameters.java index 50ab8886147..141bf81a5b8 100644 --- a/src/main/java/spoon/support/template/Parameters.java +++ b/src/main/java/spoon/support/template/Parameters.java @@ -7,6 +7,13 @@ */ package spoon.support.template; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import spoon.SpoonException; import spoon.reflect.code.CtArrayAccess; import spoon.reflect.code.CtExpression; @@ -23,14 +30,6 @@ import spoon.template.Template; import spoon.template.TemplateParameter; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - /** * This class defines an API to manipulate template parameters. */ diff --git a/src/main/java/spoon/support/util/ImmutableMapImpl.java b/src/main/java/spoon/support/util/ImmutableMapImpl.java index e30da77774e..7d1843d6b8a 100644 --- a/src/main/java/spoon/support/util/ImmutableMapImpl.java +++ b/src/main/java/spoon/support/util/ImmutableMapImpl.java @@ -7,13 +7,12 @@ */ package spoon.support.util; -import spoon.support.Internal; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import spoon.support.Internal; /** * diff --git a/src/main/java/spoon/support/util/ModelList.java b/src/main/java/spoon/support/util/ModelList.java index febd9d0a000..7138b2a7387 100644 --- a/src/main/java/spoon/support/util/ModelList.java +++ b/src/main/java/spoon/support/util/ModelList.java @@ -8,20 +8,19 @@ package spoon.support.util; -import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; - import java.io.Serializable; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.List; - -import spoon.support.modelobs.FineModelChangeListener; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; +import spoon.support.modelobs.FineModelChangeListener; import spoon.support.reflect.declaration.CtElementImpl; +import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; + /** * The implementation of the {@link List}, which is used by Spoon model objects. * It assures: diff --git a/src/main/java/spoon/support/util/ModelSet.java b/src/main/java/spoon/support/util/ModelSet.java index 114166ed501..2c4d6e591af 100644 --- a/src/main/java/spoon/support/util/ModelSet.java +++ b/src/main/java/spoon/support/util/ModelSet.java @@ -7,8 +7,6 @@ */ package spoon.support.util; -import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; - import java.io.Serializable; import java.util.AbstractSet; import java.util.Collection; @@ -18,11 +16,12 @@ import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; - import spoon.SpoonException; -import spoon.support.modelobs.FineModelChangeListener; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; +import spoon.support.modelobs.FineModelChangeListener; + +import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; /** * The implementation of the {@link Set}, which is used by Spoon model objects. diff --git a/src/main/java/spoon/support/util/QualifiedNameBasedSortedSet.java b/src/main/java/spoon/support/util/QualifiedNameBasedSortedSet.java index 927147b870e..84113d1f332 100644 --- a/src/main/java/spoon/support/util/QualifiedNameBasedSortedSet.java +++ b/src/main/java/spoon/support/util/QualifiedNameBasedSortedSet.java @@ -11,7 +11,6 @@ import java.util.Iterator; import java.util.TreeSet; import java.util.stream.Stream; - import spoon.reflect.declaration.CtElement; import spoon.support.comparator.CtLineElementComparator; import spoon.support.comparator.QualifiedNameComparator; diff --git a/src/main/java/spoon/support/util/RtHelper.java b/src/main/java/spoon/support/util/RtHelper.java index 714cf43d8aa..677c10b0176 100644 --- a/src/main/java/spoon/support/util/RtHelper.java +++ b/src/main/java/spoon/support/util/RtHelper.java @@ -7,16 +7,6 @@ */ package spoon.support.util; -import org.jspecify.annotations.Nullable; -import spoon.reflect.code.CtExpression; -import spoon.reflect.code.CtInvocation; -import spoon.reflect.code.CtLiteral; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.factory.Factory; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.reference.CtFieldReference; -import spoon.reflect.reference.CtTypeReference; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -28,6 +18,15 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.jspecify.annotations.Nullable; +import spoon.reflect.code.CtExpression; +import spoon.reflect.code.CtInvocation; +import spoon.reflect.code.CtLiteral; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.reference.CtFieldReference; +import spoon.reflect.reference.CtTypeReference; /** * This class is a helper for runtime reflection. diff --git a/src/main/java/spoon/support/util/SignatureBasedSortedSet.java b/src/main/java/spoon/support/util/SignatureBasedSortedSet.java index b10437fea64..107474fbb1f 100644 --- a/src/main/java/spoon/support/util/SignatureBasedSortedSet.java +++ b/src/main/java/spoon/support/util/SignatureBasedSortedSet.java @@ -7,11 +7,10 @@ */ package spoon.support.util; -import spoon.reflect.declaration.CtExecutable; -import spoon.support.comparator.SignatureComparator; - import java.util.Collection; import java.util.TreeSet; +import spoon.reflect.declaration.CtExecutable; +import spoon.support.comparator.SignatureComparator; /** maintains unicity with method signatures */ public class SignatureBasedSortedSet> extends TreeSet { diff --git a/src/main/java/spoon/support/util/internal/ElementNameMap.java b/src/main/java/spoon/support/util/internal/ElementNameMap.java index 64d8a3010a9..a30782b9da7 100644 --- a/src/main/java/spoon/support/util/internal/ElementNameMap.java +++ b/src/main/java/spoon/support/util/internal/ElementNameMap.java @@ -7,8 +7,6 @@ */ package spoon.support.util.internal; -import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; - import java.io.Serializable; import java.util.AbstractMap; import java.util.Comparator; @@ -22,12 +20,13 @@ import java.util.function.BinaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; - import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; import spoon.support.modelobs.FineModelChangeListener; +import static spoon.support.util.internal.ModelCollectionUtils.linkToParent; + /** * This class is for internal use only. *


diff --git a/src/main/java/spoon/support/visitor/AbstractTypingContext.java b/src/main/java/spoon/support/visitor/AbstractTypingContext.java index be72e41b6e9..13cce30bf2c 100644 --- a/src/main/java/spoon/support/visitor/AbstractTypingContext.java +++ b/src/main/java/spoon/support/visitor/AbstractTypingContext.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.List; - import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtType; diff --git a/src/main/java/spoon/support/visitor/ClassTypingContext.java b/src/main/java/spoon/support/visitor/ClassTypingContext.java index 3d65eb60d4f..47d07fbbfde 100644 --- a/src/main/java/spoon/support/visitor/ClassTypingContext.java +++ b/src/main/java/spoon/support/visitor/ClassTypingContext.java @@ -7,6 +7,13 @@ */ package spoon.support.visitor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.reflect.declaration.CtConstructor; @@ -27,14 +34,6 @@ import spoon.reflect.visitor.filter.SuperInheritanceHierarchyFunction; import spoon.support.SpoonClassNotFoundException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Helper class created from type X or reference to X. * It provides access to actual type arguments diff --git a/src/main/java/spoon/support/visitor/MethodTypingContext.java b/src/main/java/spoon/support/visitor/MethodTypingContext.java index 7684985c88a..bda5c5e2310 100644 --- a/src/main/java/spoon/support/visitor/MethodTypingContext.java +++ b/src/main/java/spoon/support/visitor/MethodTypingContext.java @@ -7,14 +7,11 @@ */ package spoon.support.visitor; -import static spoon.support.visitor.ClassTypingContext.getTypeReferences; - import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; import java.util.Set; - import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.reflect.code.CtExpression; @@ -31,6 +28,8 @@ import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; +import static spoon.support.visitor.ClassTypingContext.getTypeReferences; + /** * For the scope method or constructor and super type hierarchy of it's declaring type, * it is able to adapt type parameters. diff --git a/src/main/java/spoon/support/visitor/SubInheritanceHierarchyResolver.java b/src/main/java/spoon/support/visitor/SubInheritanceHierarchyResolver.java index 4a96fdec052..078154b7a49 100644 --- a/src/main/java/spoon/support/visitor/SubInheritanceHierarchyResolver.java +++ b/src/main/java/spoon/support/visitor/SubInheritanceHierarchyResolver.java @@ -7,6 +7,10 @@ */ package spoon.support.visitor; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; +import java.util.Set; import spoon.SpoonException; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtElement; @@ -25,11 +29,6 @@ import spoon.reflect.visitor.filter.SuperInheritanceHierarchyFunction; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashSet; -import java.util.Set; - /** * Expects a {@link CtPackage} as input * and upon calls to forEachSubTypeInPackage produces all sub classes and sub interfaces, diff --git a/src/main/java/spoon/support/visitor/TypeReferenceScanner.java b/src/main/java/spoon/support/visitor/TypeReferenceScanner.java index 8fe7ed58a2d..e8068b0f21a 100644 --- a/src/main/java/spoon/support/visitor/TypeReferenceScanner.java +++ b/src/main/java/spoon/support/visitor/TypeReferenceScanner.java @@ -7,6 +7,9 @@ */ package spoon.support.visitor; +import java.lang.annotation.Annotation; +import java.util.HashSet; +import java.util.Set; import spoon.reflect.code.CtFieldRead; import spoon.reflect.code.CtFieldWrite; import spoon.reflect.declaration.CtAnnotationType; @@ -21,10 +24,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtScanner; -import java.lang.annotation.Annotation; -import java.util.HashSet; -import java.util.Set; - /** * A scanner that calculates the imports for a given model. */ @@ -146,4 +145,3 @@ public void visitCtClass(CtClass ctClass) { super.visitCtClass(ctClass); } } - diff --git a/src/main/java/spoon/support/visitor/equals/CloneHelper.java b/src/main/java/spoon/support/visitor/equals/CloneHelper.java index 833c82de3f6..2b429960156 100644 --- a/src/main/java/spoon/support/visitor/equals/CloneHelper.java +++ b/src/main/java/spoon/support/visitor/equals/CloneHelper.java @@ -7,13 +7,6 @@ */ package spoon.support.visitor.equals; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.visitor.CtScanner; -import spoon.support.util.EmptyClearableList; -import spoon.support.util.EmptyClearableSet; -import spoon.support.visitor.clone.CloneVisitor; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -21,6 +14,12 @@ import java.util.List; import java.util.Map; import java.util.Set; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.visitor.CtScanner; +import spoon.support.util.EmptyClearableList; +import spoon.support.util.EmptyClearableSet; +import spoon.support.visitor.clone.CloneVisitor; /** * {@link CloneHelper} is responsible for creating clones of {@link CtElement} AST nodes including the whole subtree. diff --git a/src/main/java/spoon/support/visitor/equals/EqualsChecker.java b/src/main/java/spoon/support/visitor/equals/EqualsChecker.java index 20117347a48..5343f886bc2 100644 --- a/src/main/java/spoon/support/visitor/equals/EqualsChecker.java +++ b/src/main/java/spoon/support/visitor/equals/EqualsChecker.java @@ -18,6 +18,7 @@ import spoon.reflect.code.CtUnaryOperator; import spoon.reflect.declaration.CtCodeSnippet; import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtModifiable; import spoon.reflect.declaration.CtNamedElement; @@ -25,7 +26,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.declaration.CtImport; import spoon.reflect.reference.CtReference; import spoon.reflect.visitor.CtInheritanceScanner; diff --git a/src/main/java/spoon/support/visitor/equals/EqualsVisitor.java b/src/main/java/spoon/support/visitor/equals/EqualsVisitor.java index eea1269bc9a..2939d1ed3fb 100644 --- a/src/main/java/spoon/support/visitor/equals/EqualsVisitor.java +++ b/src/main/java/spoon/support/visitor/equals/EqualsVisitor.java @@ -8,12 +8,11 @@ package spoon.support.visitor.equals; +import java.util.Collection; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; import spoon.reflect.visitor.CtBiScannerDefault; -import java.util.Collection; - /** * Used to check equality between an element and another one. * diff --git a/src/main/java/spoon/support/visitor/java/JavaReflectionTreeBuilder.java b/src/main/java/spoon/support/visitor/java/JavaReflectionTreeBuilder.java index 198966ac8a5..8e6bbeae8b3 100644 --- a/src/main/java/spoon/support/visitor/java/JavaReflectionTreeBuilder.java +++ b/src/main/java/spoon/support/visitor/java/JavaReflectionTreeBuilder.java @@ -22,7 +22,6 @@ import java.util.Deque; import java.util.Iterator; import java.util.Set; - import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtExpression; diff --git a/src/main/java/spoon/support/visitor/java/JavaReflectionVisitor.java b/src/main/java/spoon/support/visitor/java/JavaReflectionVisitor.java index 7df50df582e..6cab71b2727 100644 --- a/src/main/java/spoon/support/visitor/java/JavaReflectionVisitor.java +++ b/src/main/java/spoon/support/visitor/java/JavaReflectionVisitor.java @@ -7,10 +7,6 @@ */ package spoon.support.visitor.java; -import spoon.reflect.path.CtRole; -import spoon.support.visitor.java.reflect.RtMethod; -import spoon.support.visitor.java.reflect.RtParameter; - import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Constructor; @@ -20,6 +16,9 @@ import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.lang.reflect.WildcardType; +import spoon.reflect.path.CtRole; +import spoon.support.visitor.java.reflect.RtMethod; +import spoon.support.visitor.java.reflect.RtParameter; /** * Internal, package-visible interface for building shadow classes. diff --git a/src/main/java/spoon/support/visitor/java/JavaReflectionVisitorImpl.java b/src/main/java/spoon/support/visitor/java/JavaReflectionVisitorImpl.java index 73f4b26387d..fa41dac2abe 100644 --- a/src/main/java/spoon/support/visitor/java/JavaReflectionVisitorImpl.java +++ b/src/main/java/spoon/support/visitor/java/JavaReflectionVisitorImpl.java @@ -22,7 +22,6 @@ import java.lang.reflect.WildcardType; import java.util.ArrayList; import java.util.List; - import org.jspecify.annotations.Nullable; import spoon.SpoonException; import spoon.reflect.path.CtRole; diff --git a/src/main/java/spoon/support/visitor/java/MethodHandleUtils.java b/src/main/java/spoon/support/visitor/java/MethodHandleUtils.java index 381d45c72cd..bf7cd5a7e82 100644 --- a/src/main/java/spoon/support/visitor/java/MethodHandleUtils.java +++ b/src/main/java/spoon/support/visitor/java/MethodHandleUtils.java @@ -7,8 +7,6 @@ */ package spoon.support.visitor.java; -import org.jspecify.annotations.Nullable; - import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -18,6 +16,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.jspecify.annotations.Nullable; /** * This defines multiple utility methods for working with method handles. These methods are all calls to future jdk methods and maybe not available on jdk8. diff --git a/src/main/java/spoon/support/visitor/java/internal/AbstractRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/AbstractRuntimeBuilderContext.java index 9f2cf364392..512224dc934 100644 --- a/src/main/java/spoon/support/visitor/java/internal/AbstractRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/AbstractRuntimeBuilderContext.java @@ -7,6 +7,8 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; +import java.lang.reflect.GenericDeclaration; import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtConstructor; @@ -22,9 +24,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; -import java.lang.reflect.GenericDeclaration; - abstract class AbstractRuntimeBuilderContext implements RuntimeBuilderContext { protected AbstractRuntimeBuilderContext(CtShadowable element) { diff --git a/src/main/java/spoon/support/visitor/java/internal/AnnotationRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/AnnotationRuntimeBuilderContext.java index 21f6e1d5c79..22c4f6db66c 100644 --- a/src/main/java/spoon/support/visitor/java/internal/AnnotationRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/AnnotationRuntimeBuilderContext.java @@ -7,12 +7,11 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; - public class AnnotationRuntimeBuilderContext extends AbstractRuntimeBuilderContext { private CtAnnotation ctAnnotation; diff --git a/src/main/java/spoon/support/visitor/java/internal/ExecutableRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/ExecutableRuntimeBuilderContext.java index ec5a1dc3cda..574ec90d0ce 100644 --- a/src/main/java/spoon/support/visitor/java/internal/ExecutableRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/ExecutableRuntimeBuilderContext.java @@ -7,6 +7,11 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; +import java.lang.reflect.Executable; +import java.lang.reflect.GenericDeclaration; +import java.util.HashMap; +import java.util.Map; import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtConstructor; @@ -18,12 +23,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; -import java.lang.reflect.Executable; -import java.lang.reflect.GenericDeclaration; -import java.util.HashMap; -import java.util.Map; - public class ExecutableRuntimeBuilderContext extends AbstractRuntimeBuilderContext { private CtExecutable ctExecutable; private Executable executable; diff --git a/src/main/java/spoon/support/visitor/java/internal/PackageRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/PackageRuntimeBuilderContext.java index 63324d87fa5..166169641db 100644 --- a/src/main/java/spoon/support/visitor/java/internal/PackageRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/PackageRuntimeBuilderContext.java @@ -7,12 +7,11 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; -import java.lang.annotation.Annotation; - public class PackageRuntimeBuilderContext extends AbstractRuntimeBuilderContext { private CtPackage ctPackage; diff --git a/src/main/java/spoon/support/visitor/java/internal/RuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/RuntimeBuilderContext.java index 6898e83b8aa..f00c69147a5 100644 --- a/src/main/java/spoon/support/visitor/java/internal/RuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/RuntimeBuilderContext.java @@ -7,6 +7,8 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; +import java.lang.reflect.GenericDeclaration; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtEnumValue; @@ -20,9 +22,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; -import java.lang.reflect.GenericDeclaration; - public interface RuntimeBuilderContext { void addPackage(CtPackage ctPackage); diff --git a/src/main/java/spoon/support/visitor/java/internal/TypeReferenceRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/TypeReferenceRuntimeBuilderContext.java index 2807a982563..5de4a7f822c 100644 --- a/src/main/java/spoon/support/visitor/java/internal/TypeReferenceRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/TypeReferenceRuntimeBuilderContext.java @@ -7,6 +7,12 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; +import java.lang.reflect.GenericDeclaration; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtPackage; @@ -15,13 +21,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtWildcardReference; -import java.lang.annotation.Annotation; -import java.lang.reflect.GenericDeclaration; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - public class TypeReferenceRuntimeBuilderContext extends AbstractRuntimeBuilderContext { private CtTypeReference typeReference; private Type type; diff --git a/src/main/java/spoon/support/visitor/java/internal/TypeRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/TypeRuntimeBuilderContext.java index a13af383b02..a70c902bc60 100644 --- a/src/main/java/spoon/support/visitor/java/internal/TypeRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/TypeRuntimeBuilderContext.java @@ -7,6 +7,11 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; +import java.lang.reflect.GenericDeclaration; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; import org.jspecify.annotations.Nullable; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtField; @@ -19,12 +24,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; -import java.lang.reflect.GenericDeclaration; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; - public class TypeRuntimeBuilderContext extends AbstractRuntimeBuilderContext { protected CtType type; protected Type rtType; diff --git a/src/main/java/spoon/support/visitor/java/internal/VariableRuntimeBuilderContext.java b/src/main/java/spoon/support/visitor/java/internal/VariableRuntimeBuilderContext.java index 22890125e9b..8ada06eaea8 100644 --- a/src/main/java/spoon/support/visitor/java/internal/VariableRuntimeBuilderContext.java +++ b/src/main/java/spoon/support/visitor/java/internal/VariableRuntimeBuilderContext.java @@ -7,6 +7,7 @@ */ package spoon.support.visitor.java.internal; +import java.lang.annotation.Annotation; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtParameter; @@ -14,8 +15,6 @@ import spoon.reflect.path.CtRole; import spoon.reflect.reference.CtTypeReference; -import java.lang.annotation.Annotation; - public class VariableRuntimeBuilderContext extends AbstractRuntimeBuilderContext { private CtVariable ctVariable; diff --git a/src/main/java/spoon/support/visitor/java/reflect/RtParameter.java b/src/main/java/spoon/support/visitor/java/reflect/RtParameter.java index a6afeac6827..01ed2e28f18 100644 --- a/src/main/java/spoon/support/visitor/java/reflect/RtParameter.java +++ b/src/main/java/spoon/support/visitor/java/reflect/RtParameter.java @@ -7,12 +7,11 @@ */ package spoon.support.visitor.java.reflect; -import spoon.SpoonException; - import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Parameter; import java.lang.reflect.Type; +import spoon.SpoonException; /** * To be compatible with Java 6, RtParameter has been created from diff --git a/src/main/java/spoon/template/AbstractTemplate.java b/src/main/java/spoon/template/AbstractTemplate.java index e65731163b4..74ca9986852 100644 --- a/src/main/java/spoon/template/AbstractTemplate.java +++ b/src/main/java/spoon/template/AbstractTemplate.java @@ -8,7 +8,6 @@ package spoon.template; import java.lang.reflect.Field; - import spoon.SpoonException; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; diff --git a/src/main/java/spoon/template/ExtensionTemplate.java b/src/main/java/spoon/template/ExtensionTemplate.java index 8a9c63cf4f6..3de8e53fbfc 100644 --- a/src/main/java/spoon/template/ExtensionTemplate.java +++ b/src/main/java/spoon/template/ExtensionTemplate.java @@ -8,7 +8,6 @@ package spoon.template; import java.util.ArrayList; - import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeMember; diff --git a/src/main/java/spoon/template/StatementTemplate.java b/src/main/java/spoon/template/StatementTemplate.java index f9a1f65f44f..40f80d70599 100644 --- a/src/main/java/spoon/template/StatementTemplate.java +++ b/src/main/java/spoon/template/StatementTemplate.java @@ -7,12 +7,11 @@ */ package spoon.template; +import java.util.List; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtType; -import java.util.List; - /** * This class represents a template parameter that defines a statement list * directly expressed in Java (no returns). diff --git a/src/main/java/spoon/template/Substitution.java b/src/main/java/spoon/template/Substitution.java index c83ae06cd53..a0768d5571b 100644 --- a/src/main/java/spoon/template/Substitution.java +++ b/src/main/java/spoon/template/Substitution.java @@ -7,6 +7,10 @@ */ package spoon.template; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; +import java.util.Set; import spoon.SpoonException; import spoon.pattern.PatternBuilder; import spoon.processing.FactoryAccessor; @@ -30,11 +34,6 @@ import spoon.reflect.visitor.filter.ReferenceTypeFilter; import spoon.support.template.Parameters; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * This class defines the substitution API for templates (see {@link Template}). */ diff --git a/src/main/java/spoon/template/TemplateBuilder.java b/src/main/java/spoon/template/TemplateBuilder.java index d9b9d47b0de..c8302ddd8d6 100644 --- a/src/main/java/spoon/template/TemplateBuilder.java +++ b/src/main/java/spoon/template/TemplateBuilder.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; - import spoon.SpoonException; import spoon.pattern.Pattern; import spoon.pattern.PatternBuilderHelper; diff --git a/src/main/java/spoon/template/TemplateMatcher.java b/src/main/java/spoon/template/TemplateMatcher.java index 5dbdb82e226..e3479061e87 100644 --- a/src/main/java/spoon/template/TemplateMatcher.java +++ b/src/main/java/spoon/template/TemplateMatcher.java @@ -7,10 +7,7 @@ */ package spoon.template; -import static spoon.pattern.internal.matcher.TobeMatched.getMatchedParameters; - import java.util.List; - import spoon.pattern.Match; import spoon.pattern.Pattern; import spoon.pattern.internal.matcher.TobeMatched; @@ -23,6 +20,8 @@ import spoon.support.util.ImmutableMap; import spoon.support.util.ImmutableMapImpl; +import static spoon.pattern.internal.matcher.TobeMatched.getMatchedParameters; + /** * This class defines an engine for matching a template to pieces of code. */ diff --git a/src/main/java/spoon/template/package-info.java b/src/main/java/spoon/template/package-info.java index 7f9816cf4fa..55d35f4fb37 100644 --- a/src/main/java/spoon/template/package-info.java +++ b/src/main/java/spoon/template/package-info.java @@ -15,4 +15,3 @@ * */ package spoon.template; - diff --git a/src/main/java/spoon/testing/AbstractAssert.java b/src/main/java/spoon/testing/AbstractAssert.java index 63de36a8993..cf930d950b6 100644 --- a/src/main/java/spoon/testing/AbstractAssert.java +++ b/src/main/java/spoon/testing/AbstractAssert.java @@ -7,11 +7,10 @@ */ package spoon.testing; +import java.util.LinkedList; import spoon.SpoonException; import spoon.processing.Processor; -import java.util.LinkedList; - /** * Base contract for all assertion objects: the minimum functionality that * any assertion object should provide. diff --git a/src/main/java/spoon/testing/AbstractCtElementAssert.java b/src/main/java/spoon/testing/AbstractCtElementAssert.java index 151eebb25ee..bb5f6bbe7a8 100644 --- a/src/main/java/spoon/testing/AbstractCtElementAssert.java +++ b/src/main/java/spoon/testing/AbstractCtElementAssert.java @@ -10,8 +10,8 @@ import spoon.reflect.declaration.CtElement; import static spoon.testing.utils.Check.assertCtElementEquals; -import static spoon.testing.utils.Check.assertNotNull; import static spoon.testing.utils.Check.assertIsSame; +import static spoon.testing.utils.Check.assertNotNull; import static spoon.testing.utils.ProcessorUtils.process; public abstract class AbstractCtElementAssert> extends AbstractAssert { diff --git a/src/main/java/spoon/testing/AbstractCtPackageAssert.java b/src/main/java/spoon/testing/AbstractCtPackageAssert.java index 793007e89d6..7a9eeadf123 100644 --- a/src/main/java/spoon/testing/AbstractCtPackageAssert.java +++ b/src/main/java/spoon/testing/AbstractCtPackageAssert.java @@ -7,13 +7,12 @@ */ package spoon.testing; -import spoon.reflect.declaration.CtPackage; -import spoon.reflect.declaration.CtType; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import spoon.reflect.declaration.CtPackage; +import spoon.reflect.declaration.CtType; import static spoon.testing.Assert.assertThat; import static spoon.testing.utils.Check.assertNotNull; diff --git a/src/main/java/spoon/testing/AbstractFileAssert.java b/src/main/java/spoon/testing/AbstractFileAssert.java index ffb206ef0d4..00795c015fd 100644 --- a/src/main/java/spoon/testing/AbstractFileAssert.java +++ b/src/main/java/spoon/testing/AbstractFileAssert.java @@ -7,11 +7,10 @@ */ package spoon.testing; -import spoon.reflect.declaration.CtType; -import spoon.reflect.factory.Factory; - import java.io.File; import java.util.List; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.Factory; import static spoon.testing.utils.Check.assertExists; import static spoon.testing.utils.Check.assertNotNull; diff --git a/src/main/java/spoon/testing/Assert.java b/src/main/java/spoon/testing/Assert.java index 7d000a14db4..ebc88fc0b78 100644 --- a/src/main/java/spoon/testing/Assert.java +++ b/src/main/java/spoon/testing/Assert.java @@ -7,11 +7,10 @@ */ package spoon.testing; +import java.io.File; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtPackage; -import java.io.File; - import static spoon.testing.utils.Check.assertExists; import static spoon.testing.utils.Check.assertNotNull; diff --git a/src/main/java/spoon/testing/utils/Check.java b/src/main/java/spoon/testing/utils/Check.java index cb912352b7e..43b1f4ece37 100644 --- a/src/main/java/spoon/testing/utils/Check.java +++ b/src/main/java/spoon/testing/utils/Check.java @@ -7,11 +7,10 @@ */ package spoon.testing.utils; +import java.io.File; import spoon.reflect.declaration.CtElement; import spoon.support.visitor.equals.EqualsVisitor; -import java.io.File; - public final class Check { private Check() { throw new AssertionError(); diff --git a/src/main/java/spoon/testing/utils/ModelUtils.java b/src/main/java/spoon/testing/utils/ModelUtils.java index a54166d3199..78c720f07c9 100644 --- a/src/main/java/spoon/testing/utils/ModelUtils.java +++ b/src/main/java/spoon/testing/utils/ModelUtils.java @@ -7,6 +7,9 @@ */ package spoon.testing.utils; +import java.io.File; +import java.io.FileNotFoundException; +import java.util.function.Consumer; import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonResourceHelper; @@ -16,10 +19,6 @@ import spoon.support.DefaultCoreFactory; import spoon.support.StandardEnvironment; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.function.Consumer; - public final class ModelUtils { private ModelUtils() { throw new AssertionError(); diff --git a/src/main/java/spoon/testing/utils/ProcessorUtils.java b/src/main/java/spoon/testing/utils/ProcessorUtils.java index f6156391ae9..f5025c1beb7 100644 --- a/src/main/java/spoon/testing/utils/ProcessorUtils.java +++ b/src/main/java/spoon/testing/utils/ProcessorUtils.java @@ -8,6 +8,8 @@ package spoon.testing.utils; import com.fasterxml.jackson.databind.ObjectMapper; +import java.lang.reflect.Field; +import java.util.Collection; import spoon.Launcher; import spoon.SpoonException; import spoon.processing.Processor; @@ -17,9 +19,6 @@ import spoon.support.compiler.jdt.JDTBasedSpoonCompiler; import spoon.support.util.RtHelper; -import java.lang.reflect.Field; -import java.util.Collection; - public final class ProcessorUtils { private static final ObjectMapper converter = new ObjectMapper(); diff --git a/src/test/java/spoon/CompilationUnitPrintTest.java b/src/test/java/spoon/CompilationUnitPrintTest.java index c638030f11b..3945d97acd3 100644 --- a/src/test/java/spoon/CompilationUnitPrintTest.java +++ b/src/test/java/spoon/CompilationUnitPrintTest.java @@ -2,7 +2,6 @@ import java.io.File; - import org.junit.jupiter.api.Test; import spoon.compiler.Environment; import spoon.reflect.declaration.CtClass; @@ -15,63 +14,63 @@ public class CompilationUnitPrintTest { - @Test - public void test() { + @Test + public void test() { - /* Testing scenario: - Build a model with a class - Clone this class - Modify the clone by adding a method - Print out the clone - Build a model using the printed clone - Compare the number of number between the outputted class and the cloned one - */ + /* Testing scenario: + Build a model with a class + Clone this class + Modify the clone by adding a method + Print out the clone + Build a model using the printed clone + Compare the number of number between the outputted class and the cloned one + */ - // build original class - Launcher launcher = new Launcher(); - launcher.addInputResource("src/test/java/spoon/CompilationUnitPrintTest.java"); - launcher.getEnvironment().setNoClasspath(true); - launcher.buildModel(); - final Factory factory = launcher.getFactory(); + // build original class + Launcher launcher = new Launcher(); + launcher.addInputResource("src/test/java/spoon/CompilationUnitPrintTest.java"); + launcher.getEnvironment().setNoClasspath(true); + launcher.buildModel(); + final Factory factory = launcher.getFactory(); - // clone - final CtClass compilationUnitPrintTest = factory.Class().get("spoon.CompilationUnitPrintTest"); - final CtClass clone = compilationUnitPrintTest.clone(); - compilationUnitPrintTest.getPackage().addType(clone); - assertEquals(1 , clone.getMethods().size()); - assertEquals(1 , compilationUnitPrintTest.getMethods().size()); + // clone + final CtClass compilationUnitPrintTest = factory.Class().get("spoon.CompilationUnitPrintTest"); + final CtClass clone = compilationUnitPrintTest.clone(); + compilationUnitPrintTest.getPackage().addType(clone); + assertEquals(1 , clone.getMethods().size()); + assertEquals(1 , compilationUnitPrintTest.getMethods().size()); - // modification - CtMethod cloneMethod = ((CtMethod) clone.getMethodsByName("test").get(0)).clone(); - cloneMethod.setSimpleName("cloneTest"); - clone.addMethod(cloneMethod); - assertEquals(2 , clone.getMethods().size()); - assertEquals(1 , compilationUnitPrintTest.getMethods().size()); + // modification + CtMethod cloneMethod = ((CtMethod) clone.getMethodsByName("test").get(0)).clone(); + cloneMethod.setSimpleName("cloneTest"); + clone.addMethod(cloneMethod); + assertEquals(2 , clone.getMethods().size()); + assertEquals(1 , compilationUnitPrintTest.getMethods().size()); - // print modified class - Environment env = factory.getEnvironment(); - env.setAutoImports(true); - env.setNoClasspath(true); - env.setCommentEnabled(true); - JavaOutputProcessor processor = new JavaOutputProcessor(new DefaultJavaPrettyPrinter(env)); - processor.setFactory(factory); - processor.getEnvironment().setSourceOutputDirectory(new File("target/")); - processor.createJavaFile(clone); // <- here we print out the clone, which have two methods - assertEquals(2 , clone.getMethods().size()); - assertEquals(1 , compilationUnitPrintTest.getMethods().size()); + // print modified class + Environment env = factory.getEnvironment(); + env.setAutoImports(true); + env.setNoClasspath(true); + env.setCommentEnabled(true); + JavaOutputProcessor processor = new JavaOutputProcessor(new DefaultJavaPrettyPrinter(env)); + processor.setFactory(factory); + processor.getEnvironment().setSourceOutputDirectory(new File("target/")); + processor.createJavaFile(clone); // <- here we print out the clone, which have two methods + assertEquals(2 , clone.getMethods().size()); + assertEquals(1 , compilationUnitPrintTest.getMethods().size()); - // building now a new model from the java file outputted just before - launcher = new Launcher(); - launcher.addInputResource("target/spoon/CompilationUnitPrintTest.java"); - launcher.getEnvironment().setNoClasspath(true); - launcher.buildModel(); + // building now a new model from the java file outputted just before + launcher = new Launcher(); + launcher.addInputResource("target/spoon/CompilationUnitPrintTest.java"); + launcher.getEnvironment().setNoClasspath(true); + launcher.buildModel(); - // compare the number of methods in the printed class and the clone, should be the same (2) - assertEquals( - clone.getMethods().size(), - launcher.getFactory().Class().get("spoon.CompilationUnitPrintTest").getMethods().size() - ); - } + // compare the number of methods in the printed class and the clone, should be the same (2) + assertEquals( + clone.getMethods().size(), + launcher.getFactory().Class().get("spoon.CompilationUnitPrintTest").getMethods().size() + ); + } } diff --git a/src/test/java/spoon/FluentLauncherTest.java b/src/test/java/spoon/FluentLauncherTest.java index 0a96edb29da..6a73c63facc 100644 --- a/src/test/java/spoon/FluentLauncherTest.java +++ b/src/test/java/spoon/FluentLauncherTest.java @@ -14,10 +14,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; - import spoon.processing.AbstractProcessor; import spoon.reflect.CtModel; import spoon.reflect.declaration.CtType; diff --git a/src/test/java/spoon/LauncherTest.java b/src/test/java/spoon/LauncherTest.java index 61d6e6a9cf1..00858c02949 100644 --- a/src/test/java/spoon/LauncherTest.java +++ b/src/test/java/spoon/LauncherTest.java @@ -25,13 +25,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Collection; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.compiler.Environment; import spoon.reflect.CtModel; -import spoon.reflect.declaration.CtModule; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; import spoon.support.JavaOutputProcessor; import spoon.support.compiler.VirtualFile; @@ -127,7 +124,7 @@ public void testLLauncherBuildModelReturnAModel() { assertEquals(2, model.getAllTypes().size()); } - + @Test public void testPrettyPrintWithVirtualFileInput() throws Exception { // contract: prettyPrint() should not throw an exception when used with input from VirtualFile @@ -142,7 +139,7 @@ public void testPrettyPrintWithVirtualFileInput() throws Exception { File tmpDir = Files.createTempDirectory("spoonTestPrettyPrintWithVirtualFileInput").toFile(); tmpDir.deleteOnExit(); launcher.setSourceOutputDirectory(tmpDir); - + assertDoesNotThrow(() -> launcher.prettyprint()); } diff --git a/src/test/java/spoon/MavenLauncherTest.java b/src/test/java/spoon/MavenLauncherTest.java index 2ca4c7ac300..d8738dfeb00 100644 --- a/src/test/java/spoon/MavenLauncherTest.java +++ b/src/test/java/spoon/MavenLauncherTest.java @@ -25,7 +25,6 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; - import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Disabled; diff --git a/src/test/java/spoon/generating/CloneVisitorGenerator.java b/src/test/java/spoon/generating/CloneVisitorGenerator.java index f476dc90207..9f3182fbe35 100644 --- a/src/test/java/spoon/generating/CloneVisitorGenerator.java +++ b/src/test/java/spoon/generating/CloneVisitorGenerator.java @@ -16,6 +16,13 @@ */ package spoon.generating; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import spoon.SpoonException; import spoon.processing.AbstractManualProcessor; @@ -53,18 +60,10 @@ import spoon.reflect.visitor.filter.OverridingMethodFilter; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.reflect.CtModifierHandler; -import spoon.support.util.internal.ElementNameMap; import spoon.support.util.ModelList; +import spoon.support.util.internal.ElementNameMap; import spoon.support.visitor.clone.CloneBuilder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - public class CloneVisitorGenerator extends AbstractManualProcessor { private static final String TARGET_CLONE_PACKAGE = "spoon.support.visitor.clone"; private static final String TARGET_CLONE_TYPE = "CloneVisitor"; diff --git a/src/test/java/spoon/generating/CtBiScannerGenerator.java b/src/test/java/spoon/generating/CtBiScannerGenerator.java index ad623eec19e..13c417e86f1 100644 --- a/src/test/java/spoon/generating/CtBiScannerGenerator.java +++ b/src/test/java/spoon/generating/CtBiScannerGenerator.java @@ -16,6 +16,7 @@ */ package spoon.generating; +import java.util.List; import spoon.processing.AbstractManualProcessor; import spoon.reflect.code.CtComment; import spoon.reflect.code.CtExpression; @@ -32,8 +33,6 @@ import spoon.reflect.visitor.CtScanner; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.List; - public class CtBiScannerGenerator extends AbstractManualProcessor { private static final String TARGET_BISCANNER_PACKAGE = "spoon.reflect.visitor"; private static final String GENERATING_BISCANNER_PACKAGE = "spoon.generating.scanner"; diff --git a/src/test/java/spoon/generating/MetamodelGenerator.java b/src/test/java/spoon/generating/MetamodelGenerator.java index 9dade1d547c..8acee34193a 100644 --- a/src/test/java/spoon/generating/MetamodelGenerator.java +++ b/src/test/java/spoon/generating/MetamodelGenerator.java @@ -1,121 +1,119 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.generating; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.text.StrSubstitutor; - -import spoon.SpoonException; -import spoon.metamodel.ConceptKind; -import spoon.metamodel.Metamodel; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.factory.Factory; -import spoon.reflect.path.CtRole; -import spoon.reflect.visitor.CtScanner; - -public class MetamodelGenerator { - - private MetamodelGenerator() { - } - - public static void main(String[] args) { - Metamodel mm = Metamodel.getInstance(); - Factory factory = mm.getConcepts().iterator().next().getMetamodelInterface().getFactory(); - factory.getEnvironment().useTabulations(true); - StringBuilder sb = new StringBuilder(); - for (spoon.metamodel.MetamodelConcept type : mm.getConcepts()) { - if (type.getKind() == ConceptKind.LEAF) { - sb.append(printType(factory, type)); - } - } - System.out.println(sb.toString()); - } - - private static String printType(Factory factory, spoon.metamodel.MetamodelConcept type) { - Map valuesMap = new HashMap<>(); - valuesMap.put("typeName", type.getName()); - valuesMap.put("ifaceName", type.getMetamodelInterface().getQualifiedName()); - valuesMap.put("implName", type.getImplementationClass().getQualifiedName()); - valuesMap.put("fields", printFields(factory, type)); - - StrSubstitutor strSubst = new StrSubstitutor(valuesMap); - return strSubst.replace( - "types.add(new Type(\"${typeName}\", ${ifaceName}.class, ${implName}.class, fm -> fm\n" - + "${fields}\n" - + "));\n\n"); - } - - private static String printFields(Factory factory, spoon.metamodel.MetamodelConcept type) { - Map allFields = new LinkedHashMap<>(type.getRoleToProperty()); - List rolesByScanner = getRoleScanningOrderOfType(factory, (Class) type.getMetamodelInterface().getActualClass()); - List elementFields = new ArrayList<>(); - for (CtRole ctRole : rolesByScanner) { - spoon.metamodel.MetamodelProperty field = allFields.remove(ctRole); - elementFields.add(printField(field)); - } - //generate remaining primitive fields, sorted by Enum#ordinal of CtRole - just to have a stable order - List primitiveFields = new ArrayList<>(); - new ArrayList(allFields.keySet()).stream().sorted().forEach(role -> { - spoon.metamodel.MetamodelProperty field = allFields.remove(role); - primitiveFields.add(printField(field)); - }); - if (allFields.isEmpty() == false) { - throw new SpoonException("There remained some fields?"); - } - StringBuilder sb = new StringBuilder(); - primitiveFields.addAll(elementFields); - primitiveFields.forEach(s -> sb.append(s).append('\n')); - return sb.toString(); - } - - private static String printField(spoon.metamodel.MetamodelProperty field) { - Map valuesMap = new HashMap<>(); - valuesMap.put("role", field.getRole().name()); - valuesMap.put("derived", String.valueOf(field.isDerived())); - valuesMap.put("unsetable", String.valueOf(field.isUnsettable())); - - StrSubstitutor strSubst = new StrSubstitutor(valuesMap); - return strSubst.replace("\t.field(CtRole.${role}, ${derived}, ${unsetable})"); - } - - private static List getRoleScanningOrderOfType(Factory factory, Class iface) { - List roles = new ArrayList<>(); - //generate fields in the same order like they are visited in CtScanner - CtElement ele = factory.Core().create(iface); - ele.accept(new CtScanner() { - @Override - public void scan(CtRole role, CtElement element) { - roles.add(role); - } - @Override - public void scan(CtRole role, Collection elements) { - roles.add(role); - } - @Override - public void scan(CtRole role, Map elements) { - roles.add(role); - } - }); - return roles; - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.generating; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.text.StrSubstitutor; +import spoon.SpoonException; +import spoon.metamodel.ConceptKind; +import spoon.metamodel.Metamodel; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.factory.Factory; +import spoon.reflect.path.CtRole; +import spoon.reflect.visitor.CtScanner; + +public class MetamodelGenerator { + + private MetamodelGenerator() { + } + + public static void main(String[] args) { + Metamodel mm = Metamodel.getInstance(); + Factory factory = mm.getConcepts().iterator().next().getMetamodelInterface().getFactory(); + factory.getEnvironment().useTabulations(true); + StringBuilder sb = new StringBuilder(); + for (spoon.metamodel.MetamodelConcept type : mm.getConcepts()) { + if (type.getKind() == ConceptKind.LEAF) { + sb.append(printType(factory, type)); + } + } + System.out.println(sb.toString()); + } + + private static String printType(Factory factory, spoon.metamodel.MetamodelConcept type) { + Map valuesMap = new HashMap<>(); + valuesMap.put("typeName", type.getName()); + valuesMap.put("ifaceName", type.getMetamodelInterface().getQualifiedName()); + valuesMap.put("implName", type.getImplementationClass().getQualifiedName()); + valuesMap.put("fields", printFields(factory, type)); + + StrSubstitutor strSubst = new StrSubstitutor(valuesMap); + return strSubst.replace( + "types.add(new Type(\"${typeName}\", ${ifaceName}.class, ${implName}.class, fm -> fm\n" + + "${fields}\n" + + "));\n\n"); + } + + private static String printFields(Factory factory, spoon.metamodel.MetamodelConcept type) { + Map allFields = new LinkedHashMap<>(type.getRoleToProperty()); + List rolesByScanner = getRoleScanningOrderOfType(factory, (Class) type.getMetamodelInterface().getActualClass()); + List elementFields = new ArrayList<>(); + for (CtRole ctRole : rolesByScanner) { + spoon.metamodel.MetamodelProperty field = allFields.remove(ctRole); + elementFields.add(printField(field)); + } + //generate remaining primitive fields, sorted by Enum#ordinal of CtRole - just to have a stable order + List primitiveFields = new ArrayList<>(); + new ArrayList(allFields.keySet()).stream().sorted().forEach(role -> { + spoon.metamodel.MetamodelProperty field = allFields.remove(role); + primitiveFields.add(printField(field)); + }); + if (allFields.isEmpty() == false) { + throw new SpoonException("There remained some fields?"); + } + StringBuilder sb = new StringBuilder(); + primitiveFields.addAll(elementFields); + primitiveFields.forEach(s -> sb.append(s).append('\n')); + return sb.toString(); + } + + private static String printField(spoon.metamodel.MetamodelProperty field) { + Map valuesMap = new HashMap<>(); + valuesMap.put("role", field.getRole().name()); + valuesMap.put("derived", String.valueOf(field.isDerived())); + valuesMap.put("unsetable", String.valueOf(field.isUnsettable())); + + StrSubstitutor strSubst = new StrSubstitutor(valuesMap); + return strSubst.replace("\t.field(CtRole.${role}, ${derived}, ${unsetable})"); + } + + private static List getRoleScanningOrderOfType(Factory factory, Class iface) { + List roles = new ArrayList<>(); + //generate fields in the same order like they are visited in CtScanner + CtElement ele = factory.Core().create(iface); + ele.accept(new CtScanner() { + @Override + public void scan(CtRole role, CtElement element) { + roles.add(role); + } + @Override + public void scan(CtRole role, Collection elements) { + roles.add(role); + } + @Override + public void scan(CtRole role, Map elements) { + roles.add(role); + } + }); + return roles; + } +} diff --git a/src/test/java/spoon/generating/ReplacementVisitorGenerator.java b/src/test/java/spoon/generating/ReplacementVisitorGenerator.java index 49764c6d65e..3becd8d0d9d 100644 --- a/src/test/java/spoon/generating/ReplacementVisitorGenerator.java +++ b/src/test/java/spoon/generating/ReplacementVisitorGenerator.java @@ -7,6 +7,7 @@ */ package spoon.generating; +import java.util.List; import spoon.generating.replace.ReplaceScanner; import spoon.processing.AbstractProcessor; import spoon.reflect.declaration.CtClass; @@ -17,8 +18,6 @@ import spoon.reflect.visitor.CtScanner; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.List; - import static spoon.generating.replace.ReplaceScanner.GENERATING_REPLACE_VISITOR; import static spoon.generating.replace.ReplaceScanner.TARGET_REPLACE_PACKAGE; diff --git a/src/test/java/spoon/generating/RoleHandlersGenerator.java b/src/test/java/spoon/generating/RoleHandlersGenerator.java index 0eed6547145..dc86948973c 100644 --- a/src/test/java/spoon/generating/RoleHandlersGenerator.java +++ b/src/test/java/spoon/generating/RoleHandlersGenerator.java @@ -26,12 +26,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import spoon.SpoonException; import spoon.metamodel.MMMethod; import spoon.metamodel.MMMethodKind; -import spoon.metamodel.MetamodelProperty; import spoon.metamodel.Metamodel; +import spoon.metamodel.MetamodelProperty; import spoon.processing.AbstractManualProcessor; import spoon.reflect.code.CtNewArray; import spoon.reflect.declaration.CtClass; diff --git a/src/test/java/spoon/generating/jdt/ModifierConstantsCollector.java b/src/test/java/spoon/generating/jdt/ModifierConstantsCollector.java index 34bc23bcca3..38f8574762d 100644 --- a/src/test/java/spoon/generating/jdt/ModifierConstantsCollector.java +++ b/src/test/java/spoon/generating/jdt/ModifierConstantsCollector.java @@ -1,8 +1,5 @@ package spoon.generating.jdt; -import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; -import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; - import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Field; @@ -21,6 +18,8 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; +import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; /** * A helper class that lets you generate a markdown file with all Acc* diff --git a/src/test/java/spoon/generating/meta/RoleHandlerTemplate.java b/src/test/java/spoon/generating/meta/RoleHandlerTemplate.java index d56e72f1c56..306d970e0fa 100644 --- a/src/test/java/spoon/generating/meta/RoleHandlerTemplate.java +++ b/src/test/java/spoon/generating/meta/RoleHandlerTemplate.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import spoon.reflect.meta.ContainerKind; import spoon.reflect.meta.RoleHandler; import spoon.reflect.path.CtRole; diff --git a/src/test/java/spoon/generating/replace/ReplaceScanner.java b/src/test/java/spoon/generating/replace/ReplaceScanner.java index f575ea72ca3..e6d3b277949 100644 --- a/src/test/java/spoon/generating/replace/ReplaceScanner.java +++ b/src/test/java/spoon/generating/replace/ReplaceScanner.java @@ -7,6 +7,14 @@ */ package spoon.generating.replace; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import spoon.Launcher; import spoon.SpoonException; import spoon.generating.ReplacementVisitorGenerator; @@ -33,17 +41,8 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtScanner; import spoon.reflect.visitor.filter.TypeFilter; -import spoon.support.util.internal.ElementNameMap; import spoon.support.util.ModelList; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import spoon.support.util.internal.ElementNameMap; public class ReplaceScanner extends CtScanner { public static final String TARGET_REPLACE_PACKAGE = "spoon.support.visitor.replace"; @@ -100,7 +99,7 @@ public void visitCtMethod(CtMethod element) { } private static Set modelCollectionTypes = new HashSet<>(Arrays.asList(ModelList.class.getName(), ElementNameMap.class.getName())); - + private CtInvocation createInvocation(Factory factory, CtMethod candidate, List> invArgs, CtInvocation getter, Class getterTypeClass) { CtInvocation invocation; Type type; @@ -179,10 +178,10 @@ private CtClass createListenerClass(Factory factory, String listenerName, CtT CtClass listener; // prototype class to use, we'll change its name and code later listener = Launcher.parseClass("static class XXX implements ReplaceListener { \n" - + "private final CtElement element XXX(CtElement element) { this.element = element; }\n" - + "@java.lang.Override public void set(CtElement replace) {}\n" - + "}"); - + + "private final CtElement element XXX(CtElement element) { this.element = element; }\n" + + "@java.lang.Override public void set(CtElement replace) {}\n" + + "}"); + listener.setSimpleName(listenerName); target.addNestedType(listener); final List> references = listener.getElements(new TypeFilter>(CtTypeReference.class) { diff --git a/src/test/java/spoon/generating/replace/ReplacementVisitor.java b/src/test/java/spoon/generating/replace/ReplacementVisitor.java index 67a93a2f87d..898d39cec26 100644 --- a/src/test/java/spoon/generating/replace/ReplacementVisitor.java +++ b/src/test/java/spoon/generating/replace/ReplacementVisitor.java @@ -7,14 +7,6 @@ */ package spoon.generating.replace; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.visitor.CtScanner; -import spoon.support.visitor.replace.InvalidReplaceException; -import spoon.support.visitor.replace.ReplaceListListener; -import spoon.support.visitor.replace.ReplaceListener; -import spoon.support.visitor.replace.ReplaceMapListener; -import spoon.support.visitor.replace.ReplaceSetListener; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -22,6 +14,13 @@ import java.util.List; import java.util.Map; import java.util.Set; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.visitor.CtScanner; +import spoon.support.visitor.replace.InvalidReplaceException; +import spoon.support.visitor.replace.ReplaceListListener; +import spoon.support.visitor.replace.ReplaceListener; +import spoon.support.visitor.replace.ReplaceMapListener; +import spoon.support.visitor.replace.ReplaceSetListener; /** * Used to replace an element by another one. diff --git a/src/test/java/spoon/generating/scanner/CtBiScannerTemplate.java b/src/test/java/spoon/generating/scanner/CtBiScannerTemplate.java index 2ebcc5681aa..4fdf874f01e 100644 --- a/src/test/java/spoon/generating/scanner/CtBiScannerTemplate.java +++ b/src/test/java/spoon/generating/scanner/CtBiScannerTemplate.java @@ -7,14 +7,13 @@ */ package spoon.generating.scanner; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.path.CtRole; -import spoon.reflect.visitor.CtAbstractBiScanner; - import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; import java.util.Iterator; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.path.CtRole; +import spoon.reflect.visitor.CtAbstractBiScanner; /** * This visitor implements a deep-search scan on the model for 2 elements. diff --git a/src/test/java/spoon/generating/scanner/PeekElementTemplate.java b/src/test/java/spoon/generating/scanner/PeekElementTemplate.java index 86649b797bc..c6523d062b5 100644 --- a/src/test/java/spoon/generating/scanner/PeekElementTemplate.java +++ b/src/test/java/spoon/generating/scanner/PeekElementTemplate.java @@ -7,9 +7,8 @@ */ package spoon.generating.scanner; -import spoon.reflect.declaration.CtElement; - import java.util.Deque; +import spoon.reflect.declaration.CtElement; class PeekElementTemplate { Deque stack; diff --git a/src/test/java/spoon/javadoc/internal/JavadocInlineTagTest.java b/src/test/java/spoon/javadoc/internal/JavadocInlineTagTest.java index 9cb5e853c74..083b2a2536b 100644 --- a/src/test/java/spoon/javadoc/internal/JavadocInlineTagTest.java +++ b/src/test/java/spoon/javadoc/internal/JavadocInlineTagTest.java @@ -1,7 +1,5 @@ package spoon.javadoc.internal; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; @@ -9,55 +7,57 @@ import org.junit.jupiter.params.provider.MethodSource; import spoon.javadoc.internal.JavadocInlineTag.Type; +import static org.junit.jupiter.api.Assertions.assertEquals; + class JavadocInlineTagTest { - @ParameterizedTest - @MethodSource("tagNameArgumentProvider") - void testTagNameTypeParsing(String tagName, Type expectedType) { - // contract: javadoc tag names should parse to their corresponding spoon type - JavadocInlineTag element = (JavadocInlineTag) JavadocInlineTag.fromText("{@" + tagName + "}"); - Type actualType = element.getType(); - - assertEquals(tagName, element.getName()); - assertEquals(expectedType, actualType); - } - - @ParameterizedTest - @MethodSource("tagNameArgumentProvider") - void testTagNameCaseInsensitiveTypeParsing(String originalTagName, Type expectedType) { - // contract: javadoc tag names parsing should not depend on the case of the tag - String tagName = scrambleCase(originalTagName); - - JavadocInlineTag element = (JavadocInlineTag) JavadocInlineTag.fromText("{@" + tagName + "}"); - Type actualType = element.getType(); - - assertEquals(tagName, element.getName()); - assertEquals(expectedType, actualType); - } - - public static Stream tagNameArgumentProvider() { - return Stream.of( - Arguments.of("code", Type.CODE), - Arguments.of("docRoot", Type.DOC_ROOT), - Arguments.of("inheritDoc", Type.INHERIT_DOC), - Arguments.of("link", Type.LINK), - Arguments.of("linkplain", Type.LINKPLAIN), - Arguments.of("literal", Type.LITERAL), - Arguments.of("value", Type.VALUE), - Arguments.of("foobar", Type.UNKNOWN) - ); - } - - private String scrambleCase(String input) { - StringBuilder scrambledCaseBuilder = new StringBuilder(); - for (char c : input.toCharArray()) { - if (ThreadLocalRandom.current().nextBoolean()) { - scrambledCaseBuilder.append(Character.toUpperCase(c)); - } else { - scrambledCaseBuilder.append(c); - } - } - - return scrambledCaseBuilder.toString(); - } +@ParameterizedTest +@MethodSource("tagNameArgumentProvider") +void testTagNameTypeParsing(String tagName, Type expectedType) { + // contract: javadoc tag names should parse to their corresponding spoon type + JavadocInlineTag element = (JavadocInlineTag) JavadocInlineTag.fromText("{@" + tagName + "}"); + Type actualType = element.getType(); + + assertEquals(tagName, element.getName()); + assertEquals(expectedType, actualType); +} + +@ParameterizedTest +@MethodSource("tagNameArgumentProvider") +void testTagNameCaseInsensitiveTypeParsing(String originalTagName, Type expectedType) { + // contract: javadoc tag names parsing should not depend on the case of the tag + String tagName = scrambleCase(originalTagName); + + JavadocInlineTag element = (JavadocInlineTag) JavadocInlineTag.fromText("{@" + tagName + "}"); + Type actualType = element.getType(); + + assertEquals(tagName, element.getName()); + assertEquals(expectedType, actualType); +} + +public static Stream tagNameArgumentProvider() { + return Stream.of( + Arguments.of("code", Type.CODE), + Arguments.of("docRoot", Type.DOC_ROOT), + Arguments.of("inheritDoc", Type.INHERIT_DOC), + Arguments.of("link", Type.LINK), + Arguments.of("linkplain", Type.LINKPLAIN), + Arguments.of("literal", Type.LITERAL), + Arguments.of("value", Type.VALUE), + Arguments.of("foobar", Type.UNKNOWN) + ); +} + +private String scrambleCase(String input) { + StringBuilder scrambledCaseBuilder = new StringBuilder(); + for (char c : input.toCharArray()) { + if (ThreadLocalRandom.current().nextBoolean()) { + scrambledCaseBuilder.append(Character.toUpperCase(c)); + } else { + scrambledCaseBuilder.append(c); + } + } + + return scrambledCaseBuilder.toString(); +} } diff --git a/src/test/java/spoon/processing/CtGenerationTest.java b/src/test/java/spoon/processing/CtGenerationTest.java index 9b14c8b4cd0..ae81bb7b7c1 100644 --- a/src/test/java/spoon/processing/CtGenerationTest.java +++ b/src/test/java/spoon/processing/CtGenerationTest.java @@ -7,6 +7,15 @@ */ package spoon.processing; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -27,16 +36,6 @@ import spoon.reflect.visitor.PrettyPrinter; import spoon.reflect.visitor.PrinterHelper; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.function.Supplier; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Stream; - import static spoon.testing.Assert.assertThat; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/processing/ProcessingTest.java b/src/test/java/spoon/processing/ProcessingTest.java index 159120db15c..3f83b0c8813 100644 --- a/src/test/java/spoon/processing/ProcessingTest.java +++ b/src/test/java/spoon/processing/ProcessingTest.java @@ -16,6 +16,10 @@ */ package spoon.processing; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import spoon.Launcher; @@ -29,11 +33,6 @@ import spoon.test.processing.processors.MyProcessor; import spoon.test.template.testclasses.AssertToIfAssertedStatementTemplate; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -76,7 +75,7 @@ public void testRuntimeProcessorManager() { launcher2.buildModel(); // we only the API of interface ProcessingManager - ProcessingManager processing = new RuntimeProcessingManager(launcher2.getFactory()); + ProcessingManager processing = new RuntimeProcessingManager(launcher2.getFactory()); for (CtType processor: launcher.getModel().getAllTypes()) { if (processor.getSimpleName().equals("MyProcessor")) { continue; @@ -129,7 +128,7 @@ public void testNullPointerException() throws IOException { l.setSourceOutputDirectory(path.toFile()); l.run(); } - + @Test public void testTemplateNotInOutput() throws IOException { // https://github.com/INRIA/spoon/issues/2987 @@ -141,16 +140,16 @@ public void process(CtAssert element) { ); } } - + String templatePath = "src/test/java/spoon/test/template/testclasses/AssertToIfAssertedStatementTemplate.java"; String resourcePath = "src/test/resources/spoon/test/template/"; - + final Launcher l = new Launcher(); Path outputPath = Files.createTempDirectory("emptydir"); - + l.addProcessor(new AssertProcessor()); l.addTemplateResource(new FileSystemFile(templatePath)); - + l.addInputResource(resourcePath + "SimpleAssert.java"); l.setSourceOutputDirectory(outputPath.toFile()); l.run(); diff --git a/src/test/java/spoon/reflect/ast/AstCheckerTest.java b/src/test/java/spoon/reflect/ast/AstCheckerTest.java index 330fc13cb3d..9a2e53e0bc3 100644 --- a/src/test/java/spoon/reflect/ast/AstCheckerTest.java +++ b/src/test/java/spoon/reflect/ast/AstCheckerTest.java @@ -16,13 +16,15 @@ */ package spoon.reflect.ast; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import spoon.Launcher; -import spoon.reflect.code.CtStatement; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.visitor.ModelConsistencyCheckerTestHelper; -import spoon.support.modelobs.FineModelChangeListener; import spoon.reflect.CtModel; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtBlock; @@ -32,29 +34,26 @@ import spoon.reflect.code.CtIf; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtReturn; +import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtThrow; +import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtScanner; +import spoon.reflect.visitor.ModelConsistencyCheckerTestHelper; import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; import spoon.support.comparator.CtLineElementComparator; -import spoon.support.util.internal.ElementNameMap; +import spoon.support.modelobs.FineModelChangeListener; import spoon.support.util.ModelList; +import spoon.support.util.internal.ElementNameMap; import spoon.testing.utils.ModelTest; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/reflect/ast/CloneTest.java b/src/test/java/spoon/reflect/ast/CloneTest.java index 2117c6dec35..892e0a10f46 100644 --- a/src/test/java/spoon/reflect/ast/CloneTest.java +++ b/src/test/java/spoon/reflect/ast/CloneTest.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.processing.AbstractProcessor; diff --git a/src/test/java/spoon/reflect/declaration/CtTypeInformationTest.java b/src/test/java/spoon/reflect/declaration/CtTypeInformationTest.java index ef3fa6f945a..63f812e3795 100644 --- a/src/test/java/spoon/reflect/declaration/CtTypeInformationTest.java +++ b/src/test/java/spoon/reflect/declaration/CtTypeInformationTest.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.RandomAccess; import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/spoon/reflect/factory/GenerateParentlessPackageTest.java b/src/test/java/spoon/reflect/factory/GenerateParentlessPackageTest.java index adcbe6f0464..b27a596e232 100644 --- a/src/test/java/spoon/reflect/factory/GenerateParentlessPackageTest.java +++ b/src/test/java/spoon/reflect/factory/GenerateParentlessPackageTest.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtPackage; @@ -17,28 +16,28 @@ */ public class GenerateParentlessPackageTest { - @Test - public void generateParentlessPackage() { - final Path tempDir; - - try { - tempDir = Files.createTempDirectory("spoon"); - } catch (final IOException e) { - fail("Could not generate temporary directory: " + e.getMessage()); - return; - } - - final Launcher launcher = new Launcher(); - launcher.addInputResource(tempDir.toFile().getAbsolutePath()); - launcher.setSourceOutputDirectory(tempDir.toFile().getAbsolutePath()); - launcher.getEnvironment().setAutoImports(true); - launcher.buildModel(); - - final Factory factory = launcher.getFactory(); - - //contract: a package without a parent can be created - final CtPackage ctPackage = factory.createPackage(null, "fooBar"); - assertNotNull(ctPackage); - } + @Test + public void generateParentlessPackage() { + final Path tempDir; + + try { + tempDir = Files.createTempDirectory("spoon"); + } catch (final IOException e) { + fail("Could not generate temporary directory: " + e.getMessage()); + return; + } + + final Launcher launcher = new Launcher(); + launcher.addInputResource(tempDir.toFile().getAbsolutePath()); + launcher.setSourceOutputDirectory(tempDir.toFile().getAbsolutePath()); + launcher.getEnvironment().setAutoImports(true); + launcher.buildModel(); + + final Factory factory = launcher.getFactory(); + + //contract: a package without a parent can be created + final CtPackage ctPackage = factory.createPackage(null, "fooBar"); + assertNotNull(ctPackage); + } } diff --git a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java index f5f663e21cd..0f339fd6920 100644 --- a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java +++ b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java @@ -1,15 +1,16 @@ package spoon.reflect.factory; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.sameInstance; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtPackage; import spoon.testing.utils.GitHubIssue; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.sameInstance; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; + class PackageFactoryTest { @Test @@ -31,7 +32,7 @@ void getOrCreate_returnsNestedPackageStructure_whenQualifiedNameRepeatsSimpleNam assertThat(topLevelPackage.getPackage(topLevelPackageName), sameInstance(packageWithDuplicatedSimpleNames)); assertThat(packageWithDuplicatedSimpleNames.getParent(), sameInstance(topLevelPackage)); } - + @Test @GitHubIssue(issueNumber = 5140, fixed = true) void testGetPackageWithNameContainingDollarSign() { @@ -47,4 +48,4 @@ void testGetPackageWithNameContainingDollarSign() { assertNotNull(ctPackage); assertEquals(packageName, ctPackage.getQualifiedName()); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/reflect/reference/CtTypeReferenceTest.java b/src/test/java/spoon/reflect/reference/CtTypeReferenceTest.java index dac75f3b00b..9e1cb1a2298 100644 --- a/src/test/java/spoon/reflect/reference/CtTypeReferenceTest.java +++ b/src/test/java/spoon/reflect/reference/CtTypeReferenceTest.java @@ -1,13 +1,15 @@ package spoon.reflect.reference; +import java.util.function.Function; +import java.util.function.Supplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.Mock; import org.mockito.stubbing.Answer; import spoon.Launcher; import spoon.compiler.Environment; @@ -21,9 +23,6 @@ import spoon.support.reflect.reference.CtTypeReferenceImpl; import spoon.testing.utils.GitHubIssue; -import java.util.function.Function; -import java.util.function.Supplier; - import static com.google.common.primitives.Primitives.allPrimitiveTypes; import static com.google.common.primitives.Primitives.wrap; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -32,183 +31,183 @@ @ExtendWith(MockitoExtension.class) public class CtTypeReferenceTest { - private final TypeFactory typeFactory = new TypeFactory(); - - @Mock private Factory factory; - @Mock private Environment environment; - @Mock private FineModelChangeListener listener; - @Mock private ClassLoader classLoader; - - @BeforeEach public void setUp() { - Mockito.lenient().when(factory.Type()).thenReturn(typeFactory); - Mockito.lenient().when(factory.getEnvironment()).thenReturn(environment); - Mockito.lenient().when(environment.getModelChangeListener()).thenReturn(listener); - Mockito.lenient().when(environment.getInputClassLoader()).thenReturn(classLoader); - } - - /** - * If this represents a wrapped type, returns a {@link CtTypeReference} for the unwrapped type, - * or return this in other cases. - */ - @Test public void unbox() throws ClassNotFoundException { - testBoxingFunction(CtTypeReferenceImpl::new, false); - } - - /** - * If this represents an unwrapped type, returns a {@link CtTypeReference} for the wrapped type, - * or return this in other cases. - */ - @Test public void box() throws ClassNotFoundException { - testBoxingFunction(CtTypeReferenceImpl::new, true); - } - - private void testBoxingFunction(Supplier> supplier, boolean box) throws ClassNotFoundException { - Function, CtTypeReference> boxingFunction = box ? - CtTypeReference::box : - CtTypeReference::unbox; - for (Class primitiveType : allPrimitiveTypes()) { - //contract: box(Primitive) -> Boxed, unbox(Primitive) -> Primitive - testBoxingFunction(supplier, primitiveType, box ? wrap(primitiveType) : primitiveType, false, - boxingFunction); - //contract: box(Boxed) -> Boxed, unbox(Boxed) -> Primitive - testBoxingFunction(supplier, wrap(primitiveType), box ? wrap(primitiveType) : primitiveType, true, - boxingFunction); - } - //contract: box(Object) -> Object, unbox(Object) -> object - testBoxingFunction(supplier, String.class, String.class, false, boxingFunction); - } - - private void testBoxingFunction(Supplier> supplier, Class inputClass, - Class expectedClass, boolean mockClassLoader, - Function, CtTypeReference> boxingFunction) - throws ClassNotFoundException { - CtTypeReference reference = supplier.get(); - reference.setFactory(factory); - reference.setSimpleName(inputClass.getName()); - if (mockClassLoader) { - Mockito.lenient().when(classLoader.loadClass(inputClass.getName())) - .thenAnswer((Answer) invocationOnMock -> inputClass); - } - - CtTypeReference result = boxingFunction.apply(reference); - - //contract: boxing/unboxing do not yield null - assertNotNull(result); - - //contract: box/unbox returns a reference toward the expected type - assertEquals(expectedClass.getName(), result.getQualifiedName()); - } - - @ParameterizedTest - @CsvSource(value = { - "byte, 2, byte[][]", - "byte, 3, byte[][][]", - "java.lang.String, 3, String[][][]", - "char, 1, char[]", - "boolean, 1, boolean[]", - "byte, 1, byte[]", - "short, 1, short[]", - "int, 1, int[]", - "long, 1, long[]", - "float, 1, float[]", - "double, 1, double[]", - }) - void testGetActualClassForArray(String className, int arrayDepth, String expected) { - // contract: "getActualClass" should return proper classes for multi-dimensional arrays - Factory factory = new Launcher().getFactory(); - CtArrayTypeReference reference = factory.createArrayReference( - factory.createReference(className), - arrayDepth - ); - assertEquals( - expected, - reference.getActualClass().getSimpleName() - ); - } - - @Test - void testImplicitInnerClassIsNotQualified() { - // contract: If the source code contains no explicit outer class reference, so does the model - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(17); - launcher.getEnvironment().setAutoImports(true); - launcher.getEnvironment().setShouldCompile(true); - launcher.addInputResource(new VirtualFile( - "class TestInnerClass {\n" + - " static class A { static class B {} }\n" + - "\n" + - " A a = new A();\n" + - " A.B b = new A.B();\n" + - "}\n" - )); - - CtType innerClass = launcher.buildModel().getAllTypes().iterator().next(); - CtField a = innerClass.getField("a"); - assertEquals("A a = new A();", a.toString()); - assertTrue(a.getType().getDeclaringType().isImplicit(), "Declaring access should be implicit"); - - CtField b = innerClass.getField("b"); - assertEquals("A.B b = new A.B();", b.toString()); - assertTrue( - b.getType().getDeclaringType().getDeclaringType().isImplicit(), - "Declaring access should be implicit" - ); - } - - @Test - void testAliasAccessedClassIsNotQualified() { - // contract: If the source code contains no explicit outer class reference, so does the model - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(17); - launcher.getEnvironment().setAutoImports(true); - launcher.getEnvironment().setShouldCompile(true); - launcher.addInputResource(new VirtualFile( - "class TestInnerClass {\n" + - " static class A { static class B {} }\n" + - "}\n", - "TestInnerClass.java" - )); - launcher.addInputResource(new VirtualFile( - "class Inheritor extends TestInnerClass.A {\n" + - " public void foo(B b) {}\n" + - "}\n", - "Inheritor.java" - )); - - launcher.buildModel(); - CtType inheritor = launcher.getFactory().Type().get("Inheritor"); - CtParameter fooParam = inheritor.getMethodsByName("foo").get(0).getParameters().get(0); - - // Not qualified - assertEquals("B b", fooParam.toString()); - } - - @Test - @GitHubIssue(issueNumber = -1, fixed = false) - void testAliasAccessedClassIsNotQualified2() { - // contract: If the source code contains no explicit outer class reference, so does the model - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(17); - launcher.getEnvironment().setAutoImports(true); - launcher.getEnvironment().setShouldCompile(true); - launcher.addInputResource(new VirtualFile( - "class TestInnerClass {\n" + - " static class A { static class B {} }\n" + - "}\n", - "TestInnerClass.java" - )); - launcher.addInputResource(new VirtualFile( - "class Inheritor extends TestInnerClass.A {\n" + - " public void foo(Inheritor.B b) {}\n" + - "}\n", - "Inheritor.java" - )); - - launcher.buildModel(); - CtType inheritor = launcher.getFactory().Type().get("Inheritor"); - CtParameter fooParam = inheritor.getMethodsByName("foo").get(0).getParameters().get(0); - - assertEquals("Inheritor.B b", fooParam.toString()); - } + private final TypeFactory typeFactory = new TypeFactory(); + + @Mock private Factory factory; + @Mock private Environment environment; + @Mock private FineModelChangeListener listener; + @Mock private ClassLoader classLoader; + + @BeforeEach public void setUp() { + Mockito.lenient().when(factory.Type()).thenReturn(typeFactory); + Mockito.lenient().when(factory.getEnvironment()).thenReturn(environment); + Mockito.lenient().when(environment.getModelChangeListener()).thenReturn(listener); + Mockito.lenient().when(environment.getInputClassLoader()).thenReturn(classLoader); + } + + /** + * If this represents a wrapped type, returns a {@link CtTypeReference} for the unwrapped type, + * or return this in other cases. + */ + @Test public void unbox() throws ClassNotFoundException { + testBoxingFunction(CtTypeReferenceImpl::new, false); + } + + /** + * If this represents an unwrapped type, returns a {@link CtTypeReference} for the wrapped type, + * or return this in other cases. + */ + @Test public void box() throws ClassNotFoundException { + testBoxingFunction(CtTypeReferenceImpl::new, true); + } + + private void testBoxingFunction(Supplier> supplier, boolean box) throws ClassNotFoundException { + Function, CtTypeReference> boxingFunction = box ? + CtTypeReference::box : + CtTypeReference::unbox; + for (Class primitiveType : allPrimitiveTypes()) { + //contract: box(Primitive) -> Boxed, unbox(Primitive) -> Primitive + testBoxingFunction(supplier, primitiveType, box ? wrap(primitiveType) : primitiveType, false, + boxingFunction); + //contract: box(Boxed) -> Boxed, unbox(Boxed) -> Primitive + testBoxingFunction(supplier, wrap(primitiveType), box ? wrap(primitiveType) : primitiveType, true, + boxingFunction); + } + //contract: box(Object) -> Object, unbox(Object) -> object + testBoxingFunction(supplier, String.class, String.class, false, boxingFunction); + } + + private void testBoxingFunction(Supplier> supplier, Class inputClass, + Class expectedClass, boolean mockClassLoader, + Function, CtTypeReference> boxingFunction) + throws ClassNotFoundException { + CtTypeReference reference = supplier.get(); + reference.setFactory(factory); + reference.setSimpleName(inputClass.getName()); + if (mockClassLoader) { + Mockito.lenient().when(classLoader.loadClass(inputClass.getName())) + .thenAnswer((Answer) invocationOnMock -> inputClass); + } + + CtTypeReference result = boxingFunction.apply(reference); + + //contract: boxing/unboxing do not yield null + assertNotNull(result); + + //contract: box/unbox returns a reference toward the expected type + assertEquals(expectedClass.getName(), result.getQualifiedName()); + } + + @ParameterizedTest + @CsvSource(value = { + "byte, 2, byte[][]", + "byte, 3, byte[][][]", + "java.lang.String, 3, String[][][]", + "char, 1, char[]", + "boolean, 1, boolean[]", + "byte, 1, byte[]", + "short, 1, short[]", + "int, 1, int[]", + "long, 1, long[]", + "float, 1, float[]", + "double, 1, double[]", + }) + void testGetActualClassForArray(String className, int arrayDepth, String expected) { + // contract: "getActualClass" should return proper classes for multi-dimensional arrays + Factory factory = new Launcher().getFactory(); + CtArrayTypeReference reference = factory.createArrayReference( + factory.createReference(className), + arrayDepth + ); + assertEquals( + expected, + reference.getActualClass().getSimpleName() + ); + } + + @Test + void testImplicitInnerClassIsNotQualified() { + // contract: If the source code contains no explicit outer class reference, so does the model + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(17); + launcher.getEnvironment().setAutoImports(true); + launcher.getEnvironment().setShouldCompile(true); + launcher.addInputResource(new VirtualFile( + "class TestInnerClass {\n" + + " static class A { static class B {} }\n" + + "\n" + + " A a = new A();\n" + + " A.B b = new A.B();\n" + + "}\n" + )); + + CtType innerClass = launcher.buildModel().getAllTypes().iterator().next(); + CtField a = innerClass.getField("a"); + assertEquals("A a = new A();", a.toString()); + assertTrue(a.getType().getDeclaringType().isImplicit(), "Declaring access should be implicit"); + + CtField b = innerClass.getField("b"); + assertEquals("A.B b = new A.B();", b.toString()); + assertTrue( + b.getType().getDeclaringType().getDeclaringType().isImplicit(), + "Declaring access should be implicit" + ); + } + + @Test + void testAliasAccessedClassIsNotQualified() { + // contract: If the source code contains no explicit outer class reference, so does the model + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(17); + launcher.getEnvironment().setAutoImports(true); + launcher.getEnvironment().setShouldCompile(true); + launcher.addInputResource(new VirtualFile( + "class TestInnerClass {\n" + + " static class A { static class B {} }\n" + + "}\n", + "TestInnerClass.java" + )); + launcher.addInputResource(new VirtualFile( + "class Inheritor extends TestInnerClass.A {\n" + + " public void foo(B b) {}\n" + + "}\n", + "Inheritor.java" + )); + + launcher.buildModel(); + CtType inheritor = launcher.getFactory().Type().get("Inheritor"); + CtParameter fooParam = inheritor.getMethodsByName("foo").get(0).getParameters().get(0); + + // Not qualified + assertEquals("B b", fooParam.toString()); + } + + @Test + @GitHubIssue(issueNumber = -1, fixed = false) + void testAliasAccessedClassIsNotQualified2() { + // contract: If the source code contains no explicit outer class reference, so does the model + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(17); + launcher.getEnvironment().setAutoImports(true); + launcher.getEnvironment().setShouldCompile(true); + launcher.addInputResource(new VirtualFile( + "class TestInnerClass {\n" + + " static class A { static class B {} }\n" + + "}\n", + "TestInnerClass.java" + )); + launcher.addInputResource(new VirtualFile( + "class Inheritor extends TestInnerClass.A {\n" + + " public void foo(Inheritor.B b) {}\n" + + "}\n", + "Inheritor.java" + )); + + launcher.buildModel(); + CtType inheritor = launcher.getFactory().Type().get("Inheritor"); + CtParameter fooParam = inheritor.getMethodsByName("foo").get(0).getParameters().get(0); + + assertEquals("Inheritor.B b", fooParam.toString()); + } } diff --git a/src/test/java/spoon/reflect/visitor/CacheBasedConflictFinderTest.java b/src/test/java/spoon/reflect/visitor/CacheBasedConflictFinderTest.java index 3ebdb7580cd..fb13140e6dc 100644 --- a/src/test/java/spoon/reflect/visitor/CacheBasedConflictFinderTest.java +++ b/src/test/java/spoon/reflect/visitor/CacheBasedConflictFinderTest.java @@ -30,46 +30,46 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class CacheBasedConflictFinderTest { - private CacheBasedConflictFinder cacheBasedConflictFinder; + private CacheBasedConflictFinder cacheBasedConflictFinder; - @BeforeAll - public void setup() { - Factory factory = new Launcher().getFactory(); - CtType type = factory.Class().get(simpleNestedClassWithFields.class); - this.cacheBasedConflictFinder = new CacheBasedConflictFinder(type); - } + @BeforeAll + public void setup() { + Factory factory = new Launcher().getFactory(); + CtType type = factory.Class().get(simpleNestedClassWithFields.class); + this.cacheBasedConflictFinder = new CacheBasedConflictFinder(type); + } - @Test - void testHasFieldConflictsWithConflictingField() { - // contract: hasFieldConflict returns true when a conflicting field name is passed as argument + @Test + void testHasFieldConflictsWithConflictingField() { + // contract: hasFieldConflict returns true when a conflicting field name is passed as argument - Boolean shouldBeTrue = cacheBasedConflictFinder.hasFieldConflict("testField"); - assertTrue(shouldBeTrue); - } + Boolean shouldBeTrue = cacheBasedConflictFinder.hasFieldConflict("testField"); + assertTrue(shouldBeTrue); + } - @Test - void testHasFieldConflictsWithNonConflictingField() { - // contract: hasFieldConflict returns false when a non-conflicting field name is passed as argument + @Test + void testHasFieldConflictsWithNonConflictingField() { + // contract: hasFieldConflict returns false when a non-conflicting field name is passed as argument - Boolean shouldBeFalse = cacheBasedConflictFinder.hasFieldConflict("testField1"); - assertFalse(shouldBeFalse); - } + Boolean shouldBeFalse = cacheBasedConflictFinder.hasFieldConflict("testField1"); + assertFalse(shouldBeFalse); + } - @Test - void testHasNestedTypeConflictsWithConflictingArgument() { - // contract: hasNestedTypeConflict returns true when a argument is passed which is name of already existing - // nested types + @Test + void testHasNestedTypeConflictsWithConflictingArgument() { + // contract: hasNestedTypeConflict returns true when a argument is passed which is name of already existing + // nested types - Boolean shouldBeTrue = cacheBasedConflictFinder.hasNestedTypeConflict("subClass"); - assertTrue(shouldBeTrue); - } + Boolean shouldBeTrue = cacheBasedConflictFinder.hasNestedTypeConflict("subClass"); + assertTrue(shouldBeTrue); + } - @Test - void testHasNestedTypeConflictsWithNonConflictingArgument() { - // contract: hasNestedTypeConflict returns false when a argument is passed which isn't name of an already - // existing nested type + @Test + void testHasNestedTypeConflictsWithNonConflictingArgument() { + // contract: hasNestedTypeConflict returns false when a argument is passed which isn't name of an already + // existing nested type - Boolean shouldBeFalse = cacheBasedConflictFinder.hasNestedTypeConflict("subClass1"); - assertFalse(shouldBeFalse); - } -} \ No newline at end of file + Boolean shouldBeFalse = cacheBasedConflictFinder.hasNestedTypeConflict("subClass1"); + assertFalse(shouldBeFalse); + } +} diff --git a/src/test/java/spoon/reflect/visitor/CtBFSIteratorTest.java b/src/test/java/spoon/reflect/visitor/CtBFSIteratorTest.java index 2542baf7877..6e810c75c94 100644 --- a/src/test/java/spoon/reflect/visitor/CtBFSIteratorTest.java +++ b/src/test/java/spoon/reflect/visitor/CtBFSIteratorTest.java @@ -5,7 +5,6 @@ import java.util.Iterator; import java.util.List; import java.util.Queue; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtElement; diff --git a/src/test/java/spoon/reflect/visitor/CtInheritanceScannerTest.java b/src/test/java/spoon/reflect/visitor/CtInheritanceScannerTest.java index b9445b82271..862e7698003 100644 --- a/src/test/java/spoon/reflect/visitor/CtInheritanceScannerTest.java +++ b/src/test/java/spoon/reflect/visitor/CtInheritanceScannerTest.java @@ -16,18 +16,17 @@ */ package spoon.reflect.visitor; -import org.junit.jupiter.api.DynamicTest; -import org.junit.jupiter.api.TestFactory; -import org.mockito.Mockito; -import spoon.reflect.factory.CoreFactory; -import spoon.reflect.factory.Factory; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.mockito.Mockito; +import spoon.reflect.factory.CoreFactory; +import spoon.reflect.factory.Factory; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; diff --git a/src/test/java/spoon/reflect/visitor/CtIteratorTest.java b/src/test/java/spoon/reflect/visitor/CtIteratorTest.java index 439f8fe3cdf..7de68b2be06 100644 --- a/src/test/java/spoon/reflect/visitor/CtIteratorTest.java +++ b/src/test/java/spoon/reflect/visitor/CtIteratorTest.java @@ -19,7 +19,6 @@ import java.util.ArrayDeque; import java.util.Deque; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtElement; diff --git a/src/test/java/spoon/reflect/visitor/CtScannerTest.java b/src/test/java/spoon/reflect/visitor/CtScannerTest.java index d05767f6465..744647b50ef 100644 --- a/src/test/java/spoon/reflect/visitor/CtScannerTest.java +++ b/src/test/java/spoon/reflect/visitor/CtScannerTest.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Set; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.metamodel.ConceptKind; @@ -258,7 +257,7 @@ public void exit(CtElement o) { super.exit(o); } }); - + //top comment of file belongs to compilation unit which is not visited by standard scanning //so count comments of these compilation units int countOfCommentsInCompilationUnits = 0; diff --git a/src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java b/src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java index 094fe84ec05..83e58364aa3 100644 --- a/src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java +++ b/src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java @@ -1,10 +1,14 @@ package spoon.reflect.visitor; +import java.io.FileNotFoundException; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; @@ -40,11 +44,6 @@ import spoon.testing.utils.GitHubIssue; import spoon.testing.utils.ModelTest; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.containsString; @@ -58,371 +57,371 @@ public class DefaultJavaPrettyPrinterTest { - @ParameterizedTest - @ValueSource(strings = { - "1 + 2 + 3", - "1 + (2 + 3)", - "1 + 2 + -3", - "1 + 2 + -(2 + 3)", - "\"Sum: \" + (1 + 2)", - "\"Sum: \" + 1 + 2", - "-(1 + 2 + 3)", - "true || true && false", - "(true || false) && false", - "1 | 2 | 3", - "1 | (2 | 3)", - "1 | 2 & 3", - "(1 | 2) & 3", - "1 | 2 ^ 3", - "(1 | 2) ^ 3", - "((int) (1 + 2)) * 3", - "(int) (int) (1 + 1)", - }) - public void testParenOptimizationCorrectlyPrintsParenthesesForExpressions(String rawExpression) { - // contract: When input expressions are minimally parenthesized, pretty-printed output - // should match the input - CtExpression expr = createLauncherWithOptimizeParenthesesPrinter() - .getFactory().createCodeSnippetExpression(rawExpression).compile(); - assertThat(expr.toString(), equalTo(rawExpression)); - } - - @ParameterizedTest - @ValueSource(strings = { - "int sum = 1 + 2 + 3", - "java.lang.String s = \"Sum: \" + (1 + 2)", - "java.lang.String s = \"Sum: \" + 1 + 2", - "java.lang.System.out.println(\"1\" + \"2\" + \"3\" + \"4\")", - "int myInt = (int) 0.0", - "int myInt = (int) (float) 0.0", - }) - public void testParenOptimizationCorrectlyPrintsParenthesesForStatements(String rawStatement) { - // contract: When input expressions as part of statements are minimally parenthesized, - // pretty-printed output should match the input - CtStatement statement = createLauncherWithOptimizeParenthesesPrinter() - .getFactory().createCodeSnippetStatement(rawStatement).compile(); - assertThat(statement.toString(), equalTo(rawStatement)); - } - - private static Launcher createLauncherWithOptimizeParenthesesPrinter() { - Launcher launcher = new Launcher(); - launcher.getEnvironment().setPrettyPrinterCreator(() -> { - DefaultJavaPrettyPrinter printer = new DefaultJavaPrettyPrinter(launcher.getEnvironment()); - printer.setMinimizeRoundBrackets(true); - return printer; - }); - return launcher; - } - - - @Test - void testAutoImportPrinterDoesNotImportFunctionalInterfaceTargetedInLambda() { - // contract: The auto-import printer should not import functional interfaces that are - // targeted in lambdas, but are not explicitly referenced anywhere - Launcher launcher = new Launcher(); - launcher.addInputResource("src/test/resources/target-functional-interface-in-lambda"); - launcher.buildModel(); - CtCompilationUnit cu = launcher.getFactory().Type().get("TargetsFunctionalInterface") - .getPosition().getCompilationUnit(); - - PrettyPrinter autoImportPrettyPrinter = launcher.getEnvironment().createPrettyPrinterAutoImport(); - String output = autoImportPrettyPrinter.prettyprint(cu); - - assertThat(output, not(containsString("import java.util.function.IntFunction;"))); - } - - @Test - void testLocalTypesPrintedWithoutLeadingDigits() { - // contract: leading digits should be stripped from simple names when printing - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(16); - launcher.addInputResource("src/test/resources/localtypes"); - launcher.buildModel(); - - CtCompilationUnit cu = launcher.getFactory().Type().get("LocalTypesHolder") - .getPosition().getCompilationUnit(); - - String output = cu.prettyprint(); - // local classes will always have a leading space, without leading digits - assertThat(output, containsString(" MyClass")); - assertThat(output, containsString(" MyEnum")); - assertThat(output, containsString(" MyInterface")); - // the code does not contain a 1, which would be the prefix of the local types' binary names - // in the given code snippet - assertThat(output, not(containsString("1"))); - } - - @Test - void testEmptyIfBlocksArePrintedWithoutError() { - // contract: empty if blocks don't crash the DJJP - Launcher launcher = new Launcher(); - var ctIf = launcher.getFactory().createIf() - .setThenStatement(launcher.getFactory().createBlock()) - .setElseStatement(launcher.getFactory().createBlock()); - assertDoesNotThrow(() -> ctIf.toString()); - } - @Test - void testEmptyIfBlocksWithCommentsArePrintedWithoutError() { - // contract: empty if blocks don't crash the DJJP - Launcher launcher = new Launcher(); - CtBlock thenBlock = launcher.getFactory().createBlock(); - CtBlock elseBlock = launcher.getFactory().createBlock(); - thenBlock.addComment(launcher.getFactory().createComment().setContent("then")); - elseBlock.addComment(launcher.getFactory().createComment().setContent("else")); - var ctIf = launcher.getFactory().createIf() - .setThenStatement(thenBlock) - .setElseStatement(elseBlock); - assertDoesNotThrow(() -> ctIf.toString()); - } - - @ParameterizedTest - @ValueSource(strings = { - "int a = (new int[10])[1];", - "java.lang.Object b = (new java.lang.Object[6])[4];", - "double c = (new double[1][1][1])[0][0][0];", - "boolean d = new boolean[]{ true, false }[0];", - "float e = (new float[3][])[0][0];", // compiles, but throws a NPE on execution - "(new byte[8])[3] = 64;", - "(new byte[8][])[3] = new byte[16];", - }) - void testPrintNewArrayWithImmediateAccess(String line) { - // contract: immediate access to a new array must be surrounded by parentheses if - // no elements are passed directly - String code = SpoonTestHelpers.wrapLocal(line); - CtModel model = SpoonTestHelpers.createModelFromString(code, 8); - CtType first = model.getAllTypes().iterator().next(); - assertThat(first.toString(), containsString(line)); - } - - @Test - @SuppressWarnings({"unchecked", "rawtypes"}) - void testPrintMethodReferenceTypeParameters() { - // contract: type parameters of method references are printed - Launcher launcher = new Launcher(); - Factory factory = launcher.getFactory(); - CtTypeReference typeReference = factory.Type().createReference("Arrays"); - CtExecutableReferenceExpression exeExpression = factory.createExecutableReferenceExpression(); - exeExpression.setExecutable(factory.createExecutableReference()); - exeExpression.getExecutable().setSimpleName("binarySearch"); - exeExpression.setTarget(factory.createTypeAccess(typeReference)); - // if no type parameters are given, no < and no > should be printed - assertThat(exeExpression.toString(), not(anyOf(containsString("<"), containsString(">")))); - - exeExpression.getExecutable().addActualTypeArgument(factory.Type().integerType()); - // with type parameters, the < and > should be printed - assertThat(exeExpression.toString(), allOf(containsString("<"), containsString(">"))); - // the type parameter should appear - assertThat(exeExpression.toString(), containsString("Integer")); - - exeExpression.getExecutable().addActualTypeArgument(factory.Type().integerType()); - // more than one parameter type should be separated (with .* to allow imports) - assertThat(exeExpression.toString(), containsRegexMatch("<(.*)Integer, (.*)Integer>")); - - // remove type arguments again, we want to try something else - exeExpression.getExecutable().setActualTypeArguments(null); - // we want to have a bit more complex type and construct a fake Comparable> - CtTypeReference complexTypeReference = factory.Type().integerType().getSuperInterfaces().stream() - .filter(t -> t.getSimpleName().equals("Comparable")) - .findAny() - .orElseThrow(); - complexTypeReference.addActualTypeArgument(complexTypeReference.clone().setSimpleName("Comhyperbola")); - exeExpression.getExecutable().addActualTypeArgument(complexTypeReference); - assertThat(exeExpression.toString(), containsRegexMatch("<(.*)Comparable<(.*)Integer, (.*)Comhyperbola<(.*)Integer>>>")); - } - - @ParameterizedTest - @ArgumentsSource(SealedTypesProvider.class) - void testPrintSealedTypes(CtType sealedType, List explicitPermitted) { - // contract: sealed types are printed correctly - String printed = sealedType.toString(); - // the sealed keyword is always required - assertThat(printed, containsString("sealed")); - if (explicitPermitted.isEmpty()) { - // the permits keyword should only exist if explicit permitted types are printed - assertThat(printed, not(containsString("permits"))); - } else { - assertThat(printed, containsString("permits")); - for (String permitted : explicitPermitted) { - assertThat(printed, containsRegexMatch("\\s" + permitted)); - } - } - } - - @Test - void testPrintNonSealedTypes() { - // contract: the non-sealed modifier is printed - Launcher launcher = new Launcher(); - CtClass ctClass = launcher.getFactory().Class().create("MyClass"); - ctClass.addModifier(ModifierKind.NON_SEALED); - assertThat(ctClass.toString(), containsString("non-sealed ")); - } - - static class SealedTypesProvider implements ArgumentsProvider { - - @Override - public Stream provideArguments(ExtensionContext extensionContext) { - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(17); - launcher.addInputResource("src/test/resources/sealedclasses"); - launcher.buildModel(); - Factory factory = launcher.getFactory(); - return Stream.of( - Arguments.of(factory.Type().get("SealedClassWithPermits"), List.of("ExtendingClass", "OtherExtendingClass")), - Arguments.of(factory.Type().get("SealedInterfaceWithPermits"), List.of("ExtendingClass", "OtherExtendingClass")), - Arguments.of(factory.Type().get("SealedClassWithNestedSubclasses"), List.of()), // implicit - Arguments.of(factory.Type().get("SealedInterfaceWithNestedSubclasses"), List.of()) // implicit - ); - } - } - - @Nested - class SquareBracketsForArrayInitialization_ArrayIsBuiltUsingFactoryMethods { - @Test - @GitHubIssue(issueNumber = 4887, fixed = true) - void bracketsShouldBeAttachedToTypeByDefault() { - // contract: the square brackets should be attached to type by default when array is built using factory methods - // arrange - Launcher launcher = new Launcher(); - Factory factory = launcher.getFactory(); - - CtArrayTypeReference arrayTypeReference = factory.createArrayTypeReference(); - arrayTypeReference.setComponentType(factory.Type().integerPrimitiveType()); - CtNewArray newArray = factory.createNewArray(); - newArray.setValueByRole(CtRole.TYPE, arrayTypeReference); - List> elements = new ArrayList<>(List.of(factory.createLiteral(3))); - newArray.setValueByRole(CtRole.EXPRESSION, elements); - CtLocalVariable localVariable = factory.createLocalVariable(arrayTypeReference, "intArray", newArray); - - // act - String actualStringRepresentation = localVariable.toString(); - - // assert - assertThat(actualStringRepresentation, equalTo("int[] intArray = new int[]{ 3 }")); - } - - @Test - void bracketsShouldBeAttachedToIdentifierIfSpecified() { - // contract: the square brackets should be attached to identifier if specified explicitly - // arrange - Launcher launcher = new Launcher(); - Factory factory = launcher.getFactory(); - - CtArrayTypeReference arrayTypeReference = factory.createArrayTypeReference(); - CtTypeReference arrayType = factory.Type().createReference(CtElement.class); - arrayTypeReference.setComponentType(arrayType); - CtNewArray newArray = factory.createNewArray(); - newArray.setValueByRole(CtRole.TYPE, arrayTypeReference); - List elements = new ArrayList<>(List.of(factory.createLiteral(1.0f))); - newArray.setValueByRole(CtRole.EXPRESSION, elements); - CtLocalVariable localVariable = factory.createLocalVariable(arrayTypeReference, "spoonElements", newArray); - - - // act - ((CtArrayTypeReferenceImpl) arrayTypeReference).setDeclarationKind(CtArrayTypeReferenceImpl.DeclarationKind.IDENTIFIER); - String actualStringRepresentation = localVariable.toString(); - - // assert - assertThat(actualStringRepresentation, - equalTo("spoon.reflect.declaration.CtElement spoonElements[] = new spoon.reflect.declaration.CtElement[]{ 1.0F }")); - } - } - - @ModelTest(value = "src/test/resources/patternmatching/InstanceofGenerics.java", complianceLevel = 16) - void testKeepGenericType(Factory factory) { - // contract: generic type parameters can appear in instanceof expressions if they are only carried over - CtType x = factory.Type().get("InstanceofGenerics"); - String printed = x.toString(); - assertThat(printed, containsString("Set")); - assertThat(printed, containsString("List list")); - assertThat(printed, containsRegexMatch("Collection<.*String>")); - assertThat(printed, containsRegexMatch("List<.*List>")); - assertThat(printed, containsRegexMatch("List<.*List<\\? extends T>>")); - assertThat(printed, containsRegexMatch("List<.*List<\\? super T>>")); - } - - @Test - @GitHubIssue(issueNumber = 4881, fixed = true) - void bracketsShouldBeMinimallyPrintedForTypeCastOnFieldRead() throws FileNotFoundException { - // contract: the brackets should be minimally printed for type cast on field read - // arrange - Launcher launcher = createLauncherWithOptimizeParenthesesPrinter(); - launcher.addInputResource("src/test/resources/printer-test/TypeCastOnFieldRead.java"); - Launcher launcherForCompilingPrettyPrintedString = createLauncherWithOptimizeParenthesesPrinter(); - - // act - CtModel model = launcher.buildModel(); - launcher.prettyprint(); - SpoonModelBuilder spoonModelBuilder = launcherForCompilingPrettyPrintedString.createCompiler(SpoonResourceHelper.resources("spooned/TypeCastOnFieldRead.java")); - - // assert - assertThat(spoonModelBuilder.build(), equalTo(true)); - - CtLocalVariable localVariable = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); - assertThat(localVariable.toString(), equalTo("int myInt = (int) myDouble")); - - CtLocalVariable localVariable2 = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(1); - assertThat(localVariable2.toString(), equalTo("int myInt2 = ((java.lang.Double) myDouble).intValue()")); - - CtLocalVariable localVariable3 = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(2); - assertThat(localVariable3.toString(), equalTo("double withoutTypeCast = myDoubleObject.doubleValue()")); - } - - @Test - void bracketsShouldBeMinimallyPrintedOnShadowedFields() throws FileNotFoundException { - // contract: the brackets should be minimally printed for type cast on shadowed field read - // arrange - Launcher launcher = createLauncherWithOptimizeParenthesesPrinter(); - launcher.addInputResource("src/test/resources/printer-test/ShadowFieldRead.java"); - Launcher launcherForCompilingPrettyPrintedString = createLauncherWithOptimizeParenthesesPrinter(); - - // act - CtModel model = launcher.buildModel(); - launcher.prettyprint(); - SpoonModelBuilder spoonModelBuilder = launcherForCompilingPrettyPrintedString.createCompiler(SpoonResourceHelper.resources("spooned/ShadowFieldRead.java", "spooned/A.java", "spooned/C.java")); - - // assert - assertThat(spoonModelBuilder.build(), equalTo(true)); - - CtLocalVariable localVariable = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(1); - assertThat(localVariable.toString(), equalTo("int fieldReadOfA = ((A) c).a.i")); - } - - @ParameterizedTest(name = "Printing literal ''{0}'' throws an error") - @ValueSource(doubles = { - Double.NEGATIVE_INFINITY, - Double.POSITIVE_INFINITY, - Double.NaN - }) - void throwsExceptionWhenPrintingInvalidFloatingLiteral(double value) { - // contract: Printing invalid floating literals throws an exception - Factory factory = new Launcher().getFactory(); - - assertThrows(SpoonException.class, () -> factory.createLiteral(value).toString()); - assertThrows(SpoonException.class, () -> factory.createLiteral((float) value).toString()); - } - - @ModelTest("src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java") - void printAnnotationsInOrphanTypeReference(Factory factory) { - // contract: Spoon should print annotations for orphaned type references - // Used by the test - java.lang.@TypeUseAnnotation String ignored; - - CtTypeReference type = factory.Type() - .get(getClass().getName()) - .getMethodsByName("printAnnotationsInOrphanTypeReference") - .get(0) - .getElements(new TypeFilter<>(CtLocalVariable.class)) - .get(0) - .getType(); - - assertEquals( - "java.lang.@spoon.reflect.visitor.DefaultJavaPrettyPrinterTest.TypeUseAnnotation String", - type.toString().replace(System.lineSeparator(), " ") - ); - } - - @Target({ElementType.TYPE_USE}) - @Retention(RetentionPolicy.SOURCE) - private @interface TypeUseAnnotation { - - } + @ParameterizedTest + @ValueSource(strings = { + "1 + 2 + 3", + "1 + (2 + 3)", + "1 + 2 + -3", + "1 + 2 + -(2 + 3)", + "\"Sum: \" + (1 + 2)", + "\"Sum: \" + 1 + 2", + "-(1 + 2 + 3)", + "true || true && false", + "(true || false) && false", + "1 | 2 | 3", + "1 | (2 | 3)", + "1 | 2 & 3", + "(1 | 2) & 3", + "1 | 2 ^ 3", + "(1 | 2) ^ 3", + "((int) (1 + 2)) * 3", + "(int) (int) (1 + 1)", + }) + public void testParenOptimizationCorrectlyPrintsParenthesesForExpressions(String rawExpression) { + // contract: When input expressions are minimally parenthesized, pretty-printed output + // should match the input + CtExpression expr = createLauncherWithOptimizeParenthesesPrinter() + .getFactory().createCodeSnippetExpression(rawExpression).compile(); + assertThat(expr.toString(), equalTo(rawExpression)); + } + + @ParameterizedTest + @ValueSource(strings = { + "int sum = 1 + 2 + 3", + "java.lang.String s = \"Sum: \" + (1 + 2)", + "java.lang.String s = \"Sum: \" + 1 + 2", + "java.lang.System.out.println(\"1\" + \"2\" + \"3\" + \"4\")", + "int myInt = (int) 0.0", + "int myInt = (int) (float) 0.0", + }) + public void testParenOptimizationCorrectlyPrintsParenthesesForStatements(String rawStatement) { + // contract: When input expressions as part of statements are minimally parenthesized, + // pretty-printed output should match the input + CtStatement statement = createLauncherWithOptimizeParenthesesPrinter() + .getFactory().createCodeSnippetStatement(rawStatement).compile(); + assertThat(statement.toString(), equalTo(rawStatement)); + } + + private static Launcher createLauncherWithOptimizeParenthesesPrinter() { + Launcher launcher = new Launcher(); + launcher.getEnvironment().setPrettyPrinterCreator(() -> { + DefaultJavaPrettyPrinter printer = new DefaultJavaPrettyPrinter(launcher.getEnvironment()); + printer.setMinimizeRoundBrackets(true); + return printer; + }); + return launcher; + } + + + @Test + void testAutoImportPrinterDoesNotImportFunctionalInterfaceTargetedInLambda() { + // contract: The auto-import printer should not import functional interfaces that are + // targeted in lambdas, but are not explicitly referenced anywhere + Launcher launcher = new Launcher(); + launcher.addInputResource("src/test/resources/target-functional-interface-in-lambda"); + launcher.buildModel(); + CtCompilationUnit cu = launcher.getFactory().Type().get("TargetsFunctionalInterface") + .getPosition().getCompilationUnit(); + + PrettyPrinter autoImportPrettyPrinter = launcher.getEnvironment().createPrettyPrinterAutoImport(); + String output = autoImportPrettyPrinter.prettyprint(cu); + + assertThat(output, not(containsString("import java.util.function.IntFunction;"))); + } + + @Test + void testLocalTypesPrintedWithoutLeadingDigits() { + // contract: leading digits should be stripped from simple names when printing + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(16); + launcher.addInputResource("src/test/resources/localtypes"); + launcher.buildModel(); + + CtCompilationUnit cu = launcher.getFactory().Type().get("LocalTypesHolder") + .getPosition().getCompilationUnit(); + + String output = cu.prettyprint(); + // local classes will always have a leading space, without leading digits + assertThat(output, containsString(" MyClass")); + assertThat(output, containsString(" MyEnum")); + assertThat(output, containsString(" MyInterface")); + // the code does not contain a 1, which would be the prefix of the local types' binary names + // in the given code snippet + assertThat(output, not(containsString("1"))); + } + + @Test + void testEmptyIfBlocksArePrintedWithoutError() { + // contract: empty if blocks don't crash the DJJP + Launcher launcher = new Launcher(); + var ctIf = launcher.getFactory().createIf() + .setThenStatement(launcher.getFactory().createBlock()) + .setElseStatement(launcher.getFactory().createBlock()); + assertDoesNotThrow(() -> ctIf.toString()); + } + @Test + void testEmptyIfBlocksWithCommentsArePrintedWithoutError() { + // contract: empty if blocks don't crash the DJJP + Launcher launcher = new Launcher(); + CtBlock thenBlock = launcher.getFactory().createBlock(); + CtBlock elseBlock = launcher.getFactory().createBlock(); + thenBlock.addComment(launcher.getFactory().createComment().setContent("then")); + elseBlock.addComment(launcher.getFactory().createComment().setContent("else")); + var ctIf = launcher.getFactory().createIf() + .setThenStatement(thenBlock) + .setElseStatement(elseBlock); + assertDoesNotThrow(() -> ctIf.toString()); + } + + @ParameterizedTest + @ValueSource(strings = { + "int a = (new int[10])[1];", + "java.lang.Object b = (new java.lang.Object[6])[4];", + "double c = (new double[1][1][1])[0][0][0];", + "boolean d = new boolean[]{ true, false }[0];", + "float e = (new float[3][])[0][0];", // compiles, but throws a NPE on execution + "(new byte[8])[3] = 64;", + "(new byte[8][])[3] = new byte[16];", + }) + void testPrintNewArrayWithImmediateAccess(String line) { + // contract: immediate access to a new array must be surrounded by parentheses if + // no elements are passed directly + String code = SpoonTestHelpers.wrapLocal(line); + CtModel model = SpoonTestHelpers.createModelFromString(code, 8); + CtType first = model.getAllTypes().iterator().next(); + assertThat(first.toString(), containsString(line)); + } + + @Test + @SuppressWarnings({"unchecked", "rawtypes"}) + void testPrintMethodReferenceTypeParameters() { + // contract: type parameters of method references are printed + Launcher launcher = new Launcher(); + Factory factory = launcher.getFactory(); + CtTypeReference typeReference = factory.Type().createReference("Arrays"); + CtExecutableReferenceExpression exeExpression = factory.createExecutableReferenceExpression(); + exeExpression.setExecutable(factory.createExecutableReference()); + exeExpression.getExecutable().setSimpleName("binarySearch"); + exeExpression.setTarget(factory.createTypeAccess(typeReference)); + // if no type parameters are given, no < and no > should be printed + assertThat(exeExpression.toString(), not(anyOf(containsString("<"), containsString(">")))); + + exeExpression.getExecutable().addActualTypeArgument(factory.Type().integerType()); + // with type parameters, the < and > should be printed + assertThat(exeExpression.toString(), allOf(containsString("<"), containsString(">"))); + // the type parameter should appear + assertThat(exeExpression.toString(), containsString("Integer")); + + exeExpression.getExecutable().addActualTypeArgument(factory.Type().integerType()); + // more than one parameter type should be separated (with .* to allow imports) + assertThat(exeExpression.toString(), containsRegexMatch("<(.*)Integer, (.*)Integer>")); + + // remove type arguments again, we want to try something else + exeExpression.getExecutable().setActualTypeArguments(null); + // we want to have a bit more complex type and construct a fake Comparable> + CtTypeReference complexTypeReference = factory.Type().integerType().getSuperInterfaces().stream() + .filter(t -> t.getSimpleName().equals("Comparable")) + .findAny() + .orElseThrow(); + complexTypeReference.addActualTypeArgument(complexTypeReference.clone().setSimpleName("Comhyperbola")); + exeExpression.getExecutable().addActualTypeArgument(complexTypeReference); + assertThat(exeExpression.toString(), containsRegexMatch("<(.*)Comparable<(.*)Integer, (.*)Comhyperbola<(.*)Integer>>>")); + } + + @ParameterizedTest + @ArgumentsSource(SealedTypesProvider.class) + void testPrintSealedTypes(CtType sealedType, List explicitPermitted) { + // contract: sealed types are printed correctly + String printed = sealedType.toString(); + // the sealed keyword is always required + assertThat(printed, containsString("sealed")); + if (explicitPermitted.isEmpty()) { + // the permits keyword should only exist if explicit permitted types are printed + assertThat(printed, not(containsString("permits"))); + } else { + assertThat(printed, containsString("permits")); + for (String permitted : explicitPermitted) { + assertThat(printed, containsRegexMatch("\\s" + permitted)); + } + } + } + + @Test + void testPrintNonSealedTypes() { + // contract: the non-sealed modifier is printed + Launcher launcher = new Launcher(); + CtClass ctClass = launcher.getFactory().Class().create("MyClass"); + ctClass.addModifier(ModifierKind.NON_SEALED); + assertThat(ctClass.toString(), containsString("non-sealed ")); + } + + static class SealedTypesProvider implements ArgumentsProvider { + + @Override + public Stream provideArguments(ExtensionContext extensionContext) { + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(17); + launcher.addInputResource("src/test/resources/sealedclasses"); + launcher.buildModel(); + Factory factory = launcher.getFactory(); + return Stream.of( + Arguments.of(factory.Type().get("SealedClassWithPermits"), List.of("ExtendingClass", "OtherExtendingClass")), + Arguments.of(factory.Type().get("SealedInterfaceWithPermits"), List.of("ExtendingClass", "OtherExtendingClass")), + Arguments.of(factory.Type().get("SealedClassWithNestedSubclasses"), List.of()), // implicit + Arguments.of(factory.Type().get("SealedInterfaceWithNestedSubclasses"), List.of()) // implicit + ); + } + } + + @Nested + class SquareBracketsForArrayInitialization_ArrayIsBuiltUsingFactoryMethods { + @Test + @GitHubIssue(issueNumber = 4887, fixed = true) + void bracketsShouldBeAttachedToTypeByDefault() { + // contract: the square brackets should be attached to type by default when array is built using factory methods + // arrange + Launcher launcher = new Launcher(); + Factory factory = launcher.getFactory(); + + CtArrayTypeReference arrayTypeReference = factory.createArrayTypeReference(); + arrayTypeReference.setComponentType(factory.Type().integerPrimitiveType()); + CtNewArray newArray = factory.createNewArray(); + newArray.setValueByRole(CtRole.TYPE, arrayTypeReference); + List> elements = new ArrayList<>(List.of(factory.createLiteral(3))); + newArray.setValueByRole(CtRole.EXPRESSION, elements); + CtLocalVariable localVariable = factory.createLocalVariable(arrayTypeReference, "intArray", newArray); + + // act + String actualStringRepresentation = localVariable.toString(); + + // assert + assertThat(actualStringRepresentation, equalTo("int[] intArray = new int[]{ 3 }")); + } + + @Test + void bracketsShouldBeAttachedToIdentifierIfSpecified() { + // contract: the square brackets should be attached to identifier if specified explicitly + // arrange + Launcher launcher = new Launcher(); + Factory factory = launcher.getFactory(); + + CtArrayTypeReference arrayTypeReference = factory.createArrayTypeReference(); + CtTypeReference arrayType = factory.Type().createReference(CtElement.class); + arrayTypeReference.setComponentType(arrayType); + CtNewArray newArray = factory.createNewArray(); + newArray.setValueByRole(CtRole.TYPE, arrayTypeReference); + List elements = new ArrayList<>(List.of(factory.createLiteral(1.0f))); + newArray.setValueByRole(CtRole.EXPRESSION, elements); + CtLocalVariable localVariable = factory.createLocalVariable(arrayTypeReference, "spoonElements", newArray); + + + // act + ((CtArrayTypeReferenceImpl) arrayTypeReference).setDeclarationKind(CtArrayTypeReferenceImpl.DeclarationKind.IDENTIFIER); + String actualStringRepresentation = localVariable.toString(); + + // assert + assertThat(actualStringRepresentation, + equalTo("spoon.reflect.declaration.CtElement spoonElements[] = new spoon.reflect.declaration.CtElement[]{ 1.0F }")); + } + } + + @ModelTest(value = "src/test/resources/patternmatching/InstanceofGenerics.java", complianceLevel = 16) + void testKeepGenericType(Factory factory) { + // contract: generic type parameters can appear in instanceof expressions if they are only carried over + CtType x = factory.Type().get("InstanceofGenerics"); + String printed = x.toString(); + assertThat(printed, containsString("Set")); + assertThat(printed, containsString("List list")); + assertThat(printed, containsRegexMatch("Collection<.*String>")); + assertThat(printed, containsRegexMatch("List<.*List>")); + assertThat(printed, containsRegexMatch("List<.*List<\\? extends T>>")); + assertThat(printed, containsRegexMatch("List<.*List<\\? super T>>")); + } + + @Test + @GitHubIssue(issueNumber = 4881, fixed = true) + void bracketsShouldBeMinimallyPrintedForTypeCastOnFieldRead() throws FileNotFoundException { + // contract: the brackets should be minimally printed for type cast on field read + // arrange + Launcher launcher = createLauncherWithOptimizeParenthesesPrinter(); + launcher.addInputResource("src/test/resources/printer-test/TypeCastOnFieldRead.java"); + Launcher launcherForCompilingPrettyPrintedString = createLauncherWithOptimizeParenthesesPrinter(); + + // act + CtModel model = launcher.buildModel(); + launcher.prettyprint(); + SpoonModelBuilder spoonModelBuilder = launcherForCompilingPrettyPrintedString.createCompiler(SpoonResourceHelper.resources("spooned/TypeCastOnFieldRead.java")); + + // assert + assertThat(spoonModelBuilder.build(), equalTo(true)); + + CtLocalVariable localVariable = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); + assertThat(localVariable.toString(), equalTo("int myInt = (int) myDouble")); + + CtLocalVariable localVariable2 = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(1); + assertThat(localVariable2.toString(), equalTo("int myInt2 = ((java.lang.Double) myDouble).intValue()")); + + CtLocalVariable localVariable3 = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(2); + assertThat(localVariable3.toString(), equalTo("double withoutTypeCast = myDoubleObject.doubleValue()")); + } + + @Test + void bracketsShouldBeMinimallyPrintedOnShadowedFields() throws FileNotFoundException { + // contract: the brackets should be minimally printed for type cast on shadowed field read + // arrange + Launcher launcher = createLauncherWithOptimizeParenthesesPrinter(); + launcher.addInputResource("src/test/resources/printer-test/ShadowFieldRead.java"); + Launcher launcherForCompilingPrettyPrintedString = createLauncherWithOptimizeParenthesesPrinter(); + + // act + CtModel model = launcher.buildModel(); + launcher.prettyprint(); + SpoonModelBuilder spoonModelBuilder = launcherForCompilingPrettyPrintedString.createCompiler(SpoonResourceHelper.resources("spooned/ShadowFieldRead.java", "spooned/A.java", "spooned/C.java")); + + // assert + assertThat(spoonModelBuilder.build(), equalTo(true)); + + CtLocalVariable localVariable = model.getElements(new TypeFilter<>(CtLocalVariable.class)).get(1); + assertThat(localVariable.toString(), equalTo("int fieldReadOfA = ((A) c).a.i")); + } + + @ParameterizedTest(name = "Printing literal ''{0}'' throws an error") + @ValueSource(doubles = { + Double.NEGATIVE_INFINITY, + Double.POSITIVE_INFINITY, + Double.NaN + }) + void throwsExceptionWhenPrintingInvalidFloatingLiteral(double value) { + // contract: Printing invalid floating literals throws an exception + Factory factory = new Launcher().getFactory(); + + assertThrows(SpoonException.class, () -> factory.createLiteral(value).toString()); + assertThrows(SpoonException.class, () -> factory.createLiteral((float) value).toString()); + } + + @ModelTest("src/test/java/spoon/reflect/visitor/DefaultJavaPrettyPrinterTest.java") + void printAnnotationsInOrphanTypeReference(Factory factory) { + // contract: Spoon should print annotations for orphaned type references + // Used by the test + java.lang.@TypeUseAnnotation String ignored; + + CtTypeReference type = factory.Type() + .get(getClass().getName()) + .getMethodsByName("printAnnotationsInOrphanTypeReference") + .get(0) + .getElements(new TypeFilter<>(CtLocalVariable.class)) + .get(0) + .getType(); + + assertEquals( + "java.lang.@spoon.reflect.visitor.DefaultJavaPrettyPrinterTest.TypeUseAnnotation String", + type.toString().replace(System.lineSeparator(), " ") + ); + } + + @Target({ElementType.TYPE_USE}) + @Retention(RetentionPolicy.SOURCE) + private @interface TypeUseAnnotation { + + } } diff --git a/src/test/java/spoon/reflect/visitor/ImportCleanerTest.java b/src/test/java/spoon/reflect/visitor/ImportCleanerTest.java index 70d210a37c8..d05b228a105 100644 --- a/src/test/java/spoon/reflect/visitor/ImportCleanerTest.java +++ b/src/test/java/spoon/reflect/visitor/ImportCleanerTest.java @@ -1,5 +1,7 @@ package spoon.reflect.visitor; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; @@ -7,9 +9,6 @@ import spoon.reflect.declaration.CtImport; import spoon.reflect.declaration.CtType; -import java.util.Set; -import java.util.stream.Collectors; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,7 +40,7 @@ void testDoesNotImportClassesIfAlreadyImportedViaWildCard() { @Test void testDoesNotDuplicateUnresolvedImports() { - // contract: The import cleaner should not duplicate unresolved imports + // contract: The import cleaner should not duplicate unresolved imports testImportCleanerDoesNotAlterImports("./src/test/resources/unresolved/UnresolvedImport.java", "UnresolvedImport"); } diff --git a/src/test/java/spoon/reflect/visitor/ModelConsistencyCheckerTestHelper.java b/src/test/java/spoon/reflect/visitor/ModelConsistencyCheckerTestHelper.java index b4209e8f0b4..ae85db1c654 100644 --- a/src/test/java/spoon/reflect/visitor/ModelConsistencyCheckerTestHelper.java +++ b/src/test/java/spoon/reflect/visitor/ModelConsistencyCheckerTestHelper.java @@ -1,8 +1,7 @@ package spoon.reflect.visitor; -import spoon.reflect.factory.Factory; - import java.util.stream.Collectors; +import spoon.reflect.factory.Factory; public class ModelConsistencyCheckerTestHelper { diff --git a/src/test/java/spoon/reflect/visitor/processors/CheckScannerTestProcessor.java b/src/test/java/spoon/reflect/visitor/processors/CheckScannerTestProcessor.java index 10e1beca225..dda6d45a173 100644 --- a/src/test/java/spoon/reflect/visitor/processors/CheckScannerTestProcessor.java +++ b/src/test/java/spoon/reflect/visitor/processors/CheckScannerTestProcessor.java @@ -16,6 +16,8 @@ */ package spoon.reflect.visitor.processors; +import java.util.Arrays; +import java.util.List; import spoon.processing.AbstractProcessor; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtStatement; @@ -26,9 +28,6 @@ import spoon.reflect.visitor.CtScanner; import spoon.reflect.visitor.CtVisitor; -import java.util.Arrays; -import java.util.List; - public class CheckScannerTestProcessor extends AbstractProcessor> { private final List excludingClasses = Arrays.asList("CompilationUnitVirtualImpl", "CtTypeMemberWildcardImportReferenceImpl", "InvisibleArrayConstructorImpl"); diff --git a/src/test/java/spoon/reflect/visitor/processors/CheckVisitorTestProcessor.java b/src/test/java/spoon/reflect/visitor/processors/CheckVisitorTestProcessor.java index 92cc6b22927..b947cf72eac 100644 --- a/src/test/java/spoon/reflect/visitor/processors/CheckVisitorTestProcessor.java +++ b/src/test/java/spoon/reflect/visitor/processors/CheckVisitorTestProcessor.java @@ -16,6 +16,8 @@ */ package spoon.reflect.visitor.processors; +import java.util.Arrays; +import java.util.List; import spoon.processing.AbstractProcessor; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtMethod; @@ -23,9 +25,6 @@ import spoon.reflect.declaration.ModifierKind; import spoon.reflect.visitor.CtVisitor; -import java.util.Arrays; -import java.util.List; - /** * Used to check if a visitor (or a sub class) have all scanner and visitor methods necessary. * diff --git a/src/test/java/spoon/support/JavaOutputProcessorTest.java b/src/test/java/spoon/support/JavaOutputProcessorTest.java index 29e9149fea5..d0339ba72d1 100644 --- a/src/test/java/spoon/support/JavaOutputProcessorTest.java +++ b/src/test/java/spoon/support/JavaOutputProcessorTest.java @@ -1,15 +1,14 @@ package spoon.support; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import spoon.Launcher; import spoon.reflect.declaration.*; import spoon.reflect.factory.Factory; -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -65,49 +64,49 @@ void testCreateJavaFileAssertFileEncodingChanged(@TempDir File tempDir) throws E assertEquals(code, new String(bytes, StandardCharsets.ISO_8859_1)); } - @Test - void testCreateModuleFileAssertAnnotationFileCreated(@TempDir File tempDir) { - // contract : createModuleFile creates an annotation file for module and prints it - - // arrange - Launcher launcher = new Launcher(); - launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); - launcher.getEnvironment().setComplianceLevel(9); - Factory factory = launcher.getFactory(); - - String moduleName = "emptyModule"; - CtModule module = factory.Module().getOrCreate(moduleName); - JavaOutputProcessor javaOutputProcessor = new JavaOutputProcessor(); - javaOutputProcessor.setFactory(factory); - - // act - javaOutputProcessor.process(module); - - // assert - File expectedFile = tempDir.toPath().resolve("emptyModule/module-info.java").toFile(); - assertTrue(expectedFile.exists()); - assertEquals(1, javaOutputProcessor.printedFiles.size()); - } - - @Test - void testCreatePackageFileAssertAnnotationFileCreated(@TempDir File tempDir) { - // contract : createPackageFile creates a package annotation file for rootPackage - - // arrange - Launcher launcher = new Launcher(); - launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); - Factory factory = launcher.getFactory(); - - CtPackage rootPackage = factory.Package().getOrCreate("spoon.support.JavaOutputProcessor"); - JavaOutputProcessor javaOutputProcessor = new JavaOutputProcessor(); - javaOutputProcessor.setFactory(factory); - - // act - javaOutputProcessor.process(rootPackage); - - // assert - File expectedFile = tempDir.toPath().resolve("spoon/support/JavaOutputProcessor/package-info.java").toFile(); - assertTrue(expectedFile.exists()); - assertEquals(1, javaOutputProcessor.printedFiles.size()); - } -} \ No newline at end of file + @Test + void testCreateModuleFileAssertAnnotationFileCreated(@TempDir File tempDir) { + // contract : createModuleFile creates an annotation file for module and prints it + + // arrange + Launcher launcher = new Launcher(); + launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); + launcher.getEnvironment().setComplianceLevel(9); + Factory factory = launcher.getFactory(); + + String moduleName = "emptyModule"; + CtModule module = factory.Module().getOrCreate(moduleName); + JavaOutputProcessor javaOutputProcessor = new JavaOutputProcessor(); + javaOutputProcessor.setFactory(factory); + + // act + javaOutputProcessor.process(module); + + // assert + File expectedFile = tempDir.toPath().resolve("emptyModule/module-info.java").toFile(); + assertTrue(expectedFile.exists()); + assertEquals(1, javaOutputProcessor.printedFiles.size()); + } + + @Test + void testCreatePackageFileAssertAnnotationFileCreated(@TempDir File tempDir) { + // contract : createPackageFile creates a package annotation file for rootPackage + + // arrange + Launcher launcher = new Launcher(); + launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); + Factory factory = launcher.getFactory(); + + CtPackage rootPackage = factory.Package().getOrCreate("spoon.support.JavaOutputProcessor"); + JavaOutputProcessor javaOutputProcessor = new JavaOutputProcessor(); + javaOutputProcessor.setFactory(factory); + + // act + javaOutputProcessor.process(rootPackage); + + // assert + File expectedFile = tempDir.toPath().resolve("spoon/support/JavaOutputProcessor/package-info.java").toFile(); + assertTrue(expectedFile.exists()); + assertEquals(1, javaOutputProcessor.printedFiles.size()); + } +} diff --git a/src/test/java/spoon/support/TypeAdaptorTest.java b/src/test/java/spoon/support/TypeAdaptorTest.java index 4a9849856bf..33926a1d0b8 100644 --- a/src/test/java/spoon/support/TypeAdaptorTest.java +++ b/src/test/java/spoon/support/TypeAdaptorTest.java @@ -1,5 +1,8 @@ package spoon.support; +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -19,10 +22,6 @@ import spoon.testing.utils.GitHubIssue; import spoon.testing.utils.ModelTest; -import java.io.Serializable; -import java.util.List; -import java.util.stream.Collectors; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/spoon/support/compiler/SpoonPomTest.java b/src/test/java/spoon/support/compiler/SpoonPomTest.java index 783fd710613..b0f11f26d25 100644 --- a/src/test/java/spoon/support/compiler/SpoonPomTest.java +++ b/src/test/java/spoon/support/compiler/SpoonPomTest.java @@ -1,15 +1,14 @@ package spoon.support.compiler; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.List; +import java.util.regex.Pattern; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.junit.jupiter.api.Test; import spoon.MavenLauncher; import spoon.support.StandardEnvironment; -import java.io.IOException; -import java.util.List; -import java.util.regex.Pattern; -import java.nio.file.Paths; - import static org.junit.jupiter.api.Assertions.*; public class SpoonPomTest { @@ -52,7 +51,7 @@ public void checkProfilesModules(String path, String[] expected, Pattern profile assertEquals(expected[i], modules.get(i).getName()); } } - + public void getSourceDirectory() throws IOException, XmlPullParserException { checkSourceDirectory( "src/test/resources/maven-launcher/hierarchy", @@ -68,4 +67,4 @@ public void checkSourceDirectory(String path, String expected) throws IOExceptio // (childModel) SpoonPom assertEquals(expected, childModel.getSourceDirectories().get(0).getAbsolutePath()); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/support/compiler/ZipFileTest.java b/src/test/java/spoon/support/compiler/ZipFileTest.java index 1cd1037b05d..e9bd2d3b645 100644 --- a/src/test/java/spoon/support/compiler/ZipFileTest.java +++ b/src/test/java/spoon/support/compiler/ZipFileTest.java @@ -1,11 +1,5 @@ package spoon.support.compiler; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; -import spoon.Launcher; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtType; - import java.io.IOException; import java.net.URI; import java.nio.file.FileSystem; @@ -13,6 +7,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import spoon.Launcher; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.StringContains.containsString; diff --git a/src/test/java/spoon/support/compiler/classpath/ComputeClasspathTest.java b/src/test/java/spoon/support/compiler/classpath/ComputeClasspathTest.java index ca84145c82a..078bb8986e0 100644 --- a/src/test/java/spoon/support/compiler/classpath/ComputeClasspathTest.java +++ b/src/test/java/spoon/support/compiler/classpath/ComputeClasspathTest.java @@ -16,6 +16,7 @@ */ package spoon.support.compiler.classpath; +import java.io.File; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -24,8 +25,6 @@ import spoon.reflect.factory.Factory; import spoon.support.compiler.jdt.JDTBasedSpoonCompiler; -import java.io.File; - import static org.junit.jupiter.api.Assertions.assertEquals; public class ComputeClasspathTest { diff --git a/src/test/java/spoon/support/compiler/jdt/ExtendedStringLiteralTest.java b/src/test/java/spoon/support/compiler/jdt/ExtendedStringLiteralTest.java index 9e90ee884e4..a675a44c8db 100644 --- a/src/test/java/spoon/support/compiler/jdt/ExtendedStringLiteralTest.java +++ b/src/test/java/spoon/support/compiler/jdt/ExtendedStringLiteralTest.java @@ -16,13 +16,10 @@ */ package spoon.support.compiler.jdt; -import static org.junit.jupiter.api.Assertions.assertEquals; - import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.env.INameEnvironment; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonResourceHelper; @@ -32,6 +29,8 @@ import spoon.support.Level; import spoon.support.compiler.jdt.testclasses.ExtendedStringLiteralTestClass; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class ExtendedStringLiteralTest { @Test diff --git a/src/test/java/spoon/support/compiler/jdt/JDTBasedSpoonCompilerTest.java b/src/test/java/spoon/support/compiler/jdt/JDTBasedSpoonCompilerTest.java index 66dd300d556..ff31e0e6b22 100644 --- a/src/test/java/spoon/support/compiler/jdt/JDTBasedSpoonCompilerTest.java +++ b/src/test/java/spoon/support/compiler/jdt/JDTBasedSpoonCompilerTest.java @@ -16,12 +16,11 @@ */ package spoon.support.compiler.jdt; +import java.util.List; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.junit.jupiter.api.Test; import spoon.Launcher; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertTrue; public class JDTBasedSpoonCompilerTest { diff --git a/src/test/java/spoon/support/compiler/jdt/JDTBatchCompilerTest.java b/src/test/java/spoon/support/compiler/jdt/JDTBatchCompilerTest.java index 7b2c78afcbb..4de240b41d5 100644 --- a/src/test/java/spoon/support/compiler/jdt/JDTBatchCompilerTest.java +++ b/src/test/java/spoon/support/compiler/jdt/JDTBatchCompilerTest.java @@ -16,10 +16,9 @@ */ package spoon.support.compiler.jdt; +import java.io.File; import org.junit.jupiter.api.Test; - import spoon.Launcher; -import java.io.File; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/spoon/support/compiler/jdt/JDTBuilderTest.java b/src/test/java/spoon/support/compiler/jdt/JDTBuilderTest.java index 849d1248bc6..410a6231ef3 100644 --- a/src/test/java/spoon/support/compiler/jdt/JDTBuilderTest.java +++ b/src/test/java/spoon/support/compiler/jdt/JDTBuilderTest.java @@ -16,6 +16,7 @@ */ package spoon.support.compiler.jdt; +import java.io.File; import org.junit.jupiter.api.Test; import spoon.compiler.builder.AdvancedOptions; import spoon.compiler.builder.AnnotationProcessingOptions; @@ -24,8 +25,6 @@ import spoon.compiler.builder.JDTBuilderImpl; import spoon.compiler.builder.SourceOptions; -import java.io.File; - import static org.junit.jupiter.api.Assertions.assertEquals; public class JDTBuilderTest { diff --git a/src/test/java/spoon/support/compiler/jdt/JDTImportBuilderTest.java b/src/test/java/spoon/support/compiler/jdt/JDTImportBuilderTest.java index bfc89905913..6b851fc277a 100644 --- a/src/test/java/spoon/support/compiler/jdt/JDTImportBuilderTest.java +++ b/src/test/java/spoon/support/compiler/jdt/JDTImportBuilderTest.java @@ -1,17 +1,11 @@ package spoon.support.compiler.jdt; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; - import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.ImportReference; @@ -22,7 +16,6 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; - import spoon.compiler.Environment; import spoon.experimental.CtUnresolvedImport; import spoon.reflect.cu.CompilationUnit; @@ -38,6 +31,11 @@ import spoon.support.StandardEnvironment; import spoon.support.reflect.cu.CompilationUnitImpl; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + public class JDTImportBuilderTest { @Mock diff --git a/src/test/java/spoon/support/compiler/jdt/JDTTreeBuilderQueryTest.java b/src/test/java/spoon/support/compiler/jdt/JDTTreeBuilderQueryTest.java index 65216f8e728..597e9951952 100644 --- a/src/test/java/spoon/support/compiler/jdt/JDTTreeBuilderQueryTest.java +++ b/src/test/java/spoon/support/compiler/jdt/JDTTreeBuilderQueryTest.java @@ -1,5 +1,15 @@ package spoon.support.compiler.jdt; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; import org.junit.jupiter.api.BeforeAll; @@ -13,17 +23,6 @@ import spoon.reflect.declaration.ModifierKind; import spoon.support.reflect.CtExtendedModifier; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/spoon/support/compiler/jdt/TreeBuilderCompilerTest.java b/src/test/java/spoon/support/compiler/jdt/TreeBuilderCompilerTest.java index f2edcb3f5ee..6bf5b4b785a 100644 --- a/src/test/java/spoon/support/compiler/jdt/TreeBuilderCompilerTest.java +++ b/src/test/java/spoon/support/compiler/jdt/TreeBuilderCompilerTest.java @@ -11,48 +11,48 @@ public class TreeBuilderCompilerTest { - @Test - public void testIgnoreSyntaxErrorsCompilation() { - // contract: if a file has any syntax errors, it is filtered out, otherwise, it is compiled - Launcher launcher = setupLauncher(); - launcher.addInputResource("./src/test/resources/compilation/ClassWithStaticFields.java"); - launcher.buildModel(); - CtModel model = launcher.getModel(); - assertEquals(1,model.getAllTypes().size()); - } - - @ExtendWith(LogTest.LogCaptureExtension.class) - @Test - public void testIgnoreSyntaxErrorsLogging(LogTest.LogCapture logCapture) { - // contract: if a file has any syntax errors, the name of the incorrect file is logged - Launcher launcher = setupLauncher(); - launcher.buildModel(); - assertTrue(logCapture.loggingEvents().get(0).getMessage().endsWith("InvalidClass.java")); - } - - @Test - public void testEveryInputHasSyntaxError() { - // contract: if every input resource has a syntax error, spoon does not crash - Launcher launcher = setupLauncher(); - launcher.buildModel(); - CtModel model = launcher.getModel(); - assertTrue(model.getAllTypes().isEmpty()); - } - - @Test - public void testIgnoreSyntaxErrorsCommandLine() { - // contract: ignore-syntax-errors can be enabled with a command line argument - Launcher launcher = new Launcher(); - launcher.setArgs(new String[]{"--ignore-syntax-errors", "-i", "./src/test/resources/compilation2/InvalidClass.java"}); - launcher.buildModel(); - CtModel model = launcher.getModel(); - assertTrue(model.getAllTypes().isEmpty()); - } - - private Launcher setupLauncher() { - Launcher launcher = new Launcher(); - launcher.getEnvironment().setIgnoreSyntaxErrors(true); - launcher.addInputResource("./src/test/resources/compilation2/InvalidClass.java"); - return launcher; - } + @Test + public void testIgnoreSyntaxErrorsCompilation() { + // contract: if a file has any syntax errors, it is filtered out, otherwise, it is compiled + Launcher launcher = setupLauncher(); + launcher.addInputResource("./src/test/resources/compilation/ClassWithStaticFields.java"); + launcher.buildModel(); + CtModel model = launcher.getModel(); + assertEquals(1,model.getAllTypes().size()); + } + + @ExtendWith(LogTest.LogCaptureExtension.class) + @Test + public void testIgnoreSyntaxErrorsLogging(LogTest.LogCapture logCapture) { + // contract: if a file has any syntax errors, the name of the incorrect file is logged + Launcher launcher = setupLauncher(); + launcher.buildModel(); + assertTrue(logCapture.loggingEvents().get(0).getMessage().endsWith("InvalidClass.java")); + } + + @Test + public void testEveryInputHasSyntaxError() { + // contract: if every input resource has a syntax error, spoon does not crash + Launcher launcher = setupLauncher(); + launcher.buildModel(); + CtModel model = launcher.getModel(); + assertTrue(model.getAllTypes().isEmpty()); + } + + @Test + public void testIgnoreSyntaxErrorsCommandLine() { + // contract: ignore-syntax-errors can be enabled with a command line argument + Launcher launcher = new Launcher(); + launcher.setArgs(new String[]{"--ignore-syntax-errors", "-i", "./src/test/resources/compilation2/InvalidClass.java"}); + launcher.buildModel(); + CtModel model = launcher.getModel(); + assertTrue(model.getAllTypes().isEmpty()); + } + + private Launcher setupLauncher() { + Launcher launcher = new Launcher(); + launcher.getEnvironment().setIgnoreSyntaxErrors(true); + launcher.addInputResource("./src/test/resources/compilation2/InvalidClass.java"); + return launcher; + } } diff --git a/src/test/java/spoon/support/gui/SpoonTreeBuilderTest.java b/src/test/java/spoon/support/gui/SpoonTreeBuilderTest.java index a7b7d341896..92c0c4de997 100644 --- a/src/test/java/spoon/support/gui/SpoonTreeBuilderTest.java +++ b/src/test/java/spoon/support/gui/SpoonTreeBuilderTest.java @@ -1,53 +1,51 @@ package spoon.support.gui; +import javax.swing.tree.DefaultMutableTreeNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.declaration.CtClass; import spoon.reflect.factory.Factory; import spoon.support.reflect.declaration.CtClassImpl; -import javax.swing.tree.DefaultMutableTreeNode; - import static org.junit.jupiter.api.Assertions.*; class SpoonTreeBuilderTest { - Launcher spoon; - Factory factory; - SpoonTreeBuilder spoonTreeBuilder; + Launcher spoon; + Factory factory; + SpoonTreeBuilder spoonTreeBuilder; - @BeforeEach - public void setUp() { - spoon = new Launcher(); - spoon.buildModel(); - factory = spoon.getFactory(); + @BeforeEach + public void setUp() { + spoon = new Launcher(); + spoon.buildModel(); + factory = spoon.getFactory(); - spoonTreeBuilder = new SpoonTreeBuilder(); - } + spoonTreeBuilder = new SpoonTreeBuilder(); + } - @Test - public void testEnter() { - // contract : SpoonTreeBuilder.enter creates a node for the entered element while entering the scanner + @Test + public void testEnter() { + // contract : SpoonTreeBuilder.enter creates a node for the entered element while entering the scanner - CtClass testClass = factory.Class().create("testClass"); + CtClass testClass = factory.Class().create("testClass"); - spoonTreeBuilder.enter(testClass); - DefaultMutableTreeNode node = spoonTreeBuilder.nodes.peek(); + spoonTreeBuilder.enter(testClass); + DefaultMutableTreeNode node = spoonTreeBuilder.nodes.peek(); - assertEquals("testClass", ((CtClassImpl) node.getUserObject()).getSimpleName()); - } + assertEquals("testClass", ((CtClassImpl) node.getUserObject()).getSimpleName()); + } - @Test - public void testExit() { - // contract : SpoonTreeBuilder.exit removes the node for the current element while exiting the scanner + @Test + public void testExit() { + // contract : SpoonTreeBuilder.exit removes the node for the current element while exiting the scanner - CtClass testClass = factory.Class().create("testClass"); + CtClass testClass = factory.Class().create("testClass"); - spoonTreeBuilder.enter(testClass); - DefaultMutableTreeNode node = spoonTreeBuilder.nodes.peek(); - spoonTreeBuilder.exit(testClass); + spoonTreeBuilder.enter(testClass); + DefaultMutableTreeNode node = spoonTreeBuilder.nodes.peek(); + spoonTreeBuilder.exit(testClass); - assertNotEquals(node, spoonTreeBuilder.nodes.peek()); - } -} \ No newline at end of file + assertNotEquals(node, spoonTreeBuilder.nodes.peek()); + } +} diff --git a/src/test/java/spoon/support/util/QualifiedNameBasedSortedSetTest.java b/src/test/java/spoon/support/util/QualifiedNameBasedSortedSetTest.java index df3083d5d6d..f3c13296c5d 100644 --- a/src/test/java/spoon/support/util/QualifiedNameBasedSortedSetTest.java +++ b/src/test/java/spoon/support/util/QualifiedNameBasedSortedSetTest.java @@ -1,5 +1,10 @@ package spoon.support.util; +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import org.junit.jupiter.api.Test; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; @@ -8,108 +13,102 @@ import spoon.support.visitor.java.JavaReflectionTreeBuilder; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; public class QualifiedNameBasedSortedSetTest { - @Test - public void testIteratorOrdering() { - // contract: elements without source position should appear before any element with source position, - // and be ordered between themselves by qualified name. Elements with source position should be ordered - // between themselves by source position. - final CtType linkedListType = new JavaReflectionTreeBuilder(ModelUtils.createFactory()) - .scan(LinkedList.class); - - final MockSourcePosition smallerSourcePos = new MockSourcePosition(10, 12); - final MockSourcePosition largerSourcePos = new MockSourcePosition(14, 15); - - QualifiedNameBasedSortedSet> superInterfaces = new QualifiedNameBasedSortedSet<>( - linkedListType.getSuperInterfaces()); - List> expectedInterfaceOrder = new ArrayList<>(superInterfaces); - - CtTypeReference largerSourcePosElem = expectedInterfaceOrder.remove(0); - CtTypeReference smallerSourcePosElem = expectedInterfaceOrder.remove(0); - // setting the source positions will reorder the elements when fetched from the original set - largerSourcePosElem.setPosition(largerSourcePos); - smallerSourcePosElem.setPosition(smallerSourcePos); - expectedInterfaceOrder.add(smallerSourcePosElem); - expectedInterfaceOrder.add(largerSourcePosElem); - - Iterator> expected = expectedInterfaceOrder.iterator(); - Iterator> actual = superInterfaces.iterator(); - - assertTrue(expected.hasNext()); - while (expected.hasNext()) { - assertEquals(expected.next(), actual.next()); - } - assertFalse(actual.hasNext()); - } - - - private static class MockSourcePosition implements SourcePosition { - final int sourceStart; - final int sourceEnd; - - public MockSourcePosition(int sourceStart, int sourceEnd) { - this.sourceStart = sourceStart; - this.sourceEnd = sourceEnd; - } - - @Override - public boolean isValidPosition() { - return true; - } - - @Override - public int getSourceEnd() { - return sourceEnd; - } - - @Override - public int getSourceStart() { - return sourceStart; - } - - /* - * Methods below here don't matter - */ - - @Override - public File getFile() { - return null; - } - - @Override - public CompilationUnit getCompilationUnit() { - return null; - } - - @Override - public int getLine() { - return 0; - } - - @Override - public int getEndLine() { - return 0; - } - - @Override - public int getColumn() { - return 0; - } - - @Override - public int getEndColumn() { - return 0; - } - - } + @Test + public void testIteratorOrdering() { + // contract: elements without source position should appear before any element with source position, + // and be ordered between themselves by qualified name. Elements with source position should be ordered + // between themselves by source position. + final CtType linkedListType = new JavaReflectionTreeBuilder(ModelUtils.createFactory()) + .scan(LinkedList.class); + + final MockSourcePosition smallerSourcePos = new MockSourcePosition(10, 12); + final MockSourcePosition largerSourcePos = new MockSourcePosition(14, 15); + + QualifiedNameBasedSortedSet> superInterfaces = new QualifiedNameBasedSortedSet<>( + linkedListType.getSuperInterfaces()); + List> expectedInterfaceOrder = new ArrayList<>(superInterfaces); + + CtTypeReference largerSourcePosElem = expectedInterfaceOrder.remove(0); + CtTypeReference smallerSourcePosElem = expectedInterfaceOrder.remove(0); + // setting the source positions will reorder the elements when fetched from the original set + largerSourcePosElem.setPosition(largerSourcePos); + smallerSourcePosElem.setPosition(smallerSourcePos); + expectedInterfaceOrder.add(smallerSourcePosElem); + expectedInterfaceOrder.add(largerSourcePosElem); + + Iterator> expected = expectedInterfaceOrder.iterator(); + Iterator> actual = superInterfaces.iterator(); + + assertTrue(expected.hasNext()); + while (expected.hasNext()) { + assertEquals(expected.next(), actual.next()); + } + assertFalse(actual.hasNext()); + } + + + private static class MockSourcePosition implements SourcePosition { + final int sourceStart; + final int sourceEnd; + + public MockSourcePosition(int sourceStart, int sourceEnd) { + this.sourceStart = sourceStart; + this.sourceEnd = sourceEnd; + } + + @Override + public boolean isValidPosition() { + return true; + } + + @Override + public int getSourceEnd() { + return sourceEnd; + } + + @Override + public int getSourceStart() { + return sourceStart; + } + + /* + * Methods below here don't matter + */ + + @Override + public File getFile() { + return null; + } + + @Override + public CompilationUnit getCompilationUnit() { + return null; + } + + @Override + public int getLine() { + return 0; + } + + @Override + public int getEndLine() { + return 0; + } + + @Override + public int getColumn() { + return 0; + } + + @Override + public int getEndColumn() { + return 0; + } + + } } diff --git a/src/test/java/spoon/support/util/compilation/ClassFileManager.java b/src/test/java/spoon/support/util/compilation/ClassFileManager.java index 5f140a4d48f..c5706aa807d 100644 --- a/src/test/java/spoon/support/util/compilation/ClassFileManager.java +++ b/src/test/java/spoon/support/util/compilation/ClassFileManager.java @@ -1,11 +1,11 @@ package spoon.support.util.compilation; +import java.util.HashMap; +import java.util.Map; import javax.tools.FileObject; import javax.tools.ForwardingJavaFileManager; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; -import java.util.HashMap; -import java.util.Map; class ClassFileManager extends ForwardingJavaFileManager { diff --git a/src/test/java/spoon/support/util/compilation/InMemoryInputObject.java b/src/test/java/spoon/support/util/compilation/InMemoryInputObject.java index 2ac16707acc..1ff306ee63f 100644 --- a/src/test/java/spoon/support/util/compilation/InMemoryInputObject.java +++ b/src/test/java/spoon/support/util/compilation/InMemoryInputObject.java @@ -1,7 +1,7 @@ package spoon.support.util.compilation; -import javax.tools.SimpleJavaFileObject; import java.nio.file.Paths; +import javax.tools.SimpleJavaFileObject; class InMemoryInputObject extends SimpleJavaFileObject { diff --git a/src/test/java/spoon/support/util/compilation/InMemoryOutputObject.java b/src/test/java/spoon/support/util/compilation/InMemoryOutputObject.java index 846358827f0..72be29c763b 100644 --- a/src/test/java/spoon/support/util/compilation/InMemoryOutputObject.java +++ b/src/test/java/spoon/support/util/compilation/InMemoryOutputObject.java @@ -1,9 +1,9 @@ package spoon.support.util.compilation; -import javax.tools.SimpleJavaFileObject; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.nio.file.Paths; +import javax.tools.SimpleJavaFileObject; class InMemoryOutputObject extends SimpleJavaFileObject { diff --git a/src/test/java/spoon/support/util/compilation/JavacFacade.java b/src/test/java/spoon/support/util/compilation/JavacFacade.java index c7ce3820852..da25cfc7a61 100644 --- a/src/test/java/spoon/support/util/compilation/JavacFacade.java +++ b/src/test/java/spoon/support/util/compilation/JavacFacade.java @@ -1,7 +1,5 @@ package spoon.support.util.compilation; -import javax.tools.JavaCompiler; -import javax.tools.ToolProvider; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -9,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/spoon/support/util/internal/ElementNameMapTest.java b/src/test/java/spoon/support/util/internal/ElementNameMapTest.java index 9d8b89c428e..dfbe377e392 100644 --- a/src/test/java/spoon/support/util/internal/ElementNameMapTest.java +++ b/src/test/java/spoon/support/util/internal/ElementNameMapTest.java @@ -1,5 +1,10 @@ package spoon.support.util.internal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtLiteral; @@ -7,49 +12,43 @@ import spoon.reflect.factory.Factory; import spoon.reflect.path.CtRole; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static org.junit.jupiter.api.Assertions.*; class ElementNameMapTest { - static class SimpleElementNameMap extends ElementNameMap { - final CtElement owner; - - SimpleElementNameMap(CtElement owner) { - this.owner = owner; - } - @Override - protected CtElement getOwner() { - return owner; - } - - @Override - protected CtRole getRole() { - return null; - } - } - - @Test - void entrySet_returnsElementsInInsertionOrder() { - // contract: entrySet() should return elements in insertion order. This test is fairly weak but it at least - // guards against the output being sorted by key or value, which was the case previously. - - Factory factory = new Launcher().getFactory(); - List>> entries = Stream.of("c", "a", "b") - .map(factory::createLiteral) - .map(literal -> Map.entry(literal.getValue(), literal)) - .collect(Collectors.toList()); - - var map = new SimpleElementNameMap(factory.createClass()); - entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); - - var fetchedEntries = new ArrayList<>(map.entrySet()); - - assertEquals(fetchedEntries, entries); - } + static class SimpleElementNameMap extends ElementNameMap { + final CtElement owner; + + SimpleElementNameMap(CtElement owner) { + this.owner = owner; + } + @Override + protected CtElement getOwner() { + return owner; + } + + @Override + protected CtRole getRole() { + return null; + } + } + + @Test + void entrySet_returnsElementsInInsertionOrder() { + // contract: entrySet() should return elements in insertion order. This test is fairly weak but it at least + // guards against the output being sorted by key or value, which was the case previously. + + Factory factory = new Launcher().getFactory(); + List>> entries = Stream.of("c", "a", "b") + .map(factory::createLiteral) + .map(literal -> Map.entry(literal.getValue(), literal)) + .collect(Collectors.toList()); + + var map = new SimpleElementNameMap(factory.createClass()); + entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); + + var fetchedEntries = new ArrayList<>(map.entrySet()); + + assertEquals(fetchedEntries, entries); + } } diff --git a/src/test/java/spoon/support/visitor/java/JavaReflectionTreeBuilderTest.java b/src/test/java/spoon/support/visitor/java/JavaReflectionTreeBuilderTest.java index 05786ff6d7a..3b0350632a2 100644 --- a/src/test/java/spoon/support/visitor/java/JavaReflectionTreeBuilderTest.java +++ b/src/test/java/spoon/support/visitor/java/JavaReflectionTreeBuilderTest.java @@ -16,22 +16,7 @@ */ package spoon.support.visitor.java; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.CoreMatchers.hasItems; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static spoon.testing.utils.ModelUtils.createFactory; +import com.mysema.query.support.ProjectableQuery; import java.io.File; import java.io.ObjectInputStream; import java.io.Serial; @@ -52,7 +37,6 @@ import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; -import com.mysema.query.support.ProjectableQuery; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledForJreRange; @@ -117,6 +101,23 @@ import spoon.test.pkg.cyclic.indirect.Indirect; import spoon.testing.utils.GitHubIssue; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.utils.ModelUtils.createFactory; + public class JavaReflectionTreeBuilderTest { @Test @@ -433,7 +434,7 @@ protected void biScan(CtRole role, Collection elements, Col CtTypeReference at = a.getAnnotationType(); Class ac = at.getActualClass(); return ac != Override.class && ac != SuppressWarnings.class && ac != Root.class - && ac != Serial.class && ac != Nullable.class; + && ac != Serial.class && ac != Nullable.class; }).collect(Collectors.toList()); super.biScan(role, fileteredElements, others); return; @@ -636,7 +637,7 @@ public void testInnerClassWithConstructorParameterAnnotated() { launcher.addInputResource(URLDecoder.decode(JavaReflectionTreeBuilderTest.class .getClassLoader() .getResource("annotated-parameter-on-nested-class-constructor/Caller.java") - .getPath(), + .getPath(), StandardCharsets.UTF_8)); launcher.getEnvironment().setSourceClasspath( new String[]{ diff --git a/src/test/java/spoon/test/SpoonTestHelpers.java b/src/test/java/spoon/test/SpoonTestHelpers.java index 24b4a19aa59..413b75bb8b0 100644 --- a/src/test/java/spoon/test/SpoonTestHelpers.java +++ b/src/test/java/spoon/test/SpoonTestHelpers.java @@ -16,10 +16,14 @@ */ package spoon.test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.regex.Pattern; +import javax.annotation.RegEx; import org.hamcrest.Matcher; import spoon.Launcher; -import spoon.testing.matchers.ContentEqualsMatcher; -import spoon.testing.matchers.RegexFindMatcher; import spoon.metamodel.Metamodel; import spoon.reflect.CtModel; import spoon.reflect.code.CtBlock; @@ -32,13 +36,8 @@ import spoon.support.DerivedProperty; import spoon.support.UnsettableProperty; import spoon.support.compiler.VirtualFile; - -import javax.annotation.RegEx; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.regex.Pattern; +import spoon.testing.matchers.ContentEqualsMatcher; +import spoon.testing.matchers.RegexFindMatcher; import static org.junit.jupiter.api.Assumptions.assumeFalse; diff --git a/src/test/java/spoon/test/TemporaryDirectoryExecutionListener.java b/src/test/java/spoon/test/TemporaryDirectoryExecutionListener.java index 5384863240e..65f04507c41 100644 --- a/src/test/java/spoon/test/TemporaryDirectoryExecutionListener.java +++ b/src/test/java/spoon/test/TemporaryDirectoryExecutionListener.java @@ -16,15 +16,14 @@ */ package spoon.test; -import org.apache.commons.io.FileUtils; -import org.junit.platform.launcher.TestExecutionListener; -import org.junit.platform.launcher.TestIdentifier; -import org.kohsuke.MetaInfServices; - import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import org.apache.commons.io.FileUtils; +import org.junit.platform.launcher.TestExecutionListener; +import org.junit.platform.launcher.TestIdentifier; +import org.kohsuke.MetaInfServices; /** * An execution listener maintaining a temporary directory tests can use. This is intended as an alternative to diff --git a/src/test/java/spoon/test/TestExecutionLogger.java b/src/test/java/spoon/test/TestExecutionLogger.java index 3ab3c3f1329..77038e567d8 100644 --- a/src/test/java/spoon/test/TestExecutionLogger.java +++ b/src/test/java/spoon/test/TestExecutionLogger.java @@ -64,14 +64,14 @@ private long getTestRuntime(TestIdentifier testIdentifier) { * @param testIdentifier the testIdentifier to get the test name from. * @return the testname or empty string if the testIdentifier is not a methodsource. */ - private String getTestName(TestIdentifier testIdentifier) { +private String getTestName(TestIdentifier testIdentifier) { return testIdentifier.getSource().stream() .filter(MethodSource.class::isInstance) .map(MethodSource.class::cast) .map(v -> v.getClassName() + "#" + v.getMethodName()) .findFirst() .orElse(""); - } +} @Override public void executionSkipped(TestIdentifier testIdentifier, String reason) { diff --git a/src/test/java/spoon/test/annotation/AnnotationTest.java b/src/test/java/spoon/test/annotation/AnnotationTest.java index 1e98d128442..96b0bad5586 100644 --- a/src/test/java/spoon/test/annotation/AnnotationTest.java +++ b/src/test/java/spoon/test/annotation/AnnotationTest.java @@ -29,7 +29,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/annotation/AnnotationValuesTest.java b/src/test/java/spoon/test/annotation/AnnotationValuesTest.java index 834433d0a17..9ee9c96ec73 100644 --- a/src/test/java/spoon/test/annotation/AnnotationValuesTest.java +++ b/src/test/java/spoon/test/annotation/AnnotationValuesTest.java @@ -18,8 +18,6 @@ import java.lang.annotation.Annotation; import java.util.HashSet; -import java.util.Set; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonAPI; diff --git a/src/test/java/spoon/test/api/APITest.java b/src/test/java/spoon/test/api/APITest.java index ff3016f970d..8f0071b1a51 100644 --- a/src/test/java/spoon/test/api/APITest.java +++ b/src/test/java/spoon/test/api/APITest.java @@ -30,7 +30,6 @@ import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; - import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; @@ -71,7 +70,6 @@ import spoon.test.api.testclasses.Bar; import spoon.testing.utils.GitHubIssue; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -184,7 +182,7 @@ public void testNotValidInput() { String invalidEntry = "does/not/exists//Foo.java"; Launcher.main(new String[]{ "-i", invalidEntry, "-o", "target/spooned/apitest" }); }); - } + } @Test public void testAddProcessorMethodInSpoonAPI() { @@ -650,8 +648,8 @@ public void testRespectPackageOfQualifiedUnknownClass() { CtClass theClass = Launcher.parseClass(""" package io.example.pack1.pack2; public class Example { - void add(io.example.other.Class1 value){ - } + void add(io.example.other.Class1 value){ + } } """); List> addParameters = theClass.getMethodsByName("add").get(0).getParameters(); @@ -675,8 +673,8 @@ public void testRespectPackageOfQualifiedUnknownClassPreserveUnqualified() { CtClass theClass = Launcher.parseClass(""" package io.example.pack1.pack2; public class Example { - void add(io.example.other.Class1 value1, Class1 value2) { - } + void add(io.example.other.Class1 value1, Class1 value2) { + } } """); List> addParameters = theClass.getMethodsByName("add").get(0).getParameters(); diff --git a/src/test/java/spoon/test/api/FileSystemFolderTest.java b/src/test/java/spoon/test/api/FileSystemFolderTest.java index b424b5f41ba..cbd8e901279 100644 --- a/src/test/java/spoon/test/api/FileSystemFolderTest.java +++ b/src/test/java/spoon/test/api/FileSystemFolderTest.java @@ -20,9 +20,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.util.List; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonException; import spoon.compiler.SpoonFolder; diff --git a/src/test/java/spoon/test/api/Metamodel.java b/src/test/java/spoon/test/api/Metamodel.java index 8bfbcb496f6..924a19c9eff 100644 --- a/src/test/java/spoon/test/api/Metamodel.java +++ b/src/test/java/spoon/test/api/Metamodel.java @@ -17,6 +17,14 @@ package spoon.test.api; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; import spoon.metamodel.MetamodelConcept; import spoon.reflect.code.CtForEach; import spoon.reflect.declaration.CtClass; @@ -29,15 +37,6 @@ import spoon.reflect.visitor.CtScanner; import spoon.support.reflect.code.CtForEachImpl; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - /** * This class enables to reason on the Spoon metamodel directly */ diff --git a/src/test/java/spoon/test/api/MetamodelTest.java b/src/test/java/spoon/test/api/MetamodelTest.java index 07b49e6e22c..978aa8c451e 100644 --- a/src/test/java/spoon/test/api/MetamodelTest.java +++ b/src/test/java/spoon/test/api/MetamodelTest.java @@ -29,7 +29,6 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonAPI; @@ -72,7 +71,6 @@ import spoon.support.adaption.TypeAdaptor; import spoon.template.Parameter; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; @@ -132,7 +130,7 @@ public void testRuntimeMetamodel() { } assertTrue(problems.isEmpty(), "You might need to update api/Metamodel.java: " + String.join("\n", problems)); } - + @Test public void testGetterSetterForRole() { // contract: all roles in spoon metamodel must at least have a setter and a getter @@ -166,7 +164,7 @@ public void testGetterSetterForRole() { assertEquals(Collections.EMPTY_SET, isNotGetter); assertEquals(Collections.EMPTY_SET, isNotSetter); } - + private static final Set IGNORED_FIELD_NAMES = new HashSet<>(Arrays.asList( "parent", "metadata", diff --git a/src/test/java/spoon/test/api/NoClasspathTest.java b/src/test/java/spoon/test/api/NoClasspathTest.java index 06974d0cc18..ddfeeeb1607 100644 --- a/src/test/java/spoon/test/api/NoClasspathTest.java +++ b/src/test/java/spoon/test/api/NoClasspathTest.java @@ -19,9 +19,7 @@ import java.io.File; import java.util.List; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.code.CtConstructorCall; @@ -30,7 +28,6 @@ import spoon.reflect.code.CtLocalVariable; import spoon.reflect.code.CtReturn; import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtType; @@ -45,7 +42,6 @@ import spoon.testing.utils.GitHubIssue; import spoon.testing.utils.ModelTest; -import static java.util.function.Predicate.not; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/src/test/java/spoon/test/api/processors/AwesomeProcessor.java b/src/test/java/spoon/test/api/processors/AwesomeProcessor.java index caa01e188b0..a09afc03ece 100644 --- a/src/test/java/spoon/test/api/processors/AwesomeProcessor.java +++ b/src/test/java/spoon/test/api/processors/AwesomeProcessor.java @@ -1,15 +1,14 @@ package spoon.test.api.processors; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import spoon.processing.AbstractProcessor; import spoon.reflect.code.CtBlock; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtMethod; import spoon.test.api.testclasses.Bar; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class AwesomeProcessor extends AbstractProcessor> { final List> elements = new ArrayList<>(); diff --git a/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java b/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java index 7c9a1b183f9..b9e45da0f5b 100644 --- a/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java +++ b/src/test/java/spoon/test/architecture/SpoonArchitectureEnforcerTest.java @@ -26,7 +26,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -63,7 +62,6 @@ import spoon.reflect.visitor.filter.AbstractFilter; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.adaption.TypeAdaptor; -import spoon.testing.utils.ModelTest; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/spoon/test/arrays/ArraysTest.java b/src/test/java/spoon/test/arrays/ArraysTest.java index 91e2cff14fa..b77a4de02f4 100644 --- a/src/test/java/spoon/test/arrays/ArraysTest.java +++ b/src/test/java/spoon/test/arrays/ArraysTest.java @@ -19,7 +19,6 @@ import java.lang.reflect.Array; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtInvocation; diff --git a/src/test/java/spoon/test/change/ChangeCollectorTest.java b/src/test/java/spoon/test/change/ChangeCollectorTest.java index f69cfb503f6..49877c09f8d 100644 --- a/src/test/java/spoon/test/change/ChangeCollectorTest.java +++ b/src/test/java/spoon/test/change/ChangeCollectorTest.java @@ -1,94 +1,93 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.change; - - -import java.util.Arrays; -import java.util.HashSet; - -import org.junit.jupiter.api.Test; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtField; -import spoon.reflect.declaration.CtType; -import spoon.reflect.factory.Factory; -import spoon.reflect.path.CtRole; -import spoon.support.modelobs.ChangeCollector; -import spoon.test.change.testclasses.SubjectOfChange; -import spoon.testing.utils.ModelUtils; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; - -public class ChangeCollectorTest { - - @Test - public void testChangeCollector() throws Exception { - //contract: test ChangeCollector - CtType ctClass = ModelUtils.buildClass(SubjectOfChange.class); - - Factory f = ctClass.getFactory(); - - assertNull(ChangeCollector.getChangeCollector(f.getEnvironment())); - - ChangeCollector changeCollector = new ChangeCollector().attachTo(f.getEnvironment()); - - assertSame(changeCollector, ChangeCollector.getChangeCollector(f.getEnvironment())); - - //contract: after ChangeCollector is created there is no direct or indirect change - assertEquals(0, changeCollector.getChanges(f.getModel().getRootPackage()).size()); - f.getModel().getRootPackage().filterChildren(null).forEach((CtElement e) -> { - assertEquals(0, changeCollector.getDirectChanges(e).size()); - }); - - ctClass.setSimpleName("aaa"); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.SUB_PACKAGE)), changeCollector.getChanges(f.getModel().getRootPackage())); - assertEquals(new HashSet<>(), changeCollector.getDirectChanges(f.getModel().getRootPackage())); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.CONTAINED_TYPE)), changeCollector.getChanges(ctClass.getPackage())); - assertEquals(new HashSet<>(Arrays.asList()), changeCollector.getDirectChanges(ctClass.getPackage())); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.DECLARED_TYPE)), changeCollector.getChanges(ctClass.getPosition().getCompilationUnit())); - assertEquals(new HashSet<>(Arrays.asList()), changeCollector.getDirectChanges(ctClass.getPosition().getCompilationUnit())); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getChanges(ctClass)); - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getDirectChanges(ctClass)); - - CtField field = ctClass.getField("someField"); - field.getDefaultExpression().delete(); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getChanges(ctClass)); - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getDirectChanges(ctClass)); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getChanges(field)); - assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getDirectChanges(field)); - - /* - * TODO: - * field.delete(); - * calls internally setTypeMembers, which deletes everything and then adds remaining - */ - ctClass.removeTypeMember(field); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getChanges(ctClass)); - assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getDirectChanges(ctClass)); - - assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getChanges(field)); - assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getDirectChanges(field)); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.change; + + +import java.util.Arrays; +import java.util.HashSet; +import org.junit.jupiter.api.Test; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtField; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.Factory; +import spoon.reflect.path.CtRole; +import spoon.support.modelobs.ChangeCollector; +import spoon.test.change.testclasses.SubjectOfChange; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +public class ChangeCollectorTest { + + @Test + public void testChangeCollector() throws Exception { + //contract: test ChangeCollector + CtType ctClass = ModelUtils.buildClass(SubjectOfChange.class); + + Factory f = ctClass.getFactory(); + + assertNull(ChangeCollector.getChangeCollector(f.getEnvironment())); + + ChangeCollector changeCollector = new ChangeCollector().attachTo(f.getEnvironment()); + + assertSame(changeCollector, ChangeCollector.getChangeCollector(f.getEnvironment())); + + //contract: after ChangeCollector is created there is no direct or indirect change + assertEquals(0, changeCollector.getChanges(f.getModel().getRootPackage()).size()); + f.getModel().getRootPackage().filterChildren(null).forEach((CtElement e) -> { + assertEquals(0, changeCollector.getDirectChanges(e).size()); + }); + + ctClass.setSimpleName("aaa"); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.SUB_PACKAGE)), changeCollector.getChanges(f.getModel().getRootPackage())); + assertEquals(new HashSet<>(), changeCollector.getDirectChanges(f.getModel().getRootPackage())); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.CONTAINED_TYPE)), changeCollector.getChanges(ctClass.getPackage())); + assertEquals(new HashSet<>(Arrays.asList()), changeCollector.getDirectChanges(ctClass.getPackage())); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.DECLARED_TYPE)), changeCollector.getChanges(ctClass.getPosition().getCompilationUnit())); + assertEquals(new HashSet<>(Arrays.asList()), changeCollector.getDirectChanges(ctClass.getPosition().getCompilationUnit())); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getChanges(ctClass)); + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getDirectChanges(ctClass)); + + CtField field = ctClass.getField("someField"); + field.getDefaultExpression().delete(); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getChanges(ctClass)); + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME)), changeCollector.getDirectChanges(ctClass)); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getChanges(field)); + assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getDirectChanges(field)); + + /* + * TODO: + * field.delete(); + * calls internally setTypeMembers, which deletes everything and then adds remaining + */ + ctClass.removeTypeMember(field); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getChanges(ctClass)); + assertEquals(new HashSet<>(Arrays.asList(CtRole.NAME, CtRole.TYPE_MEMBER)), changeCollector.getDirectChanges(ctClass)); + + assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getChanges(field)); + assertEquals(new HashSet<>(Arrays.asList(CtRole.DEFAULT_EXPRESSION)), changeCollector.getDirectChanges(field)); + } +} diff --git a/src/test/java/spoon/test/comment/CommentTest.java b/src/test/java/spoon/test/comment/CommentTest.java index 64bd5e37dd8..63779132522 100644 --- a/src/test/java/spoon/test/comment/CommentTest.java +++ b/src/test/java/spoon/test/comment/CommentTest.java @@ -16,6 +16,20 @@ */ package spoon.test.comment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringEscapeUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledForJreRange; @@ -90,21 +104,6 @@ import spoon.testing.utils.LineSeparatorExtension; import spoon.testing.utils.ModelTest; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -311,7 +310,7 @@ public void testInLineComment() { Factory f = getSpoonFactory(); CtClass type = (CtClass) f.Type().get(InlineComment.class); String strType = type.toString(); - + List compilationUnitComments = type.getPosition().getCompilationUnit().getComments(); assertEquals(2, compilationUnitComments.size()); assertEquals(CtComment.CommentType.BLOCK, compilationUnitComments.get(0).getCommentType()); @@ -509,7 +508,7 @@ public void testBlockComment() { Factory f = getSpoonFactory(); CtClass type = (CtClass) f.Type().get(BlockComment.class); String strType = type.toString(); - + List compilationUnitComments = type.getPosition().getCompilationUnit().getComments(); assertEquals(2, compilationUnitComments.size()); assertEquals("Bottom File", compilationUnitComments.get(1).getContent()); @@ -877,14 +876,14 @@ public void testAddCommentsToSnippet() { @ExtendWith(LineSeparatorExtension.class) public void testDocumentationContract() throws Exception { // contract: all metamodel classes must be commented with an example. - + final Launcher launcher = new Launcher(); launcher.getEnvironment().setNoClasspath(true); launcher.getEnvironment().setCommentEnabled(true); launcher.getEnvironment().setComplianceLevel(22); // launcher.getEnvironment().setPreviewFeaturesEnabled(true); - + // interfaces. launcher.addInputResource("./src/main/java/spoon/reflect/"); launcher.addInputResource("./src/main/java/spoon/support/reflect/"); @@ -1159,19 +1158,19 @@ public void testCommentAssociationAndPrettyPrint(Launcher launcher) { public void testCommentGetRawContent(Launcher launcher) { CtClass type = (CtClass) launcher.getFactory().Type().get("spoon.test.comment.testclasses.JavaDocComment"); //contract: getContent always returns cleaned comment content with \n as EOL - assertEquals("JavaDoc test class.\n" + - "\n" + + assertEquals("JavaDoc test class.\n" + + "\n" + "Long description", type.getComments().get(0).getContent()); // contract: return the full original comment with prefix and suffix, incl. the original EOL (\r as EOL here) - assertEquals("/**\r" + - " * JavaDoc test class.\r" + - " *\r" + - " * Long description\r" + - " *\r" + - " * @deprecated\r" + - " * @since 1.3\r" + - " * @author Thomas Durieux\r" + - " * @version 1.0\r" + + assertEquals("/**\r" + + " * JavaDoc test class.\r" + + " *\r" + + " * Long description\r" + + " *\r" + + " * @deprecated\r" + + " * @since 1.3\r" + + " * @author Thomas Durieux\r" + + " * @version 1.0\r" + " */", type.getComments().get(0).getRawContent()); } @@ -1203,7 +1202,7 @@ public void testAnnotationTypeComment(Launcher launcher, CtModel model) { assertEquals("comment4", ((CtAnnotationMethod) annotationMethods[3]).getComments().get(0).getContent()); } - public void testLambdaComments() { +public void testLambdaComments() { //contract: comments in lambdas should be properly added to the AST Launcher launcher = new Launcher(); launcher.addInputResource("./src/test/java/spoon/test/comment/testclasses/LambdaComments.java"); diff --git a/src/test/java/spoon/test/compilation/CompilationTest.java b/src/test/java/spoon/test/compilation/CompilationTest.java index de37886efdb..1979142ba7a 100644 --- a/src/test/java/spoon/test/compilation/CompilationTest.java +++ b/src/test/java/spoon/test/compilation/CompilationTest.java @@ -27,13 +27,10 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; - - import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonException; import spoon.SpoonModelBuilder; @@ -43,8 +40,8 @@ import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtReturn; import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtNamedElement; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.ModifierKind; @@ -528,7 +525,7 @@ public void testCompilationInEmptyDir() throws Exception { assertThat(tempDirPath.toFile().listFiles().length, not(0)); } - + @Test public void testCompileUnresolvedFullyQualifiedName() { //contract: the unresolved fully qualified type reference must not cause model building problem @@ -554,7 +551,7 @@ public void testBuildAstWithSyntheticMethods() { @Test public void testBuildAstWithSyntheticMethodsSwapOrder() { - // contract: we can handle non annotation methods, no exception + // contract: we can handle non annotation methods, no exception File testFile = new File( "src/test/resources/syntheticMethods/ClassWithSyntheticEnumNotParsable.java"); String absoluteTestPath = testFile.getAbsolutePath(); diff --git a/src/test/java/spoon/test/compilationunit/GetBinaryFilesTest.java b/src/test/java/spoon/test/compilationunit/GetBinaryFilesTest.java index edc84265898..c57ac968c92 100644 --- a/src/test/java/spoon/test/compilationunit/GetBinaryFilesTest.java +++ b/src/test/java/spoon/test/compilationunit/GetBinaryFilesTest.java @@ -22,7 +22,6 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import spoon.Launcher; diff --git a/src/test/java/spoon/test/compilationunit/TestCompilationUnit.java b/src/test/java/spoon/test/compilationunit/TestCompilationUnit.java index 449fb6981f3..fd59e771442 100644 --- a/src/test/java/spoon/test/compilationunit/TestCompilationUnit.java +++ b/src/test/java/spoon/test/compilationunit/TestCompilationUnit.java @@ -21,11 +21,9 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -46,7 +44,6 @@ import spoon.support.reflect.cu.position.PartialSourcePositionImpl; import spoon.test.api.testclasses.Bar; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -108,7 +105,7 @@ public void testGetUnitTypeWorksWithCreatedObjects() { CtPackage myFooPackage = launcher.getFactory().Package().getOrCreate("my.foo"); CompilationUnit cu = launcher.getFactory().createCompilationUnit(); assertEquals(CompilationUnit.UNIT_TYPE.UNKNOWN, cu.getUnitType()); - + cu.setDeclaredPackage(myFooPackage); assertEquals(CompilationUnit.UNIT_TYPE.PACKAGE_DECLARATION, cu.getUnitType()); @@ -239,20 +236,20 @@ public void testCompilationUnitModelContracts() { //contract: parent of CtImport is CompilationUnit CtImport anImport = compilationUnit.getImports().iterator().next(); assertSame(compilationUnit, anImport.getParent()); - + //contract: parent of type declared in Compilation unit is a package (never CompilationUnit) assertTrue(compilationUnit.getMainType().getParent() instanceof CtPackage); - + //contract: compilation unit which contains types has null declared module assertNull(compilationUnit.getDeclaredModule()); //contract: compilation unit knows declared package assertSame(type.getPackage(), compilationUnit.getDeclaredPackage()); - + //the package declaration exists and points to correct package assertEquals(type.getPackage().getReference(), compilationUnit.getPackageDeclaration().getReference()); - + assertSame(compilationUnit, compilationUnit.getPackageDeclaration().getParent()); - + //contract: types and imports are scanned exactly once when scanning starts from compilation unit //note: therefore compilationUnit.getDeclaredPackage() must return null List> types = new ArrayList<>(); @@ -273,11 +270,11 @@ public void visitCtImport(CtImport ctImport) { assertSame(compilationUnit, ctImport.getParent()); } }.scan(compilationUnit); - + assertEquals(0, types.size()); assertEquals(compilationUnit.getDeclaredTypeReferences(), typeRefs); assertEquals(compilationUnit.getImports(), imports); - + //contract: compilation unit is not visited by scanner when scanning started from model new CtScanner() { @Override diff --git a/src/test/java/spoon/test/condition/ConditionalTest.java b/src/test/java/spoon/test/condition/ConditionalTest.java index 3070c905984..82e1b05b601 100644 --- a/src/test/java/spoon/test/condition/ConditionalTest.java +++ b/src/test/java/spoon/test/condition/ConditionalTest.java @@ -18,9 +18,7 @@ import java.util.List; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.code.CtBlock; @@ -69,8 +67,8 @@ public void testBlockInConditionAndLoop() throws Exception { } } - assertEquals("if (true) {" + newLine + - " java.lang.System.out.println();" + newLine + + assertEquals("if (true) {" + newLine + + " java.lang.System.out.println();" + newLine + "} else if (true) {" + newLine + " java.lang.System.out.println();" + newLine + "} else {" + newLine + diff --git a/src/test/java/spoon/test/constructor/ConstructorTest.java b/src/test/java/spoon/test/constructor/ConstructorTest.java index c423945d909..dae82bae1bb 100644 --- a/src/test/java/spoon/test/constructor/ConstructorTest.java +++ b/src/test/java/spoon/test/constructor/ConstructorTest.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -42,7 +41,6 @@ import spoon.test.constructor.testclasses.Tacos; import spoon.testing.utils.ModelUtils; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/constructor/CtConstructorCallTest.java b/src/test/java/spoon/test/constructor/CtConstructorCallTest.java index e10a2588bf5..6f66bd30314 100644 --- a/src/test/java/spoon/test/constructor/CtConstructorCallTest.java +++ b/src/test/java/spoon/test/constructor/CtConstructorCallTest.java @@ -28,39 +28,39 @@ public class CtConstructorCallTest { - @Test - void testRemoveArgument() { - // contract: removeArgument removes the passed argument among two arguments in the call + @Test + void testRemoveArgument() { + // contract: removeArgument removes the passed argument among two arguments in the call - Factory factory = new Launcher().getFactory(); - CtExpression argumentToBeRemoved = factory.createLiteral(true); - CtExpression additionalArgument = factory.createLiteral(false); - CtConstructorCall call = factory.createConstructorCall( - factory.createCtTypeReference(Object.class), argumentToBeRemoved, additionalArgument - ); - assertThat(call.getArguments().size(), is(2)); + Factory factory = new Launcher().getFactory(); + CtExpression argumentToBeRemoved = factory.createLiteral(true); + CtExpression additionalArgument = factory.createLiteral(false); + CtConstructorCall call = factory.createConstructorCall( + factory.createCtTypeReference(Object.class), argumentToBeRemoved, additionalArgument + ); + assertThat(call.getArguments().size(), is(2)); - call.removeArgument(argumentToBeRemoved); + call.removeArgument(argumentToBeRemoved); - assertThat(call.getArguments().size(), is(1)); - assertThat(call.getArguments().get(0), is(additionalArgument)); - } + assertThat(call.getArguments().size(), is(1)); + assertThat(call.getArguments().get(0), is(additionalArgument)); + } - @Test - void testRemoveActualTypeArgument() { - // contract: removeActualTypeArgument removes the passed type among two types + @Test + void testRemoveActualTypeArgument() { + // contract: removeActualTypeArgument removes the passed type among two types - Factory factory = new Launcher().getFactory(); - CtTypeReference typeToBeRemoved = factory.createCtTypeReference(Boolean.class); - CtTypeReference additionalType = factory.createCtTypeReference(Integer.class); - CtConstructorCall call = factory.createConstructorCall(factory.createCtTypeReference(Object.class)); - call.addActualTypeArgument(typeToBeRemoved); - call.addActualTypeArgument(additionalType); - assertThat(call.getActualTypeArguments().size(), is(2)); + Factory factory = new Launcher().getFactory(); + CtTypeReference typeToBeRemoved = factory.createCtTypeReference(Boolean.class); + CtTypeReference additionalType = factory.createCtTypeReference(Integer.class); + CtConstructorCall call = factory.createConstructorCall(factory.createCtTypeReference(Object.class)); + call.addActualTypeArgument(typeToBeRemoved); + call.addActualTypeArgument(additionalType); + assertThat(call.getActualTypeArguments().size(), is(2)); - call.removeActualTypeArgument(typeToBeRemoved); + call.removeActualTypeArgument(typeToBeRemoved); - assertThat(call.getActualTypeArguments().size(), is(1)); - assertThat(call.getActualTypeArguments().get(0), is(additionalType)); - } -} \ No newline at end of file + assertThat(call.getActualTypeArguments().size(), is(1)); + assertThat(call.getActualTypeArguments().get(0), is(additionalType)); + } +} diff --git a/src/test/java/spoon/test/constructorcallnewclass/ConstructorCallTest.java b/src/test/java/spoon/test/constructorcallnewclass/ConstructorCallTest.java index 095bac609ca..14dede05e07 100644 --- a/src/test/java/spoon/test/constructorcallnewclass/ConstructorCallTest.java +++ b/src/test/java/spoon/test/constructorcallnewclass/ConstructorCallTest.java @@ -39,7 +39,6 @@ import spoon.test.constructorcallnewclass.testclasses.Foo; import spoon.test.constructorcallnewclass.testclasses.Panini; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; @@ -191,7 +190,7 @@ public void test_addArgumentAt_addsArgumentToSpecifiedPosition() { Factory factory = new Launcher().getFactory(); factory.getEnvironment().setAutoImports(true); CtConstructorCall newLinkedHashMap = (CtConstructorCall) factory - // make it raw on purpose to simplify assertion + // make it raw on purpose to simplify assertion .createCodeSnippetExpression("new java.util.LinkedHashMap()") .compile(); @@ -221,7 +220,7 @@ private CtTypeReference getConstructorCallTypeFrom(String simpleName, String assert calls.size() == 1; return calls.get(0).getExecutable().getType(); } - + @Test public void testConstructorCorrectTyped() { // no constructorcall from the input has the simple object type in noclasspathmode diff --git a/src/test/java/spoon/test/constructorcallnewclass/NewClassTest.java b/src/test/java/spoon/test/constructorcallnewclass/NewClassTest.java index 62b231fa713..aef3b11a2ad 100644 --- a/src/test/java/spoon/test/constructorcallnewclass/NewClassTest.java +++ b/src/test/java/spoon/test/constructorcallnewclass/NewClassTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.FluentLauncher; @@ -37,9 +36,7 @@ import spoon.test.constructorcallnewclass.testclasses.Foo; import spoon.test.constructorcallnewclass.testclasses.Foo2; - import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/control/ControlTest.java b/src/test/java/spoon/test/control/ControlTest.java index 477488102d1..94304d91c93 100644 --- a/src/test/java/spoon/test/control/ControlTest.java +++ b/src/test/java/spoon/test/control/ControlTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtDo; diff --git a/src/test/java/spoon/test/ctBlock/TestCtBlock.java b/src/test/java/spoon/test/ctBlock/TestCtBlock.java index 22a8de93e4b..034e4cf4b0b 100644 --- a/src/test/java/spoon/test/ctBlock/TestCtBlock.java +++ b/src/test/java/spoon/test/ctBlock/TestCtBlock.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtBlock; diff --git a/src/test/java/spoon/test/ctBodyHolder/CtBodyHolderTest.java b/src/test/java/spoon/test/ctBodyHolder/CtBodyHolderTest.java index 0f24c8ea95c..a64ce9ab6f5 100644 --- a/src/test/java/spoon/test/ctBodyHolder/CtBodyHolderTest.java +++ b/src/test/java/spoon/test/ctBodyHolder/CtBodyHolderTest.java @@ -1,165 +1,164 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.ctBodyHolder; - -import org.junit.jupiter.api.Test; - -import spoon.reflect.code.CtAssignment; -import spoon.reflect.code.CtBlock; -import spoon.reflect.code.CtBodyHolder; -import spoon.reflect.code.CtCatch; -import spoon.reflect.code.CtFor; -import spoon.reflect.code.CtLiteral; -import spoon.reflect.code.CtStatement; -import spoon.reflect.code.CtTry; -import spoon.reflect.code.CtWhile; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtConstructor; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.ParentNotInitializedException; -import spoon.reflect.factory.Factory; -import spoon.test.ctBodyHolder.testclasses.CWBStatementTemplate; -import spoon.test.ctBodyHolder.testclasses.ClassWithBodies; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; -import static spoon.testing.utils.ModelUtils.build; - -public class CtBodyHolderTest { - - @Test - public void testConstructor() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(1, cwbClass.getConstructors().size()); - CtConstructor constructor = cwbClass.getConstructor(); - checkCtBody(constructor, "constructor_body", 1); - } - - @Test - public void testMethod() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(2, cwbClass.getMethods().size()); - CtMethod method = cwbClass.getMethod("method"); - checkCtBody(method, "method_body", 0); - } - - @Test - public void testTryCatch() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(2, cwbClass.getMethods().size()); - CtMethod method = cwbClass.getMethod("method2"); - CtBlock methodBody = method.getBody(); - assertTrue(methodBody.getStatement(0) instanceof CtTry); - CtTry tryStmnt = (CtTry) methodBody.getStatement(0); - checkCtBody(tryStmnt, "try_body", 0); - assertEquals(1, tryStmnt.getCatchers().size()); - assertTrue(tryStmnt.getCatchers().get(0) instanceof CtCatch); - checkCtBody(tryStmnt.getCatchers().get(0), "catch_body", 0); - } - - @Test - public void testForWithStatement() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(2, cwbClass.getMethods().size()); - CtMethod method = cwbClass.getMethod("method2"); - CtBlock methodBody = method.getBody(); - assertTrue(methodBody.getStatement(1) instanceof CtFor); - CtFor forStmnt = (CtFor) methodBody.getStatement(1); - checkCtBody(forStmnt, "for_statemnt", 0); - } - - @Test - public void testForWithBlock() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(2, cwbClass.getMethods().size()); - CtMethod method = cwbClass.getMethod("method2"); - CtBlock methodBody = method.getBody(); - assertTrue(methodBody.getStatement(2) instanceof CtFor); - CtFor forStmnt = (CtFor) methodBody.getStatement(2); - checkCtBody(forStmnt, "for_block", 0); - } - - @Test - public void testWhileWithBlock() throws Exception { - Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); - CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); - assertEquals(2, cwbClass.getMethods().size()); - CtMethod method = cwbClass.getMethod("method2"); - CtBlock methodBody = method.getBody(); - assertTrue(methodBody.getStatement(3) instanceof CtWhile); - CtWhile whileStmnt = (CtWhile) methodBody.getStatement(3); - checkCtBody(whileStmnt, "while_block", 0); - } - - private void checkCtBody(CtBodyHolder p_bodyHolder, String p_constant, int off) { - CtStatement body = p_bodyHolder.getBody(); - assertTrue(body instanceof CtBlock); - - CtBlock block = (CtBlock) body; - assertEquals(1 + off, block.getStatements().size()); - - assertTrue(block.getStatement(off) instanceof CtAssignment); - - CtAssignment assignment = block.getStatement(off); - assertEquals(p_constant, ((CtLiteral) assignment.getAssignment().partiallyEvaluate()).getValue()); - - Factory f = body.getFactory(); - - CtStatement newStat = new CWBStatementTemplate("xx").apply(body.getParent(CtType.class)); - try { - newStat.getParent(); - fail(); - } catch (ParentNotInitializedException e) { - //expected exception - } - //try to set statement and get CtBlock - p_bodyHolder.setBody(newStat); - CtBlock newBlock = (CtBlock) p_bodyHolder.getBody(); - assertSame(p_bodyHolder, newBlock.getParent()); - assertSame(newBlock, newStat.getParent()); - - //try to set CtBlock and get the same CtBlock - CtStatement newStat2 = newStat.clone(); - try { - newStat2.getParent(); - fail(); - } catch (ParentNotInitializedException e) { - //expected exception - } - CtBlock newBlock2 = f.Code().createCtBlock(newStat2); - assertSame(newBlock2, newStat2.getParent()); - try { - newBlock2.getParent(); - fail(); - } catch (ParentNotInitializedException e) { - //expected exception - } - - p_bodyHolder.setBody(newBlock2); - assertSame(newBlock2, p_bodyHolder.getBody()); - assertSame(p_bodyHolder, newBlock2.getParent()); - assertSame(newBlock2, newStat2.getParent()); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.ctBodyHolder; + +import org.junit.jupiter.api.Test; +import spoon.reflect.code.CtAssignment; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtBodyHolder; +import spoon.reflect.code.CtCatch; +import spoon.reflect.code.CtFor; +import spoon.reflect.code.CtLiteral; +import spoon.reflect.code.CtStatement; +import spoon.reflect.code.CtTry; +import spoon.reflect.code.CtWhile; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtConstructor; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.ParentNotInitializedException; +import spoon.reflect.factory.Factory; +import spoon.test.ctBodyHolder.testclasses.CWBStatementTemplate; +import spoon.test.ctBodyHolder.testclasses.ClassWithBodies; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static spoon.testing.utils.ModelUtils.build; + +public class CtBodyHolderTest { + + @Test + public void testConstructor() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(1, cwbClass.getConstructors().size()); + CtConstructor constructor = cwbClass.getConstructor(); + checkCtBody(constructor, "constructor_body", 1); + } + + @Test + public void testMethod() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(2, cwbClass.getMethods().size()); + CtMethod method = cwbClass.getMethod("method"); + checkCtBody(method, "method_body", 0); + } + + @Test + public void testTryCatch() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(2, cwbClass.getMethods().size()); + CtMethod method = cwbClass.getMethod("method2"); + CtBlock methodBody = method.getBody(); + assertTrue(methodBody.getStatement(0) instanceof CtTry); + CtTry tryStmnt = (CtTry) methodBody.getStatement(0); + checkCtBody(tryStmnt, "try_body", 0); + assertEquals(1, tryStmnt.getCatchers().size()); + assertTrue(tryStmnt.getCatchers().get(0) instanceof CtCatch); + checkCtBody(tryStmnt.getCatchers().get(0), "catch_body", 0); + } + + @Test + public void testForWithStatement() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(2, cwbClass.getMethods().size()); + CtMethod method = cwbClass.getMethod("method2"); + CtBlock methodBody = method.getBody(); + assertTrue(methodBody.getStatement(1) instanceof CtFor); + CtFor forStmnt = (CtFor) methodBody.getStatement(1); + checkCtBody(forStmnt, "for_statemnt", 0); + } + + @Test + public void testForWithBlock() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(2, cwbClass.getMethods().size()); + CtMethod method = cwbClass.getMethod("method2"); + CtBlock methodBody = method.getBody(); + assertTrue(methodBody.getStatement(2) instanceof CtFor); + CtFor forStmnt = (CtFor) methodBody.getStatement(2); + checkCtBody(forStmnt, "for_block", 0); + } + + @Test + public void testWhileWithBlock() throws Exception { + Factory factory = build(ClassWithBodies.class, CWBStatementTemplate.class); + CtClass cwbClass = (CtClass) factory.Type().get(ClassWithBodies.class); + assertEquals(2, cwbClass.getMethods().size()); + CtMethod method = cwbClass.getMethod("method2"); + CtBlock methodBody = method.getBody(); + assertTrue(methodBody.getStatement(3) instanceof CtWhile); + CtWhile whileStmnt = (CtWhile) methodBody.getStatement(3); + checkCtBody(whileStmnt, "while_block", 0); + } + + private void checkCtBody(CtBodyHolder p_bodyHolder, String p_constant, int off) { + CtStatement body = p_bodyHolder.getBody(); + assertTrue(body instanceof CtBlock); + + CtBlock block = (CtBlock) body; + assertEquals(1 + off, block.getStatements().size()); + + assertTrue(block.getStatement(off) instanceof CtAssignment); + + CtAssignment assignment = block.getStatement(off); + assertEquals(p_constant, ((CtLiteral) assignment.getAssignment().partiallyEvaluate()).getValue()); + + Factory f = body.getFactory(); + + CtStatement newStat = new CWBStatementTemplate("xx").apply(body.getParent(CtType.class)); + try { + newStat.getParent(); + fail(); + } catch (ParentNotInitializedException e) { + //expected exception + } + //try to set statement and get CtBlock + p_bodyHolder.setBody(newStat); + CtBlock newBlock = (CtBlock) p_bodyHolder.getBody(); + assertSame(p_bodyHolder, newBlock.getParent()); + assertSame(newBlock, newStat.getParent()); + + //try to set CtBlock and get the same CtBlock + CtStatement newStat2 = newStat.clone(); + try { + newStat2.getParent(); + fail(); + } catch (ParentNotInitializedException e) { + //expected exception + } + CtBlock newBlock2 = f.Code().createCtBlock(newStat2); + assertSame(newBlock2, newStat2.getParent()); + try { + newBlock2.getParent(); + fail(); + } catch (ParentNotInitializedException e) { + //expected exception + } + + p_bodyHolder.setBody(newBlock2); + assertSame(newBlock2, p_bodyHolder.getBody()); + assertSame(p_bodyHolder, newBlock2.getParent()); + assertSame(newBlock2, newStat2.getParent()); + } +} diff --git a/src/test/java/spoon/test/ctCase/CtCaseTest.java b/src/test/java/spoon/test/ctCase/CtCaseTest.java index 3129a036a40..6ca08f37181 100644 --- a/src/test/java/spoon/test/ctCase/CtCaseTest.java +++ b/src/test/java/spoon/test/ctCase/CtCaseTest.java @@ -16,16 +16,8 @@ */ package spoon.test.ctCase; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertSame; -import static spoon.testing.utils.ModelUtils.build; - import java.util.List; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.code.CtCase; import spoon.reflect.code.CtStatement; @@ -35,6 +27,12 @@ import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.TypeFilter; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static spoon.testing.utils.ModelUtils.build; + @SuppressWarnings({"unchecked", "rawtypes"}) public class CtCaseTest { diff --git a/src/test/java/spoon/test/ctClass/CtClassTest.java b/src/test/java/spoon/test/ctClass/CtClassTest.java index 2db57a49f45..b2d4e8bd70a 100644 --- a/src/test/java/spoon/test/ctClass/CtClassTest.java +++ b/src/test/java/spoon/test/ctClass/CtClassTest.java @@ -19,12 +19,9 @@ import java.io.File; import java.util.Set; - import java.util.concurrent.TimeUnit; - import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; @@ -366,7 +363,7 @@ public void testCloneAnonymousClassInvocationWithAutoimports() { public void test_buildParameterizedClass_withTypeParameterUsedInQualifiedName() { // contract: It should be possible to build a generic class when one of the type parameters // is used in the qualified name of another type. - // + // // See https://github.com/INRIA/spoon/issues/3903 CtClass cls = Launcher.parseClass( diff --git a/src/test/java/spoon/test/ctStatementList/CtStatementListTest.java b/src/test/java/spoon/test/ctStatementList/CtStatementListTest.java index fda8ec21d7e..7f4b7cb1e9a 100644 --- a/src/test/java/spoon/test/ctStatementList/CtStatementListTest.java +++ b/src/test/java/spoon/test/ctStatementList/CtStatementListTest.java @@ -22,113 +22,112 @@ import spoon.reflect.code.CtStatementList; import spoon.reflect.factory.Factory; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.is; - +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; public class CtStatementListTest { - private static CtStatementList getStatementListInitializedWithOneStatement() { - Factory factory = new Launcher().getFactory(); - CtStatementList statementList = factory.Core().createStatementList(); - statementList.addStatement(factory.createCodeSnippetStatement("int preExisting = 0;").compile()); - return statementList; - } - - @Test - void testInsertBeginWithListOfStatements() { - // contract: insertBegin adds a list of statements at the beginning of the statementList - - // arrange - CtStatementList mainStatementList = getStatementListInitializedWithOneStatement(); - Factory factory = mainStatementList.getFactory(); - CtStatement firstStatementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1;").compile(); - CtStatement secondStatementToBeInserted = factory.Code().createCodeSnippetStatement("int second = 2;").compile(); - - CtStatementList statementListToBeAddedToTheMainList = factory.Core().createStatementList(); - statementListToBeAddedToTheMainList.addStatement(firstStatementToBeInserted); - statementListToBeAddedToTheMainList.addStatement(secondStatementToBeInserted); - - // act - mainStatementList.insertBegin(statementListToBeAddedToTheMainList); - - // assert - CtStatement statementAtTheBeginningAfterInsertion = mainStatementList.getStatements().get(0); - CtStatement secondStatementAtTheBeginningOfTheListAfterInsertion = mainStatementList.getStatements().get(1); - - assertEquals(firstStatementToBeInserted, statementAtTheBeginningAfterInsertion); - assertEquals(secondStatementToBeInserted, secondStatementAtTheBeginningOfTheListAfterInsertion); - - assertThat(firstStatementToBeInserted.getParent(), is(mainStatementList)); - assertThat(secondStatementToBeInserted.getParent(), is(mainStatementList)); - } - - @Test - void testInsertBeginWithSingleStatement() { - // contract: insertBegin adds a statement at the beginning of the statementList - - CtStatementList statementList = getStatementListInitializedWithOneStatement(); - Factory factory = statementList.getFactory(); - CtStatement statementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1").compile(); - - statementList.insertBegin(statementToBeInserted); - - CtStatement statementAtTheBeginningAfterInsertion = statementList.getStatements().get(0); - assertThat(statementAtTheBeginningAfterInsertion, is(statementToBeInserted)); - assertThat(statementAtTheBeginningAfterInsertion.getParent(), is(statementList)); - } - - @Test - void testRemoveStatement() { - // contract: removeStatement removes a statement form a StatementList having a single statement - - CtStatementList statementList = getStatementListInitializedWithOneStatement(); - assertThat(statementList.getStatements().size(), is(1)); - - statementList.removeStatement(statementList.getStatements().get(0)); - - assertThat(statementList.getStatements().size(), is(0)); - } - - @Test - void testInsertEndWithSingleStatement() { - // contract: insertEnd adds a statement at the end of a StatementList, i.e below an already existing statement - - CtStatementList statementList = getStatementListInitializedWithOneStatement(); - Factory factory = statementList.getFactory(); - CtStatement statementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1;").compile(); - - statementList.insertEnd(statementToBeInserted); - - int lastStatementIndex = statementList.getStatements().size() - 1; - assertThat(statementList.getStatement(lastStatementIndex), is(statementToBeInserted)); - assertThat(statementToBeInserted.getParent(), is(statementList)); - } - - @Test - void testInsertEndWithListOfStatements() { - // contract: insertEnd adds a list of statements at the end of a statementList, i.e the list is added below an - // existing statement, and the order of statements in the list remains the same - - // arrange - CtStatementList mainStatementList = getStatementListInitializedWithOneStatement(); - Factory factory = mainStatementList.getFactory(); - CtStatement firstStatementToBeInserted = factory.createCodeSnippetStatement("int first = 1;").compile(); - CtStatement secondStatementToBeInserted = factory.createCodeSnippetStatement("int second = 2;").compile(); - - CtStatementList statementList = factory.Core().createStatementList(); - statementList.addStatement(firstStatementToBeInserted); - statementList.addStatement(secondStatementToBeInserted); - - // act - mainStatementList.insertEnd(statementList); - - // assert - int lastStatementIndex = mainStatementList.getStatements().size() - 1; - int secondLastStatementIndex = lastStatementIndex - 1; - assertThat(mainStatementList.getStatement(secondLastStatementIndex), is(firstStatementToBeInserted)); - assertThat(mainStatementList.getStatement(lastStatementIndex), is(secondStatementToBeInserted)); - assertThat(firstStatementToBeInserted.getParent(), is(mainStatementList)); - assertThat(secondStatementToBeInserted.getParent(), is(mainStatementList)); - } + private static CtStatementList getStatementListInitializedWithOneStatement() { + Factory factory = new Launcher().getFactory(); + CtStatementList statementList = factory.Core().createStatementList(); + statementList.addStatement(factory.createCodeSnippetStatement("int preExisting = 0;").compile()); + return statementList; + } + + @Test + void testInsertBeginWithListOfStatements() { + // contract: insertBegin adds a list of statements at the beginning of the statementList + + // arrange + CtStatementList mainStatementList = getStatementListInitializedWithOneStatement(); + Factory factory = mainStatementList.getFactory(); + CtStatement firstStatementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1;").compile(); + CtStatement secondStatementToBeInserted = factory.Code().createCodeSnippetStatement("int second = 2;").compile(); + + CtStatementList statementListToBeAddedToTheMainList = factory.Core().createStatementList(); + statementListToBeAddedToTheMainList.addStatement(firstStatementToBeInserted); + statementListToBeAddedToTheMainList.addStatement(secondStatementToBeInserted); + + // act + mainStatementList.insertBegin(statementListToBeAddedToTheMainList); + + // assert + CtStatement statementAtTheBeginningAfterInsertion = mainStatementList.getStatements().get(0); + CtStatement secondStatementAtTheBeginningOfTheListAfterInsertion = mainStatementList.getStatements().get(1); + + assertEquals(firstStatementToBeInserted, statementAtTheBeginningAfterInsertion); + assertEquals(secondStatementToBeInserted, secondStatementAtTheBeginningOfTheListAfterInsertion); + + assertThat(firstStatementToBeInserted.getParent(), is(mainStatementList)); + assertThat(secondStatementToBeInserted.getParent(), is(mainStatementList)); + } + + @Test + void testInsertBeginWithSingleStatement() { + // contract: insertBegin adds a statement at the beginning of the statementList + + CtStatementList statementList = getStatementListInitializedWithOneStatement(); + Factory factory = statementList.getFactory(); + CtStatement statementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1").compile(); + + statementList.insertBegin(statementToBeInserted); + + CtStatement statementAtTheBeginningAfterInsertion = statementList.getStatements().get(0); + assertThat(statementAtTheBeginningAfterInsertion, is(statementToBeInserted)); + assertThat(statementAtTheBeginningAfterInsertion.getParent(), is(statementList)); + } + + @Test + void testRemoveStatement() { + // contract: removeStatement removes a statement form a StatementList having a single statement + + CtStatementList statementList = getStatementListInitializedWithOneStatement(); + assertThat(statementList.getStatements().size(), is(1)); + + statementList.removeStatement(statementList.getStatements().get(0)); + + assertThat(statementList.getStatements().size(), is(0)); + } + + @Test + void testInsertEndWithSingleStatement() { + // contract: insertEnd adds a statement at the end of a StatementList, i.e below an already existing statement + + CtStatementList statementList = getStatementListInitializedWithOneStatement(); + Factory factory = statementList.getFactory(); + CtStatement statementToBeInserted = factory.Code().createCodeSnippetStatement("int first = 1;").compile(); + + statementList.insertEnd(statementToBeInserted); + + int lastStatementIndex = statementList.getStatements().size() - 1; + assertThat(statementList.getStatement(lastStatementIndex), is(statementToBeInserted)); + assertThat(statementToBeInserted.getParent(), is(statementList)); + } + + @Test + void testInsertEndWithListOfStatements() { + // contract: insertEnd adds a list of statements at the end of a statementList, i.e the list is added below an + // existing statement, and the order of statements in the list remains the same + + // arrange + CtStatementList mainStatementList = getStatementListInitializedWithOneStatement(); + Factory factory = mainStatementList.getFactory(); + CtStatement firstStatementToBeInserted = factory.createCodeSnippetStatement("int first = 1;").compile(); + CtStatement secondStatementToBeInserted = factory.createCodeSnippetStatement("int second = 2;").compile(); + + CtStatementList statementList = factory.Core().createStatementList(); + statementList.addStatement(firstStatementToBeInserted); + statementList.addStatement(secondStatementToBeInserted); + + // act + mainStatementList.insertEnd(statementList); + + // assert + int lastStatementIndex = mainStatementList.getStatements().size() - 1; + int secondLastStatementIndex = lastStatementIndex - 1; + assertThat(mainStatementList.getStatement(secondLastStatementIndex), is(firstStatementToBeInserted)); + assertThat(mainStatementList.getStatement(lastStatementIndex), is(secondStatementToBeInserted)); + assertThat(firstStatementToBeInserted.getParent(), is(mainStatementList)); + assertThat(secondStatementToBeInserted.getParent(), is(mainStatementList)); + } } diff --git a/src/test/java/spoon/test/ctType/CtTypeParameterTest.java b/src/test/java/spoon/test/ctType/CtTypeParameterTest.java index 8a9256eac3a..3398edf47e5 100644 --- a/src/test/java/spoon/test/ctType/CtTypeParameterTest.java +++ b/src/test/java/spoon/test/ctType/CtTypeParameterTest.java @@ -1,237 +1,236 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and abiding by the rules of - * distribution of free software. You can use, modify and/or redistribute the software under the - * terms of the CeCILL-C license as circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had knowledge of the CeCILL-C - * license and that you accept its terms. - */ -package spoon.test.ctType; - -import java.lang.reflect.Executable; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.List; - -import org.junit.jupiter.api.Test; -import spoon.FluentLauncher; -import spoon.processing.AbstractProcessor; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtConstructor; -import spoon.reflect.declaration.CtExecutable; -import spoon.reflect.declaration.CtFormalTypeDeclarer; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtParameter; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtTypeMember; -import spoon.reflect.declaration.CtTypeParameter; -import spoon.reflect.reference.CtTypeReference; -import spoon.reflect.visitor.filter.NamedElementFilter; -import spoon.test.ctType.testclasses.ErasureModelA; -import spoon.testing.utils.ModelUtils; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -public class CtTypeParameterTest { - - @Test - public void testTypeErasure() throws Exception { - //contract: the type erasure computed by getTypeErasure is same as the one computed by the Java compiler - CtClass ctModel = (CtClass) ModelUtils.buildClass(ErasureModelA.class); - //visit all methods of type ctModel - //visit all inner types and their methods recursively `getTypeErasure` returns expected value - //for each formal type parameter or method parameter check if - checkType(ctModel); - } - - private void checkType(CtType type) throws NoSuchFieldException, SecurityException { - List formalTypeParameters = type.getFormalCtTypeParameters(); - for (CtTypeParameter ctTypeParameter : formalTypeParameters) { - checkTypeParamErasureOfType(ctTypeParameter, type.getActualClass()); - } - - for (CtTypeMember member : type.getTypeMembers()) { - if (member instanceof CtFormalTypeDeclarer) { - CtFormalTypeDeclarer ftDecl = (CtFormalTypeDeclarer) member; - formalTypeParameters = ftDecl.getFormalCtTypeParameters(); - if (member instanceof CtExecutable) { - CtExecutable exec = (CtExecutable) member; - for (CtTypeParameter ctTypeParameter : formalTypeParameters) { - checkTypeParamErasureOfExecutable(ctTypeParameter); - } - for (CtParameter param : exec.getParameters()) { - checkParameterErasureOfExecutable(param); - } - } else if (member instanceof CtType) { - CtType nestedType = (CtType) member; - // recursive call for nested type - checkType(nestedType); - } - } - } - } - - private void checkTypeParamErasureOfType(CtTypeParameter typeParam, Class clazz) throws NoSuchFieldException, SecurityException { - Field field = clazz.getDeclaredField("param" + typeParam.getSimpleName()); - assertEquals(field.getType().getName(), typeParam.getTypeErasure().getQualifiedName(), "TypeErasure of type param " + getTypeParamIdentification(typeParam)); - } - - private void checkTypeParamErasureOfExecutable(CtTypeParameter typeParam) throws SecurityException { - CtExecutable exec = (CtExecutable) typeParam.getParent(); - CtParameter param = exec.filterChildren(new NamedElementFilter<>(CtParameter.class, "param" + typeParam.getSimpleName())).first(); - assertNotNull(param, "Missing param" + typeParam.getSimpleName() + " in " + exec.getSignature()); - int paramIdx = exec.getParameters().indexOf(param); - Class declClass = exec.getParent(CtType.class).getActualClass(); - Executable declExec; - if (exec instanceof CtConstructor) { - declExec = declClass.getDeclaredConstructors()[0]; - } else { - declExec = getMethodByName(declClass, exec.getSimpleName()); - } - Class paramType = declExec.getParameterTypes()[paramIdx]; - // contract the type erasure given with Java reflection is the same as the one computed by spoon - assertEquals(paramType.getTypeName(), param.getType().getTypeErasure().toString(), "TypeErasure of executable param " + getTypeParamIdentification(typeParam)); - } - - private void checkParameterErasureOfExecutable(CtParameter param) { - CtExecutable exec = param.getParent(); - CtTypeReference typeErasure = param.getType().getTypeErasure(); - int paramIdx = exec.getParameters().indexOf(param); - Class declClass = exec.getParent(CtType.class).getActualClass(); - Executable declExec; - if (exec instanceof CtConstructor) { - declExec = declClass.getDeclaredConstructors()[0]; - } else { - declExec = getMethodByName(declClass, exec.getSimpleName()); - } - Class paramType = declExec.getParameterTypes()[paramIdx]; - assertEquals(0, typeErasure.getActualTypeArguments().size()); - // contract the type erasure of the method parameter given with Java reflection is the same as the one computed by spoon - assertEquals(paramType.getTypeName(), typeErasure.getQualifiedName(), "TypeErasure of executable " + exec.getSignature() + " parameter " + param.getSimpleName()); - } - - private Executable getMethodByName(Class declClass, String simpleName) { - for (Method method : declClass.getDeclaredMethods()) { - if (method.getName().equals(simpleName)) { - return method; - } - } - fail("Method " + simpleName + " not found in " + declClass.getName()); - return null; - } - - private String getTypeParamIdentification(CtTypeParameter typeParam) { - String result = "<" + typeParam.getSimpleName() + ">"; - CtFormalTypeDeclarer l_decl = typeParam.getParent(CtFormalTypeDeclarer.class); - if (l_decl instanceof CtType) { - return ((CtType) l_decl).getQualifiedName() + result; - } - if (l_decl instanceof CtExecutable) { - CtExecutable exec = (CtExecutable) l_decl; - if (exec instanceof CtMethod) { - result = exec.getSignature() + result; - } - return exec.getParent(CtType.class).getQualifiedName() + "#" + result; - } - throw new AssertionError(); - } - - @Test - public void testTypeSame() throws Exception { - CtClass ctModel = (CtClass) ModelUtils.buildClass(ErasureModelA.class); - CtTypeParameter tpA = ctModel.getFormalCtTypeParameters().get(0); - CtTypeParameter tpB = ctModel.getFormalCtTypeParameters().get(1); - CtTypeParameter tpC = ctModel.getFormalCtTypeParameters().get(2); - CtTypeParameter tpD = ctModel.getFormalCtTypeParameters().get(3); - - CtConstructor ctModelCons = ctModel.getConstructors().iterator().next(); - CtMethod ctModelMethod = ctModel.getMethodsByName("method").get(0); - CtMethod ctModelMethod2 = ctModel.getMethodsByName("method2").get(0); - - CtClass ctModelB = ctModel.filterChildren(new NamedElementFilter<>(CtClass.class, "ModelB")).first(); - CtTypeParameter tpA2 = ctModelB.getFormalCtTypeParameters().get(0); - CtTypeParameter tpB2 = ctModelB.getFormalCtTypeParameters().get(1); - CtTypeParameter tpC2 = ctModelB.getFormalCtTypeParameters().get(2); - CtTypeParameter tpD2 = ctModelB.getFormalCtTypeParameters().get(3); - - CtConstructor ctModelBCons = ctModelB.getConstructors().iterator().next(); - CtMethod ctModelBMethod = ctModelB.getMethodsByName("method").get(0); - - //the type parameters of ErasureModelA and ErasureModelA$ModelB are same if they are on the same position. - checkIsSame(ctModel.getFormalCtTypeParameters(), ctModelB.getFormalCtTypeParameters(), true); - - //the type parameters of ErasureModelA#constructor and ErasureModelA$ModelB constructor are same, because constructors has same formal type parameters - //https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.4 - checkIsSame(ctModelCons.getFormalCtTypeParameters(), ctModelBCons.getFormalCtTypeParameters(), true); - //the type parameters of ctModel ErasureModelA#method and ErasureModelA$ModelB#method are same if they are on the same position. - checkIsSame(ctModelMethod.getFormalCtTypeParameters(), ctModelBMethod.getFormalCtTypeParameters(), true); - - //the type parameters of ctModel ErasureModelA#constructor and ErasureModelA$ModelB#method are never same, because they have different type of scope (Method!=Constructor) - checkIsSame(ctModelCons.getFormalCtTypeParameters(), ctModelBMethod.getFormalCtTypeParameters(), false); - //the type parameters of ctModel ErasureModelA#method and ErasureModelA#method2 are same, because they have same formal type parameters - //https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.4 - checkIsSame(ctModelMethod.getFormalCtTypeParameters(), ctModelMethod2.getFormalCtTypeParameters(), true); - - CtClass ctModelC = ctModel.filterChildren(new NamedElementFilter<>(CtClass.class, "ModelC")).first(); - } - - /** - * checks that parameters on the same position are same and parameters on other positions are not same - * - * @param isSameOnSameIndex TODO - */ - private void checkIsSame(List tps1, List tps2, boolean isSameOnSameIndex) { - for (int i = 0; i < tps1.size(); i++) { - CtTypeParameter tp1 = tps1.get(i); - for (int j = 0; j < tps2.size(); j++) { - CtTypeParameter tp2 = tps2.get(j); - if (i == j && isSameOnSameIndex) { - checkIsSame(tp1, tp2); - } else { - checkIsNotSame(tp1, tp2); - } - } - } - } - - private void checkIsSame(CtTypeParameter tp1, CtTypeParameter tp2) { - assertTrue(isSame(tp1, tp2, false, true) || isSame(tp2, tp1, false, true)); - } - - private void checkIsNotSame(CtTypeParameter tp1, CtTypeParameter tp2) { - assertFalse(isSame(tp1, tp2, false, true) || isSame(tp2, tp1, false, true)); - } - - private static boolean isSame(CtTypeParameter thisType, CtTypeParameter thatType, boolean canTypeErasure, boolean checkMethodOverrides) { - CtTypeReference thatAdaptedType = thisType.getFactory().Type().createTypeAdapter(thisType.getTypeParameterDeclarer()).adaptType(thatType); - if (thatAdaptedType == null) { - return false; - } - return thisType.getQualifiedName().equals(thatAdaptedType.getQualifiedName()); - } - - @Test - public void test() { - // testcase for issue 3275. The issue was a nullpointer in this code. Was fixed in #3276 - new FluentLauncher() - .inputResource("src/test/resources/issue3275/BOMCostPrice.java") - .noClasspath(true) - .processor(new AbstractProcessor>() { - public void process(CtTypeReference element) { - // just a operation to enforce the method - String a = element.getSimpleName(); - } - }) - .buildModel(); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and abiding by the rules of + * distribution of free software. You can use, modify and/or redistribute the software under the + * terms of the CeCILL-C license as circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL-C + * license and that you accept its terms. + */ +package spoon.test.ctType; + +import java.lang.reflect.Executable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import org.junit.jupiter.api.Test; +import spoon.FluentLauncher; +import spoon.processing.AbstractProcessor; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtConstructor; +import spoon.reflect.declaration.CtExecutable; +import spoon.reflect.declaration.CtFormalTypeDeclarer; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtParameter; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtTypeMember; +import spoon.reflect.declaration.CtTypeParameter; +import spoon.reflect.reference.CtTypeReference; +import spoon.reflect.visitor.filter.NamedElementFilter; +import spoon.test.ctType.testclasses.ErasureModelA; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +public class CtTypeParameterTest { + + @Test + public void testTypeErasure() throws Exception { + //contract: the type erasure computed by getTypeErasure is same as the one computed by the Java compiler + CtClass ctModel = (CtClass) ModelUtils.buildClass(ErasureModelA.class); + //visit all methods of type ctModel + //visit all inner types and their methods recursively `getTypeErasure` returns expected value + //for each formal type parameter or method parameter check if + checkType(ctModel); + } + + private void checkType(CtType type) throws NoSuchFieldException, SecurityException { + List formalTypeParameters = type.getFormalCtTypeParameters(); + for (CtTypeParameter ctTypeParameter : formalTypeParameters) { + checkTypeParamErasureOfType(ctTypeParameter, type.getActualClass()); + } + + for (CtTypeMember member : type.getTypeMembers()) { + if (member instanceof CtFormalTypeDeclarer) { + CtFormalTypeDeclarer ftDecl = (CtFormalTypeDeclarer) member; + formalTypeParameters = ftDecl.getFormalCtTypeParameters(); + if (member instanceof CtExecutable) { + CtExecutable exec = (CtExecutable) member; + for (CtTypeParameter ctTypeParameter : formalTypeParameters) { + checkTypeParamErasureOfExecutable(ctTypeParameter); + } + for (CtParameter param : exec.getParameters()) { + checkParameterErasureOfExecutable(param); + } + } else if (member instanceof CtType) { + CtType nestedType = (CtType) member; + // recursive call for nested type + checkType(nestedType); + } + } + } + } + + private void checkTypeParamErasureOfType(CtTypeParameter typeParam, Class clazz) throws NoSuchFieldException, SecurityException { + Field field = clazz.getDeclaredField("param" + typeParam.getSimpleName()); + assertEquals(field.getType().getName(), typeParam.getTypeErasure().getQualifiedName(), "TypeErasure of type param " + getTypeParamIdentification(typeParam)); + } + + private void checkTypeParamErasureOfExecutable(CtTypeParameter typeParam) throws SecurityException { + CtExecutable exec = (CtExecutable) typeParam.getParent(); + CtParameter param = exec.filterChildren(new NamedElementFilter<>(CtParameter.class, "param" + typeParam.getSimpleName())).first(); + assertNotNull(param, "Missing param" + typeParam.getSimpleName() + " in " + exec.getSignature()); + int paramIdx = exec.getParameters().indexOf(param); + Class declClass = exec.getParent(CtType.class).getActualClass(); + Executable declExec; + if (exec instanceof CtConstructor) { + declExec = declClass.getDeclaredConstructors()[0]; + } else { + declExec = getMethodByName(declClass, exec.getSimpleName()); + } + Class paramType = declExec.getParameterTypes()[paramIdx]; + // contract the type erasure given with Java reflection is the same as the one computed by spoon + assertEquals(paramType.getTypeName(), param.getType().getTypeErasure().toString(), "TypeErasure of executable param " + getTypeParamIdentification(typeParam)); + } + + private void checkParameterErasureOfExecutable(CtParameter param) { + CtExecutable exec = param.getParent(); + CtTypeReference typeErasure = param.getType().getTypeErasure(); + int paramIdx = exec.getParameters().indexOf(param); + Class declClass = exec.getParent(CtType.class).getActualClass(); + Executable declExec; + if (exec instanceof CtConstructor) { + declExec = declClass.getDeclaredConstructors()[0]; + } else { + declExec = getMethodByName(declClass, exec.getSimpleName()); + } + Class paramType = declExec.getParameterTypes()[paramIdx]; + assertEquals(0, typeErasure.getActualTypeArguments().size()); + // contract the type erasure of the method parameter given with Java reflection is the same as the one computed by spoon + assertEquals(paramType.getTypeName(), typeErasure.getQualifiedName(), "TypeErasure of executable " + exec.getSignature() + " parameter " + param.getSimpleName()); + } + + private Executable getMethodByName(Class declClass, String simpleName) { + for (Method method : declClass.getDeclaredMethods()) { + if (method.getName().equals(simpleName)) { + return method; + } + } + fail("Method " + simpleName + " not found in " + declClass.getName()); + return null; + } + + private String getTypeParamIdentification(CtTypeParameter typeParam) { + String result = "<" + typeParam.getSimpleName() + ">"; + CtFormalTypeDeclarer l_decl = typeParam.getParent(CtFormalTypeDeclarer.class); + if (l_decl instanceof CtType) { + return ((CtType) l_decl).getQualifiedName() + result; + } + if (l_decl instanceof CtExecutable) { + CtExecutable exec = (CtExecutable) l_decl; + if (exec instanceof CtMethod) { + result = exec.getSignature() + result; + } + return exec.getParent(CtType.class).getQualifiedName() + "#" + result; + } + throw new AssertionError(); + } + + @Test + public void testTypeSame() throws Exception { + CtClass ctModel = (CtClass) ModelUtils.buildClass(ErasureModelA.class); + CtTypeParameter tpA = ctModel.getFormalCtTypeParameters().get(0); + CtTypeParameter tpB = ctModel.getFormalCtTypeParameters().get(1); + CtTypeParameter tpC = ctModel.getFormalCtTypeParameters().get(2); + CtTypeParameter tpD = ctModel.getFormalCtTypeParameters().get(3); + + CtConstructor ctModelCons = ctModel.getConstructors().iterator().next(); + CtMethod ctModelMethod = ctModel.getMethodsByName("method").get(0); + CtMethod ctModelMethod2 = ctModel.getMethodsByName("method2").get(0); + + CtClass ctModelB = ctModel.filterChildren(new NamedElementFilter<>(CtClass.class, "ModelB")).first(); + CtTypeParameter tpA2 = ctModelB.getFormalCtTypeParameters().get(0); + CtTypeParameter tpB2 = ctModelB.getFormalCtTypeParameters().get(1); + CtTypeParameter tpC2 = ctModelB.getFormalCtTypeParameters().get(2); + CtTypeParameter tpD2 = ctModelB.getFormalCtTypeParameters().get(3); + + CtConstructor ctModelBCons = ctModelB.getConstructors().iterator().next(); + CtMethod ctModelBMethod = ctModelB.getMethodsByName("method").get(0); + + //the type parameters of ErasureModelA and ErasureModelA$ModelB are same if they are on the same position. + checkIsSame(ctModel.getFormalCtTypeParameters(), ctModelB.getFormalCtTypeParameters(), true); + + //the type parameters of ErasureModelA#constructor and ErasureModelA$ModelB constructor are same, because constructors has same formal type parameters + //https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.4 + checkIsSame(ctModelCons.getFormalCtTypeParameters(), ctModelBCons.getFormalCtTypeParameters(), true); + //the type parameters of ctModel ErasureModelA#method and ErasureModelA$ModelB#method are same if they are on the same position. + checkIsSame(ctModelMethod.getFormalCtTypeParameters(), ctModelBMethod.getFormalCtTypeParameters(), true); + + //the type parameters of ctModel ErasureModelA#constructor and ErasureModelA$ModelB#method are never same, because they have different type of scope (Method!=Constructor) + checkIsSame(ctModelCons.getFormalCtTypeParameters(), ctModelBMethod.getFormalCtTypeParameters(), false); + //the type parameters of ctModel ErasureModelA#method and ErasureModelA#method2 are same, because they have same formal type parameters + //https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.4 + checkIsSame(ctModelMethod.getFormalCtTypeParameters(), ctModelMethod2.getFormalCtTypeParameters(), true); + + CtClass ctModelC = ctModel.filterChildren(new NamedElementFilter<>(CtClass.class, "ModelC")).first(); + } + + /** + * checks that parameters on the same position are same and parameters on other positions are not same + * + * @param isSameOnSameIndex TODO + */ + private void checkIsSame(List tps1, List tps2, boolean isSameOnSameIndex) { + for (int i = 0; i < tps1.size(); i++) { + CtTypeParameter tp1 = tps1.get(i); + for (int j = 0; j < tps2.size(); j++) { + CtTypeParameter tp2 = tps2.get(j); + if (i == j && isSameOnSameIndex) { + checkIsSame(tp1, tp2); + } else { + checkIsNotSame(tp1, tp2); + } + } + } + } + + private void checkIsSame(CtTypeParameter tp1, CtTypeParameter tp2) { + assertTrue(isSame(tp1, tp2, false, true) || isSame(tp2, tp1, false, true)); + } + + private void checkIsNotSame(CtTypeParameter tp1, CtTypeParameter tp2) { + assertFalse(isSame(tp1, tp2, false, true) || isSame(tp2, tp1, false, true)); + } + + private static boolean isSame(CtTypeParameter thisType, CtTypeParameter thatType, boolean canTypeErasure, boolean checkMethodOverrides) { + CtTypeReference thatAdaptedType = thisType.getFactory().Type().createTypeAdapter(thisType.getTypeParameterDeclarer()).adaptType(thatType); + if (thatAdaptedType == null) { + return false; + } + return thisType.getQualifiedName().equals(thatAdaptedType.getQualifiedName()); + } + + @Test + public void test() { + // testcase for issue 3275. The issue was a nullpointer in this code. Was fixed in #3276 + new FluentLauncher() + .inputResource("src/test/resources/issue3275/BOMCostPrice.java") + .noClasspath(true) + .processor(new AbstractProcessor>() { + public void process(CtTypeReference element) { + // just a operation to enforce the method + String a = element.getSimpleName(); + } + }) + .buildModel(); + } +} diff --git a/src/test/java/spoon/test/ctType/CtTypeTest.java b/src/test/java/spoon/test/ctType/CtTypeTest.java index 0ddbe97636b..aad88aa4ac9 100644 --- a/src/test/java/spoon/test/ctType/CtTypeTest.java +++ b/src/test/java/spoon/test/ctType/CtTypeTest.java @@ -16,6 +16,10 @@ */ package spoon.test.ctType; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.*; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -40,18 +44,13 @@ import spoon.test.ctType.testclasses.X; import spoon.testing.utils.ModelTest; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static spoon.testing.utils.ModelUtils.buildClass; import static spoon.testing.utils.ModelUtils.createFactory; @@ -264,7 +263,7 @@ public void testTypeDeclarationToReferenceRoundTripInNamedModule() { assertSame(reFetchedTypeDecl, typeDecl); } - + @Test public void testSneakyThrowsInSubClasses() { // contract: Sneaky throws doesn't crash spoons method return type resolution. @@ -273,9 +272,9 @@ public void testSneakyThrowsInSubClasses() { launcher.addInputResource("src/test/resources/npe"); CtModel model = launcher.buildModel(); assertDoesNotThrow(() -> model.getAllTypes().stream().forEach(CtType::getAllExecutables)); - } - - @Test +} + +@Test public void testGetAllExecutablesOnTypeImplementingNestedInterface() { // contract: implicit static nested interfaces are correct handled in getAllExecutables. Launcher launcher = new Launcher(); @@ -288,7 +287,7 @@ public void testGetAllExecutablesOnTypeImplementingNestedInterface() { assertThat(numExecutables, anyOf( equalTo(expectedNumExecutablesInJDK8), equalTo(expectedNumExecutablesPostJDK8)) - ); + ); } /** diff --git a/src/test/java/spoon/test/delete/DeleteTest.java b/src/test/java/spoon/test/delete/DeleteTest.java index b4ef7ec8a88..015a50148b0 100644 --- a/src/test/java/spoon/test/delete/DeleteTest.java +++ b/src/test/java/spoon/test/delete/DeleteTest.java @@ -19,7 +19,6 @@ import java.lang.annotation.Annotation; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.reflect.code.CtAssignment; import spoon.reflect.code.CtCase; diff --git a/src/test/java/spoon/test/enums/EnumsTest.java b/src/test/java/spoon/test/enums/EnumsTest.java index 25d8dd37459..08276e49ca8 100644 --- a/src/test/java/spoon/test/enums/EnumsTest.java +++ b/src/test/java/spoon/test/enums/EnumsTest.java @@ -16,6 +16,14 @@ */ package spoon.test.enums; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -52,15 +60,6 @@ import spoon.testing.utils.GitHubIssue; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; @@ -294,7 +293,7 @@ void testImplicitEnumConstructorSuperCall() { CtConstructor constructor = myEnum.getConstructors().iterator().next(); assertThat(constructor.isImplicit(), is(true)); - + for (CtStatement statement : constructor.getBody().getStatements()) { if (!(statement instanceof CtInvocation)) { continue; diff --git a/src/test/java/spoon/test/enums/EnumsTypeTest.java b/src/test/java/spoon/test/enums/EnumsTypeTest.java index 73a1798c76c..99112eff58b 100644 --- a/src/test/java/spoon/test/enums/EnumsTypeTest.java +++ b/src/test/java/spoon/test/enums/EnumsTypeTest.java @@ -18,9 +18,7 @@ import java.util.List; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.SpoonResource; import spoon.compiler.SpoonResourceHelper; diff --git a/src/test/java/spoon/test/eval/EvalTest.java b/src/test/java/spoon/test/eval/EvalTest.java index e29b424b885..0040e3f5c3e 100644 --- a/src/test/java/spoon/test/eval/EvalTest.java +++ b/src/test/java/spoon/test/eval/EvalTest.java @@ -25,7 +25,6 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Stream; - import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -266,14 +265,14 @@ public void testVisitorPartialEvaluator_binary() { @Test public void testVisitorPartialEvaluator_unary() { - { // NEG urnary operator - Launcher launcher = new Launcher(); - CtCodeElement el = - launcher.getFactory().Code().createCodeSnippetExpression("-(100+1)").compile(); - VisitorPartialEvaluator eval = new VisitorPartialEvaluator(); - CtElement element = eval.evaluate(el); - assertEquals("-101", element.toString()); - } + { // NEG urnary operator + Launcher launcher = new Launcher(); + CtCodeElement el = + launcher.getFactory().Code().createCodeSnippetExpression("-(100+1)").compile(); + VisitorPartialEvaluator eval = new VisitorPartialEvaluator(); + CtElement element = eval.evaluate(el); + assertEquals("-101", element.toString()); + } } @Test diff --git a/src/test/java/spoon/test/exceptions/ExceptionTest.java b/src/test/java/spoon/test/exceptions/ExceptionTest.java index ca04b94d3b2..e494863df2d 100644 --- a/src/test/java/spoon/test/exceptions/ExceptionTest.java +++ b/src/test/java/spoon/test/exceptions/ExceptionTest.java @@ -19,7 +19,6 @@ import java.io.FileNotFoundException; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonModelBuilder; @@ -119,7 +118,7 @@ public void testExceptionDuplicateClass() throws Exception{ // an exception should be thrown, even in noclasspath mode spoon.createCompiler(factory, SpoonResourceHelper.resources("./src/test/resources/spoon/test/duplicateclasses/Foo.java", "./src/test/resources/spoon/test/duplicateclasses/Bar.java")).build(); }); - } + } @Test public void testUnionCatchExceptionInsideLambdaInNoClasspath() { diff --git a/src/test/java/spoon/test/executable/ExecutableRefTest.java b/src/test/java/spoon/test/executable/ExecutableRefTest.java index 87a2f5d8ffc..5987d31a18f 100644 --- a/src/test/java/spoon/test/executable/ExecutableRefTest.java +++ b/src/test/java/spoon/test/executable/ExecutableRefTest.java @@ -20,7 +20,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtAbstractInvocation; diff --git a/src/test/java/spoon/test/executable/ExecutableTest.java b/src/test/java/spoon/test/executable/ExecutableTest.java index 83bd5797e23..d40c7cd92eb 100644 --- a/src/test/java/spoon/test/executable/ExecutableTest.java +++ b/src/test/java/spoon/test/executable/ExecutableTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.ContractVerifier; import spoon.Launcher; diff --git a/src/test/java/spoon/test/factory/CodeFactoryTest.java b/src/test/java/spoon/test/factory/CodeFactoryTest.java index 8a6f558203e..f9c4259280e 100644 --- a/src/test/java/spoon/test/factory/CodeFactoryTest.java +++ b/src/test/java/spoon/test/factory/CodeFactoryTest.java @@ -16,6 +16,8 @@ */ package spoon.test.factory; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -30,8 +32,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.support.util.compilation.JavacFacade; import spoon.testing.utils.GitHubIssue; -import java.util.List; -import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -64,7 +64,7 @@ public void testCreateVariableAssignement() { assertTrue(va.getAssigned() instanceof CtVariableWrite); assertEquals(f.getReference(), ((CtVariableWrite) va.getAssigned()).getVariable()); } - + @Test @GitHubIssue(issueNumber= 4956, fixed = true) void createCtCatchVariableWithoutModifiers() { diff --git a/src/test/java/spoon/test/factory/ConstructorFactoryTest.java b/src/test/java/spoon/test/factory/ConstructorFactoryTest.java index 8af979c678d..318f2a915ea 100644 --- a/src/test/java/spoon/test/factory/ConstructorFactoryTest.java +++ b/src/test/java/spoon/test/factory/ConstructorFactoryTest.java @@ -21,7 +21,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import org.junit.jupiter.api.Test; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; diff --git a/src/test/java/spoon/test/factory/ExecutableFactoryTest.java b/src/test/java/spoon/test/factory/ExecutableFactoryTest.java index 18786597081..9c41660010b 100644 --- a/src/test/java/spoon/test/factory/ExecutableFactoryTest.java +++ b/src/test/java/spoon/test/factory/ExecutableFactoryTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.reflect.factory.ExecutableFactory; import spoon.reflect.factory.Factory; diff --git a/src/test/java/spoon/test/factory/FactoryTest.java b/src/test/java/spoon/test/factory/FactoryTest.java index 3662bb2479e..93a9f36eb4a 100644 --- a/src/test/java/spoon/test/factory/FactoryTest.java +++ b/src/test/java/spoon/test/factory/FactoryTest.java @@ -18,8 +18,6 @@ import java.lang.reflect.Method; -import java.nio.file.Paths; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonAPI; @@ -44,7 +42,6 @@ import spoon.test.SpoonTestHelpers; import spoon.test.factory.testclasses.Foo; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/factory/FieldFactoryTest.java b/src/test/java/spoon/test/factory/FieldFactoryTest.java index 99ddee57ef8..956c455e1b6 100644 --- a/src/test/java/spoon/test/factory/FieldFactoryTest.java +++ b/src/test/java/spoon/test/factory/FieldFactoryTest.java @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.Set; - import org.junit.jupiter.api.Test; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtElement; diff --git a/src/test/java/spoon/test/factory/MethodFactoryTest.java b/src/test/java/spoon/test/factory/MethodFactoryTest.java index f7147235f43..1b64adc8e49 100644 --- a/src/test/java/spoon/test/factory/MethodFactoryTest.java +++ b/src/test/java/spoon/test/factory/MethodFactoryTest.java @@ -1,5 +1,6 @@ package spoon.test.factory; +import java.lang.reflect.Method; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtClass; @@ -10,52 +11,50 @@ import spoon.reflect.reference.CtTypeReference; import spoon.test.factory.testclasses4.Bar; -import java.lang.reflect.Method; - -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; public class MethodFactoryTest { - @Test - public void testCreateReference() { - // contract: createReference creates a method reference of the foo method + @Test + public void testCreateReference() { + // contract: createReference creates a method reference of the foo method - Factory factory = new Launcher().getFactory(); - CtClass testClass = factory.Class().get(Bar.class); - CtMethod foo = testClass.getMethodsByName("foo").get(0); - CtExecutableReference expectedReference = testClass.getMethod("foo").getReference(); - MethodFactory methodFactory = testClass.getFactory().Method(); - CtExecutableReference actualCreatedReference = null; + Factory factory = new Launcher().getFactory(); + CtClass testClass = factory.Class().get(Bar.class); + CtMethod foo = testClass.getMethodsByName("foo").get(0); + CtExecutableReference expectedReference = testClass.getMethod("foo").getReference(); + MethodFactory methodFactory = testClass.getFactory().Method(); + CtExecutableReference actualCreatedReference = null; - actualCreatedReference = methodFactory.createReference(foo); + actualCreatedReference = methodFactory.createReference(foo); - assertThat(actualCreatedReference, is(expectedReference)); - } + assertThat(actualCreatedReference, is(expectedReference)); + } - @Test - public void testCreateReferenceWithActualMethod() throws ClassNotFoundException, NoSuchMethodException { - // contract: createReference creates a method reference of a actual method foo + @Test + public void testCreateReferenceWithActualMethod() throws ClassNotFoundException, NoSuchMethodException { + // contract: createReference creates a method reference of a actual method foo - // arrange - Launcher launcher = new Launcher(); - Factory factory = launcher.getFactory(); - Class testClass = Class.forName("spoon.test.factory.testclasses4.Bar"); - Method testMethod = testClass.getMethod("foo"); + // arrange + Launcher launcher = new Launcher(); + Factory factory = launcher.getFactory(); + Class testClass = Class.forName("spoon.test.factory.testclasses4.Bar"); + Method testMethod = testClass.getMethod("foo"); - CtExecutableReference expectedReference = factory.createExecutableReference(); - expectedReference.setSimpleName("foo"); - CtTypeReference ctTypeReference = factory.Type().createReference(Bar.class); - expectedReference.setDeclaringType(ctTypeReference); - expectedReference.setType(launcher.getFactory().Type().voidPrimitiveType()); + CtExecutableReference expectedReference = factory.createExecutableReference(); + expectedReference.setSimpleName("foo"); + CtTypeReference ctTypeReference = factory.Type().createReference(Bar.class); + expectedReference.setDeclaringType(ctTypeReference); + expectedReference.setType(launcher.getFactory().Type().voidPrimitiveType()); - MethodFactory methodFactory = factory.Method(); - CtExecutableReference actualCreatedReference = null; + MethodFactory methodFactory = factory.Method(); + CtExecutableReference actualCreatedReference = null; - // act - actualCreatedReference = methodFactory.createReference(testMethod); + // act + actualCreatedReference = methodFactory.createReference(testMethod); - // assert - assertThat(actualCreatedReference, is(expectedReference)); - } -} \ No newline at end of file + // assert + assertThat(actualCreatedReference, is(expectedReference)); + } +} diff --git a/src/test/java/spoon/test/factory/TypeFactoryTest.java b/src/test/java/spoon/test/factory/TypeFactoryTest.java index 0ffb9a0ab32..528b7b387a8 100644 --- a/src/test/java/spoon/test/factory/TypeFactoryTest.java +++ b/src/test/java/spoon/test/factory/TypeFactoryTest.java @@ -16,9 +16,7 @@ import com.mysema.query.types.expr.ComparableExpressionBase; - import java.io.File; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtJavaDoc; diff --git a/src/test/java/spoon/test/field/FieldTest.java b/src/test/java/spoon/test/field/FieldTest.java index df84452523d..6b166aa2575 100644 --- a/src/test/java/spoon/test/field/FieldTest.java +++ b/src/test/java/spoon/test/field/FieldTest.java @@ -16,16 +16,11 @@ */ package spoon.test.field; -import static org.junit.jupiter.api.Assertions.*; -import static spoon.testing.utils.ModelUtils.buildClass; -import static spoon.testing.utils.ModelUtils.createFactory; - import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import spoon.Launcher; @@ -50,6 +45,10 @@ import spoon.testing.utils.LineSeparatorExtension; import spoon.testing.utils.ModelTest; +import static org.junit.jupiter.api.Assertions.*; +import static spoon.testing.utils.ModelUtils.buildClass; +import static spoon.testing.utils.ModelUtils.createFactory; + public class FieldTest { @Test diff --git a/src/test/java/spoon/test/fieldaccesses/FieldAccessTest.java b/src/test/java/spoon/test/fieldaccesses/FieldAccessTest.java index 18df86e9129..cc0d4d53d75 100644 --- a/src/test/java/spoon/test/fieldaccesses/FieldAccessTest.java +++ b/src/test/java/spoon/test/fieldaccesses/FieldAccessTest.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.List; import java.util.logging.Logger; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtArrayWrite; @@ -447,16 +446,16 @@ public void testGetReference() { public void testFieldAccessAutoExplicit() throws Exception { CtClass mouse = (CtClass) buildClass(Mouse.class); CtMethod method = mouse.filterChildren((CtMethod m)->"meth1".equals(m.getSimpleName())).first(); - + CtFieldReference ageFR = method.filterChildren((CtFieldReference fr)->"age".equals(fr.getSimpleName())).first(); //first is the field printed with implicit "this." - assertEquals("age", ageFR.getParent().toString()); - //add local variable declaration which hides the field declaration - method.getBody().insertBegin((CtStatement) mouse.getFactory().createCodeSnippetStatement("int age = 1").compile()); - //run model validator to fix the problem - new ImportConflictDetector().process(mouse.getPosition().getCompilationUnit()); + assertEquals("age", ageFR.getParent().toString()); + //add local variable declaration which hides the field declaration + method.getBody().insertBegin((CtStatement) mouse.getFactory().createCodeSnippetStatement("int age = 1").compile()); + //run model validator to fix the problem + new ImportConflictDetector().process(mouse.getPosition().getCompilationUnit()); //now the field access must use explicit "this." - assertEquals("this.age", ageFR.getParent().toString()); + assertEquals("this.age", ageFR.getParent().toString()); } @Test diff --git a/src/test/java/spoon/test/filters/CUFilterTest.java b/src/test/java/spoon/test/filters/CUFilterTest.java index 103394825f1..e486783d222 100644 --- a/src/test/java/spoon/test/filters/CUFilterTest.java +++ b/src/test/java/spoon/test/filters/CUFilterTest.java @@ -35,48 +35,48 @@ public void testWithoutFilters(CtModel model) { .getMethod("createB").getType().getQualifiedName()); } - @Test - public void testSingleExcludeWithFilter() { - final Launcher launcher = new Launcher(); - launcher.getEnvironment().setNoClasspath(true); - launcher.addInputResource("./src/test/resources/noclasspath/same-package"); - launcher.getModelBuilder().addCompilationUnitFilter( - new CompilationUnitFilter() { - @Override - public boolean exclude(final String path) { - return path.endsWith("B.java"); - } - }); - launcher.buildModel(); - final CtModel model = launcher.getModel(); + @Test + public void testSingleExcludeWithFilter() { + final Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + launcher.addInputResource("./src/test/resources/noclasspath/same-package"); + launcher.getModelBuilder().addCompilationUnitFilter( + new CompilationUnitFilter() { + @Override + public boolean exclude(final String path) { + return path.endsWith("B.java"); + } + }); + launcher.buildModel(); + final CtModel model = launcher.getModel(); - assertEquals(1, model.getAllTypes().size()); - // make sure `B` is not available in `model.getAllTypes` - assertEquals("A", model.getAllTypes().iterator().next().getSimpleName()); - // make sure declaration of `B` is known in `model` - final CtReturn ctReturn = model.getAllTypes().iterator().next() - .getMethod("createB").getBody().getStatement(0); - final CtConstructorCall ctConstructorCall = - (CtConstructorCall)ctReturn.getReturnedExpression(); - assertEquals("spoon.test.same.B", ctConstructorCall.getType().getQualifiedName()); - } + assertEquals(1, model.getAllTypes().size()); + // make sure `B` is not available in `model.getAllTypes` + assertEquals("A", model.getAllTypes().iterator().next().getSimpleName()); + // make sure declaration of `B` is known in `model` + final CtReturn ctReturn = model.getAllTypes().iterator().next() + .getMethod("createB").getBody().getStatement(0); + final CtConstructorCall ctConstructorCall = + (CtConstructorCall)ctReturn.getReturnedExpression(); + assertEquals("spoon.test.same.B", ctConstructorCall.getType().getQualifiedName()); + } - @Test - public void testSingleExcludeWithoutFilter() { - final Launcher launcher = new Launcher(); - launcher.getEnvironment().setNoClasspath(true); - launcher.addInputResource("./src/test/resources/noclasspath/same-package/A.java"); - launcher.buildModel(); - final CtModel model = launcher.getModel(); + @Test + public void testSingleExcludeWithoutFilter() { + final Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + launcher.addInputResource("./src/test/resources/noclasspath/same-package/A.java"); + launcher.buildModel(); + final CtModel model = launcher.getModel(); - assertEquals(1, model.getAllTypes().size()); - // make sure `B` is not available in `model.getAllTypes` - assertEquals("A", model.getAllTypes().iterator().next().getSimpleName()); - // make sure declaration of `B` is unknown in `model` - final CtReturn ctReturn = model.getAllTypes().iterator().next() - .getMethod("createB").getBody().getStatement(0); - final CtConstructorCall ctConstructorCall = - (CtConstructorCall)ctReturn.getReturnedExpression(); - assertEquals("spoon.test.same.B", ctConstructorCall.getType().getQualifiedName()); - } + assertEquals(1, model.getAllTypes().size()); + // make sure `B` is not available in `model.getAllTypes` + assertEquals("A", model.getAllTypes().iterator().next().getSimpleName()); + // make sure declaration of `B` is unknown in `model` + final CtReturn ctReturn = model.getAllTypes().iterator().next() + .getMethod("createB").getBody().getStatement(0); + final CtConstructorCall ctConstructorCall = + (CtConstructorCall)ctReturn.getReturnedExpression(); + assertEquals("spoon.test.same.B", ctConstructorCall.getType().getQualifiedName()); + } } diff --git a/src/test/java/spoon/test/filters/FilterTest.java b/src/test/java/spoon/test/filters/FilterTest.java index ab6fc6fa40d..fd331014001 100644 --- a/src/test/java/spoon/test/filters/FilterTest.java +++ b/src/test/java/spoon/test/filters/FilterTest.java @@ -16,6 +16,13 @@ */ package spoon.test.filters; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.TreeSet; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -93,14 +100,6 @@ import spoon.testing.utils.ModelTest; import spoon.testing.utils.ModelUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.TreeSet; - import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.utils.ModelUtils.build; @@ -570,7 +569,7 @@ public boolean matches(CtInvocation element) { assertNotNull(declaration); assertEquals("size", declaration.getSimpleName()); } - + @Test public void testReflectionBasedTypeFilter() { final Launcher launcher = new Launcher(); @@ -596,7 +595,7 @@ public boolean matches(CtClass element) { //then do it using Filter implemented by lambda expression List> allClasses3 = launcher.getFactory().Package().getRootPackage().getElements((CtClass element)->true); assertArrayEquals(allClasses.toArray(), allClasses3.toArray()); - + //last try AbstractFilter constructor without class parameter final CtClass aTacos = launcher.getFactory().Class().get(Tacos.class); final CtInvocation invSize = aTacos.getElements(new AbstractFilter>(/*no class is needed here*/) { @@ -616,14 +615,14 @@ public void testQueryStepScannWithConsumer() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { int counter = 0; } Context context = new Context(); - + CtQuery l_qv = launcher.getFactory().getModel().filterChildren(new TypeFilter<>(CtClass.class)); - + assertEquals(0, context.counter); l_qv.forEach(cls->{ assertTrue(cls instanceof CtClass); @@ -631,7 +630,7 @@ class Context { }); assertTrue(context.counter>0); } - + @Test public void testQueryBuilderWithFilterChain() { // contract: query methods can be lazy evaluated in a foreach @@ -639,12 +638,12 @@ public void testQueryBuilderWithFilterChain() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { CtMethod method; int count = 0; } - + Context context = new Context(); // chaining queries @@ -663,14 +662,14 @@ class Context { // sanity check assertTrue(context.count>0); } - + @Test public void testFilterQueryStep() { final Launcher launcher = new Launcher(); launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + //Contract: the filter(Filter) can be used to detect if input of query step should pass to next query step. List realList = launcher.getFactory().Package().getRootPackage().filterChildren(e->{return true;}).select(new TypeFilter<>(CtClass.class)).list(); List expectedList = launcher.getFactory().Package().getRootPackage().filterChildren(new TypeFilter<>(CtClass.class)).list(); @@ -684,7 +683,7 @@ public void testFilterChildrenWithoutFilterQueryStep() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + //Contract: the filterChildren(null) without Filter returns same results like filter which returns true for each input. List list = launcher.getFactory().Package().getRootPackage().filterChildren(null).list(); Iterator iter = list.iterator(); @@ -705,11 +704,11 @@ public void testFunctionQueryStep() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { int count = 0; } - + Context context = new Context(); CtQuery query = launcher.getFactory().Package().getRootPackage().filterChildren((CtClass c)->{return true;}).name("filter CtClass only") @@ -734,7 +733,7 @@ public void testInvalidQueryStep() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + try { launcher.getFactory().Package().getRootPackage().filterChildren((CtClass c)->{return true;}).name("step1") .map((CtMethod m)->m).name("invalidStep2") @@ -758,12 +757,12 @@ public void testInvalidQueryStepFailurePolicyIgnore() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { int count = 0; } Context context = new Context(); - + launcher.getFactory().Package().getRootPackage().filterChildren((CtElement c)->{return true;}).name("step1") .map((CtMethod m)->m).name("invalidStep2") .map((o)->o).name("step3") @@ -781,7 +780,7 @@ public void testElementMapFunction() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + CtClass cls = launcher.getFactory().Class().get(Tacos.class); cls.map((CtClass c)->c.getParent()) .forEach((CtElement e)->{ @@ -796,7 +795,7 @@ public void testElementMapFunctionOtherContracts() { CtQuery q = launcher.getFactory().Query().createQuery().map((String s)->new String[]{"a", null, s}); List list = q.setInput(null).list(); assertEquals(0, list.size()); - + list = q.setInput("c").list(); assertEquals(2, list.size()); assertEquals("a", list.get(0)); @@ -827,7 +826,7 @@ public void testReuseOfQuery() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + CtClass cls = launcher.getFactory().Class().get(Tacos.class); CtClass cls2 = launcher.getFactory().Class().get(Tostada.class); @@ -855,7 +854,7 @@ public void testReuseOfBaseQuery() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + CtClass cls = launcher.getFactory().Class().get(Tacos.class); CtClass cls2 = launcher.getFactory().Class().get(Tostada.class); @@ -930,13 +929,13 @@ public void testQueryInQuery() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { int count = 0; } - + Context context = new Context(); - + CtClass cls = launcher.getFactory().Class().get(Tacos.class); // first query @@ -977,13 +976,13 @@ class Context { }); assertEquals(8, context.count); } - + @Test public void testEmptyQuery() { // contract: unbound or empty query final Launcher launcher = new Launcher(); - + //contract: empty query returns no element assertEquals(0, launcher.getFactory().createQuery().list().size()); assertEquals(0, launcher.getFactory().createQuery((Object) null).list().size()); @@ -997,13 +996,13 @@ public void testEmptyQuery() { assertEquals(0, launcher.getFactory().createQuery().filterChildren(x->{fail();return true;}).list().size()); assertEquals(0, launcher.getFactory().createQuery((Object) null).filterChildren(x->{fail();return true;}).list().size()); } - + @Test public void testBoundQuery() { // contract: bound query, without any mapping final Launcher launcher = new Launcher(); - + //contract: bound query returns bound element List list = launcher.getFactory().createQuery("x").list(); assertEquals(1, list.size()); @@ -1013,17 +1012,17 @@ public void testBoundQuery() { @Test public void testClassCastExceptionOnForEach() { // contract: bound query, without any mapping - // This test could fail with a version of JDK <= 8.0.40. + // This test could fail with a version of JDK <= 8.0.40. final Launcher launcher = new Launcher(); launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { int count = 0; } - + { Context context = new Context(); //contract: if the query produces elements which cannot be cast to forEach consumer, then they are ignored @@ -1157,7 +1156,7 @@ public void apply(CtType input, CtConsumer outputConsumer) { } } } - + @Test public void testEarlyTerminatingQuery() { // contract: a method first evaluates query until first element is found and then terminates the query @@ -1166,16 +1165,16 @@ public void testEarlyTerminatingQuery() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { boolean wasTerminated = false; void failIfTerminated(String place) { assertTrue(wasTerminated==false, "The "+place+" is called after query was terminated."); } } - + Context context = new Context(); - + CtMethod firstMethod = launcher.getFactory().Package().getRootPackage().filterChildren(e->{ context.failIfTerminated("Filter#match of filterChildren"); return true; @@ -1212,28 +1211,28 @@ public void testParentFunction() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + CtClass cls = launcher.getFactory().Class().get(Tacos.class); CtLocalVariable varStrings = cls.filterChildren(new NamedElementFilter<>(CtLocalVariable.class,"strings")).first(); - + class Context { CtElement expectedParent; } - + Context context = new Context(); - + context.expectedParent = varStrings; - + varStrings.map(new ParentFunction()).forEach((parent)->{ context.expectedParent = context.expectedParent.getParent(); assertSame(context.expectedParent, parent); }); - + //context.expectedParent is last visited element - + //Check that last visited element was root package assertSame(launcher.getFactory().getModel().getUnnamedModule(), context.expectedParent); - + //contract: if includingSelf(false), then parent of input element is first element assertSame(varStrings.getParent(), varStrings.map(new ParentFunction().includingSelf(false)).first()); //contract: if includingSelf(true), then input element is first element @@ -1249,14 +1248,14 @@ public void testCtScannerListener() { launcher.setArgs(new String[] {"--output-type", "nooutput" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); launcher.run(); - + class Context { long nrOfEnter = 0; long nrOfEnterRetTrue = 0; long nrOfExit = 0; long nrOfResults = 0; } - + Context context1 = new Context(); // scan only packages until top level classes. Do not scan class internals @@ -1273,7 +1272,7 @@ public ScanningMode enter(CtElement element) { public void exit(CtElement element) { context1.nrOfExit++; } - + })).list(); //check that test is visiting some nodes @@ -1283,9 +1282,9 @@ public void exit(CtElement element) { assertEquals(context1.nrOfEnter, context1.nrOfExit); Context context2 = new Context(); - + Iterator iter = result1.iterator(); - + //scan only from packages till top level classes. Do not scan class internals launcher.getFactory().getModel().map(new CtScannerFunction().setListener(new CtScannerListener() { int inClass = 0; @@ -1310,7 +1309,7 @@ public void exit(CtElement element) { } assertTrue(inClass==0 || inClass==1); } - + })).forEach(ele->{ context2.nrOfResults++; assertTrue(ele instanceof CtPackage || ele instanceof CtType || ele instanceof CtModule, "ele instanceof "+ele.getClass()); diff --git a/src/test/java/spoon/test/generics/GenericsTest.java b/src/test/java/spoon/test/generics/GenericsTest.java index 103966193d0..e5b5dba6135 100644 --- a/src/test/java/spoon/test/generics/GenericsTest.java +++ b/src/test/java/spoon/test/generics/GenericsTest.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.ContractVerifier; import spoon.Launcher; @@ -36,7 +35,6 @@ import spoon.reflect.code.CtLocalVariable; import spoon.reflect.code.CtNewClass; import spoon.reflect.code.CtReturn; -import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtElement; @@ -94,7 +92,6 @@ import spoon.test.generics.testclasses3.Foo; import spoon.test.generics.testclasses3.GenericConstructor; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; @@ -660,7 +657,7 @@ public void testIsGenericsMethod() throws Exception { @Test public void testTypeParameterReferenceAsActualTypeArgument() throws Exception { CtType aTacos = buildNoClasspath(ClassThatDefinesANewTypeArgument.class).Type().get(ClassThatDefinesANewTypeArgument.class); - + CtTypeReference typeRef = aTacos.getReference(); assertSame(aTacos, typeRef.getDeclaration()); @@ -681,7 +678,7 @@ public void testTypeParameterReferenceAsActualTypeArgument() throws Exception { assertSame(aTacos, typeRef.getDeclaration()); //stored typeParamRef is same like the added one, no clone - OK assertSame(typeParamRef, typeRef.getActualTypeArguments().get(0)); - //typeParamRef has got new parent + //typeParamRef has got new parent assertSame(typeRef, typeParamRef.getParent()); assertEquals(typeParam, typeParamRef.getDeclaration()); @@ -884,7 +881,7 @@ public void testCtTypeReference_getSuperclass() { CtTypeReference trWeddingLunch_Mole = ctClassCelebrationLunch.filterChildren(new NamedElementFilter<>(CtNamedElement.class,"disgust")).map((CtTypedElement te)->{ return te.getType(); }).first(); - + assertEquals("spoon.test.generics.testclasses.CelebrationLunch.WeddingLunch",trWeddingLunch_Mole.toString()); CtType tWeddingLunch_X = trWeddingLunch_Mole.getDeclaration(); CtTypeReference trCelebrationLunch_Tacos_Paella_X = tWeddingLunch_X.getSuperclass(); @@ -949,16 +946,16 @@ public void testClassTypingContext() { CtTypeReference typeReferenceOfDisgust = ctClassCelebrationLunch.filterChildren(new NamedElementFilter<>(CtNamedElement.class,"disgust")).map((CtTypedElement te)->{ return te.getType(); }).first(); - + assertEquals("spoon.test.generics.testclasses.CelebrationLunch.WeddingLunch",typeReferenceOfDisgust.toString()); //method WeddingLunch#eatMe CtMethod tWeddingLunch_eatMe = typeReferenceOfDisgust.getDeclaration().filterChildren((CtNamedElement e)->"eatMe".equals(e.getSimpleName())).first(); - + CtClass ctClassLunch = factory.Class().get(Lunch.class); //method Lunch#eatMe CtMethod ctClassLunch_eatMe = ctClassLunch.filterChildren((CtNamedElement e)->"eatMe".equals(e.getSimpleName())).first(); - + //type of first parameter of method WeddingLunch#eatMe CtTypeReference ctWeddingLunch_X = tWeddingLunch_eatMe.getParameters().get(0).getType(); // X is the type parameter of WeddingLunch @@ -966,7 +963,7 @@ public void testClassTypingContext() { //type of first parameter of method Lunch#eatMe CtTypeReference ctClassLunch_A = ctClassLunch_eatMe.getParameters().get(0).getType(); assertEquals("A", ctClassLunch_A.getSimpleName()); - + //are these two types same? TypeAdaptor typingContextOfDisgust = new TypeAdaptor(typeReferenceOfDisgust); // in disgust, X of WeddingLunch is bound to "Model" @@ -994,7 +991,7 @@ public void testClassTypingContext() { //adapt A to scope of enclosing class of CelebrationLunch.WddingLunch, which is CelebrationLunch assertEquals("M", new TypeAdaptor(typeReferenceOfDisgust.getDeclaration().getDeclaringType()).adaptType(ctClassLunch_A).getQualifiedName()); } - + @Test public void testRecursiveTypeAdapting() throws Exception { CtType classOrange = buildClass(Orange.class); @@ -1006,7 +1003,7 @@ public void testRecursiveTypeAdapting() throws Exception { assertEquals("K", typeParamO.getSuperclass().getQualifiedName()); assertEquals("O", typeParamM.getSuperclass().getQualifiedName()); assertEquals("K", typeParamM.getSuperclass().getSuperclass().getQualifiedName()); - + CtClass classB = classOrange.getNestedType("B"); CtTypeParameter typeParamN = classB.getFormalCtTypeParameters().get(0); CtTypeParameter typeParamP = classB.getFormalCtTypeParameters().get(1); @@ -1020,18 +1017,18 @@ public void testRecursiveTypeAdapting() throws Exception { assertEquals("K", ctcB.adaptType(typeParamO).getSuperclass().getQualifiedName()); assertEquals("N", ctcB.adaptType(typeParamM).getSuperclass().getQualifiedName()); assertEquals("K", ctcB.adaptType(typeParamM).getSuperclass().getSuperclass().getQualifiedName()); - + CtTypeReference typeRef_list2m = classA.getField("list2m").getType(); assertEquals("java.util.List>", typeRef_list2m.toString()); //contract: the CtTypeReference is adapted recursive including actual type arguments assertEquals("java.util.List>", ctcB.adaptType(typeRef_list2m).toString()); - + CtTypeReference typeRef_ListQextendsM = classA.getMethodsByName("method").get(0).getParameters().get(0).getType(); assertEquals("java.util.List", typeRef_ListQextendsM.toString()); //contract: the CtTypeReference is adapted recursive including actual type arguments and their bounds assertEquals("java.util.List", ctcB.adaptType(typeRef_ListQextendsM).toString()); } - + @Test public void testMethodTypingContext() { Factory factory = build(new File("src/test/java/spoon/test/generics/testclasses")); @@ -1040,22 +1037,22 @@ public void testMethodTypingContext() { MethodTypingContext methodSTH = new MethodTypingContext().setMethod(trWeddingLunch_eatMe); - //contract: the method typing context provides its scope + //contract: the method typing context provides its scope assertSame(trWeddingLunch_eatMe, methodSTH.getAdaptationScope()); CtClass ctClassLunch = factory.Class().get(Lunch.class); CtMethod trLunch_eatMe = ctClassLunch.filterChildren(new NamedElementFilter<>(CtMethod.class,"eatMe")).first(); - + CtInvocation invokeReserve = factory.Class().get(CelebrationLunch.class) .filterChildren(new TypeFilter<>(CtInvocation.class)) .select((CtInvocation i)->"reserve".equals(i.getExecutable().getSimpleName())) .first(); - - + + MethodTypingContext methodReserveTC = new MethodTypingContext().setInvocation(invokeReserve); - //contract: the method typing context provides its scope + //contract: the method typing context provides its scope assertSame(invokeReserve.getExecutable().getDeclaration(), methodReserveTC.getAdaptationScope()); - + //check that MethodTypingContext made from invocation knows actual type arguments of method and all declaring types //1) check method actual type argument CtMethod methodReserve = (CtMethod) invokeReserve.getExecutable().getDeclaration(); @@ -1063,21 +1060,21 @@ public void testMethodTypingContext() { assertEquals("S", methodReserve_S.getSimpleName()); assertEquals("spoon.test.generics.testclasses.Tacos", methodReserveTC.adaptType(methodReserve_S).getQualifiedName()); - //2) check actual type arguments of declaring type `Section` + //2) check actual type arguments of declaring type `Section` CtClass classSection = (CtClass)methodReserve.getDeclaringType(); assertEquals("spoon.test.generics.testclasses.CelebrationLunch$WeddingLunch$Section", classSection.getQualifiedName()); CtTypeParameter classSection_Y = classSection.getFormalCtTypeParameters().get(0); assertEquals("Y", classSection_Y.getSimpleName()); assertEquals("spoon.test.generics.testclasses.Paella", methodReserveTC.adaptType(classSection_Y).getQualifiedName()); - - //3) check actual type arguments of declaring type `WeddingLunch` + + //3) check actual type arguments of declaring type `WeddingLunch` CtClass classWeddingLunch = (CtClass)classSection.getDeclaringType(); assertEquals("spoon.test.generics.testclasses.CelebrationLunch$WeddingLunch", classWeddingLunch.getQualifiedName()); CtTypeParameter classWeddingLunch_X = classWeddingLunch.getFormalCtTypeParameters().get(0); assertEquals("X", classWeddingLunch_X.getSimpleName()); assertEquals("spoon.test.generics.testclasses.Mole", methodReserveTC.adaptType(classWeddingLunch_X).getQualifiedName()); - - //4) check actual type arguments of declaring type `CelebrationLunch` + + //4) check actual type arguments of declaring type `CelebrationLunch` CtClass classCelebrationLunch = (CtClass)classWeddingLunch.getDeclaringType(); assertEquals("spoon.test.generics.testclasses.CelebrationLunch", classCelebrationLunch.getQualifiedName()); CtTypeParameter classCelebrationLunch_K = classCelebrationLunch.getFormalCtTypeParameters().get(0); @@ -1140,7 +1137,7 @@ public void testMethodTypingContextAdaptMethod() { //contract: adapting of adapted method returns input method assertEquals(typeAdaptorWeddingLunch.adaptMethod(adaptedLunchEatMe), adaptedLunchEatMe); } - + @Test public void testClassTypingContextMethodSignature() { // core contracts of MethodTypingContext#adaptMethod @@ -1150,10 +1147,10 @@ public void testClassTypingContextMethodSignature() { // represents void eatMe(A paramA, B paramB, C paramC){} CtMethod trLunch_eatMe = ctClassLunch.filterChildren(new NamedElementFilter<>(CtMethod.class,"eatMe")).first(); - + // represents void eatMe(M paramA, K paramB, C paramC) CtMethod trWeddingLunch_eatMe = ctClassWeddingLunch.filterChildren(new NamedElementFilter<>(CtMethod.class,"eatMe")).first(); - + TypeAdaptor ctcWeddingLunch = new TypeAdaptor(ctClassWeddingLunch); assertTrue(ctcWeddingLunch.isOverriding(trLunch_eatMe, trLunch_eatMe)); @@ -1355,7 +1352,7 @@ public void testIsSameSignatureWithMethodGenerics() { assertTrue(ctcSub.isSameSignature(classMethod, ifaceMethod)); assertTrue(ctcSub.isSameSignature(ifaceMethod, classMethod)); } - + @Test public void testGetExecDeclarationOfEnumSetOf() { Launcher launcher = new Launcher(); @@ -1383,7 +1380,7 @@ public void testGetExecDeclarationOfEnumSetOf() { decl = invocation.getExecutable().getExecutableDeclaration(); assertEquals(rightOfMethod, decl); } - + @Test public void testIsSameSignatureWithReferencedGenerics() { Launcher launcher = new Launcher(); @@ -1404,7 +1401,7 @@ public void testIsSameSignatureWithReferencedGenerics() { assertTrue(ctcSub.isSameSignature(classMethod, ifaceMethod)); assertTrue(ctcSub.isSameSignature(ifaceMethod, classMethod)); } - + @Test public void testIsGenericTypeEqual() { Launcher launcher = new Launcher(); @@ -1417,20 +1414,20 @@ public void testIsGenericTypeEqual() { CtMethod ifaceSetter = (CtMethod)ctIFace.getMethodsByName("setConstructors").get(0); assertEquals(ifaceGetter.getType().toString(), ifaceSetter.getParameters().get(0).getType().toString()); assertEquals(ifaceGetter.getType(), ifaceSetter.getParameters().get(0).getType()); - + CtType ctClass = launcher.getFactory().Class().get(LikeCtClassImpl.class); CtMethod classGetter = (CtMethod)ctClass.getMethodsByName("getConstructors").get(0); CtMethod classSetter = (CtMethod)ctClass.getMethodsByName("setConstructors").get(0); assertEquals(classGetter.getType().toString(), classSetter.getParameters().get(0).getType().toString()); assertEquals(classGetter.getType(), classSetter.getParameters().get(0).getType()); - + assertEquals(ifaceGetter.getType().toString(), classGetter.getType().toString()); assertEquals(ifaceGetter.getType(), classGetter.getType()); assertEquals(ifaceSetter.getParameters().get(0).getType().toString(), classSetter.getParameters().get(0).getType().toString()); assertEquals(ifaceSetter.getParameters().get(0).getType(), classSetter.getParameters().get(0).getType()); - + assertEquals(ifaceSetter.getParameters().get(0).getType(), classGetter.getType()); - + TypeAdaptor typeAdaptor = new TypeAdaptor(ctClass); CtMethod adaptedMethod = typeAdaptor.adaptMethod(ifaceSetter); /* @@ -1483,22 +1480,22 @@ public void testDeepGenericsInExecutableReference() { CtClass c = model.getElements(new NamedElementFilter<>(CtClass.class, "C")).get(0); - + CtMethod m = c.getMethodsByName("m").get(0); CtTypeReference execParamType = m.getParameters().get(0).getType(); assertEquals(CtTypeParameterReferenceImpl.class, execParamType.getClass()); assertEquals("W", execParamType.getSimpleName()); - + { CtExecutableReference mRef = ((CtInvocation) m.getBody().getStatements().get(0)).getExecutable(); - + CtTypeReference execRefParamType = mRef.getParameters().get(0); assertEquals(CtTypeReferenceImpl.class, execRefParamType.getClass()); assertEquals("java.util.List", execRefParamType.toString()); } { CtExecutableReference mRef = m.getReference(); - + CtTypeReference execRefParamType = mRef.getParameters().get(0); assertEquals(CtTypeReferenceImpl.class, execRefParamType.getClass()); assertEquals("java.util.List", execRefParamType.toString()); diff --git a/src/test/java/spoon/test/imports/CtUnresolvedImportTest.java b/src/test/java/spoon/test/imports/CtUnresolvedImportTest.java index 65d58b94717..f8d967faf1a 100644 --- a/src/test/java/spoon/test/imports/CtUnresolvedImportTest.java +++ b/src/test/java/spoon/test/imports/CtUnresolvedImportTest.java @@ -1,14 +1,13 @@ package spoon.test.imports; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Test; import spoon.reflect.declaration.CtImport; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtReference; import spoon.test.imports.testclasses.A; -import java.util.HashSet; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.utils.ModelUtils.build; @@ -55,4 +54,4 @@ public void testEquality() throws Exception { assertTrue(imports.add(i7)); assertEquals(5, imports.size()); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/imports/ImportAndExtendWithPackageNameTest.java b/src/test/java/spoon/test/imports/ImportAndExtendWithPackageNameTest.java index 26678d09768..686a402402b 100644 --- a/src/test/java/spoon/test/imports/ImportAndExtendWithPackageNameTest.java +++ b/src/test/java/spoon/test/imports/ImportAndExtendWithPackageNameTest.java @@ -16,34 +16,33 @@ */ package spoon.test.imports; +import java.util.Collection; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtTypeReference; -import java.util.Collection; - import static org.junit.jupiter.api.Assertions.assertEquals; public class ImportAndExtendWithPackageNameTest { - private static final String inputResource = - "./src/test/resources/import-resources/ImportAndExtendWithPackageName.java"; + private static final String inputResource = + "./src/test/resources/import-resources/ImportAndExtendWithPackageName.java"; - @Test - public void testBuildModel() { - final Launcher runLaunch = new Launcher(); - runLaunch.getEnvironment().setNoClasspath(true); - runLaunch.addInputResource(inputResource); - runLaunch.buildModel(); + @Test + public void testBuildModel() { + final Launcher runLaunch = new Launcher(); + runLaunch.getEnvironment().setNoClasspath(true); + runLaunch.addInputResource(inputResource); + runLaunch.buildModel(); - final Collection> types = runLaunch.getModel().getAllTypes(); - assertEquals(1, types.size()); + final Collection> types = runLaunch.getModel().getAllTypes(); + assertEquals(1, types.size()); - final CtType type = types.iterator().next(); - assertEquals("ImportAndExtendWithPackageName", type.getSimpleName()); + final CtType type = types.iterator().next(); + assertEquals("ImportAndExtendWithPackageName", type.getSimpleName()); - final CtTypeReference superClass = type.getSuperclass(); - assertEquals("LLkParser", superClass.getSimpleName()); - } + final CtTypeReference superClass = type.getSuperclass(); + assertEquals("LLkParser", superClass.getSimpleName()); + } } diff --git a/src/test/java/spoon/test/imports/ImportScannerTest.java b/src/test/java/spoon/test/imports/ImportScannerTest.java index 1a9525fa5ed..c253a133dac 100644 --- a/src/test/java/spoon/test/imports/ImportScannerTest.java +++ b/src/test/java/spoon/test/imports/ImportScannerTest.java @@ -16,6 +16,19 @@ */ package spoon.test.imports; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.security.AccessControlException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonModelBuilder; @@ -37,20 +50,6 @@ import spoon.testing.utils.ModelTest; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.security.AccessControlException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/test/imports/ImportTest.java b/src/test/java/spoon/test/imports/ImportTest.java index bdb66eec107..d8b095f6025 100644 --- a/src/test/java/spoon/test/imports/ImportTest.java +++ b/src/test/java/spoon/test/imports/ImportTest.java @@ -16,6 +16,22 @@ */ package spoon.test.imports; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -79,23 +95,6 @@ import spoon.testing.utils.ModelTest; import spoon.testing.utils.ModelUtils; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; - import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; @@ -127,9 +126,9 @@ public void testImportOfAnInnerClassInASuperClassPackageAutoImport() { assertEquals(expected, innerClass.getReference().toString()); //test that acces path depends on the context - //this checks the access path in context of innerClass. The context is defined by CtTypeReference.getParent(CtType.class). + //this checks the access path in context of innerClass. The context is defined by CtTypeReference.getParent(CtType.class). assertEquals("spoon.test.imports.testclasses.internal.ChildClass.InnerClassProtected", innerClass.getSuperclass().toString()); - //this checks the access path in context of SuperClass. The context is defined by CtTypeReference.getParent(CtType.class) + //this checks the access path in context of SuperClass. The context is defined by CtTypeReference.getParent(CtType.class) assertEquals("spoon.test.imports.testclasses.internal.SuperClass.InnerClassProtected", innerClass.getSuperclass().getTypeDeclaration().getReference().toString()); assertEquals("InnerClassProtected", innerClass.getSuperclass().getSimpleName()); @@ -152,9 +151,9 @@ public void testImportOfAnInnerClassInASuperClassPackageFullQualified() { final List classes = Query.getElements(spoon.getFactory(), new NamedElementFilter<>(CtClass.class,"ClientClass")); final CtType innerClass = classes.get(0).getNestedType("InnerClass"); - + assertEquals("spoon.test.imports.testclasses.ClientClass$InnerClass", innerClass.getQualifiedName()); - + String expected = "spoon.test.imports.testclasses.ClientClass.InnerClass"; assertEquals(expected, innerClass.getReference().toString()); @@ -395,12 +394,12 @@ public void testAccessToNestedClass() { }); launcher.buildModel(); final CtClass aClass = launcher.getFactory().Class().get(ClientClass.class.getName()+"$InnerClass"); - assertEquals(ClientClass.class.getName()+"$InnerClass", aClass.getQualifiedName()); + assertEquals(ClientClass.class.getName()+"$InnerClass", aClass.getQualifiedName()); final CtTypeReference parentClass = aClass.getSuperclass(); //comment next line and parentClass.getActualClass(); will fail anyway - assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", parentClass.getQualifiedName()); + assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", parentClass.getQualifiedName()); Class actualClass = parentClass.getActualClass(); - assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", actualClass.getName()); + assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", actualClass.getName()); } @Test @@ -413,15 +412,15 @@ public void testAccessType() { final CtClass aInnerClass = launcher.getFactory().Class().get(ClientClass.class.getName()+"$InnerClass"); final CtClass aSuperClass = launcher.getFactory().Class().get("spoon.test.imports.testclasses.internal.SuperClass"); assertEquals(ClientClass.class.getName()+"$InnerClass", aInnerClass.getQualifiedName()); - + //Check that access type of ClientClass$InnerClass in package protected class is still ClientClass assertEquals(ClientClass.class.getName(), aInnerClass.getReference().getAccessType().getQualifiedName()); - + final CtTypeReference innerClassProtectedByGetSuperClass = aInnerClass.getSuperclass(); final CtTypeReference innerClassProtectedByQualifiedName = launcher.getFactory().Class().get("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected").getReference(); - assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", innerClassProtectedByGetSuperClass.getQualifiedName()); - assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", innerClassProtectedByQualifiedName.getQualifiedName()); + assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", innerClassProtectedByGetSuperClass.getQualifiedName()); + assertEquals("spoon.test.imports.testclasses.internal.SuperClass$InnerClassProtected", innerClassProtectedByQualifiedName.getQualifiedName()); assertEquals("spoon.test.imports.testclasses.internal.ChildClass", innerClassProtectedByGetSuperClass.getAccessType().getQualifiedName()); assertEquals("spoon.test.imports.testclasses.internal.SuperClass", innerClassProtectedByQualifiedName.getAccessType().getQualifiedName()); assertEquals("ChildClass.InnerClassProtected", innerClassProtectedByGetSuperClass.toString()); @@ -430,7 +429,7 @@ public void testAccessType() { @Test public void testCanAccess() { - + class Checker { final Launcher launcher; final CtTypeReference aClientClass; @@ -507,7 +506,7 @@ void checkCanAccess(String aClassName, boolean isInterface, boolean canAccessCli c.checkCanAccess("spoon.test.imports.testclasses.internal.SuperClass$PublicInterface$NestedOfPublicInterface", true, true, true/*canAccess, has access to first accessType, but not to full accesspath*/, "spoon.test.imports.testclasses.internal.SuperClass$PublicInterface", "spoon.test.imports.testclasses.internal.SuperClass$PublicInterface"); c.checkCanAccess("spoon.test.imports.testclasses.internal.SuperClass$PublicInterface$NestedPublicInterface", true, true, true/*canAccess, has access to first accessType, but not to full accesspath*/, "spoon.test.imports.testclasses.internal.SuperClass$PublicInterface", "spoon.test.imports.testclasses.internal.SuperClass$PublicInterface"); } - + @Test public void testCanAccessTypeMember() { Launcher launcher = new Launcher(); @@ -518,14 +517,14 @@ public void testCanAccessTypeMember() { Factory factory = launcher.getFactory(); CtType typeA = factory.Class().get(spoon.test.imports.testclasses.memberaccess.A.class); CtType iface = factory.Interface().get(spoon.test.imports.testclasses.memberaccess.Iface.class); - + //contract: A can access own fields assertTrue(typeA.getReference().canAccess(typeA.getField("privateField"))); assertTrue(typeA.getReference().canAccess(typeA.getField("protectedField"))); assertTrue(typeA.getReference().canAccess(typeA.getField("field"))); assertTrue(typeA.getReference().canAccess(typeA.getField("publicField"))); assertTrue(typeA.getReference().canAccess(iface.getField("field"))); - + //contract: ExtendsA of same package can access fields of A, excluding private { CtType typeExtendsA = factory.Class().get(spoon.test.imports.testclasses.memberaccess.ExtendsA.class); @@ -535,7 +534,7 @@ public void testCanAccessTypeMember() { assertTrue(typeExtendsA.getReference().canAccess(typeA.getField("publicField"))); assertTrue(typeExtendsA.getReference().canAccess(iface.getField("field"))); } - + //contract: DoesnotExtendA of same package can access fields of A, excluding private { CtType typeDoesnotExtendA = factory.Class().get(spoon.test.imports.testclasses.memberaccess.DoesnotExtendA.class); @@ -555,7 +554,7 @@ public void testCanAccessTypeMember() { assertTrue(typeExtendsA.getReference().canAccess(typeA.getField("publicField"))); assertTrue(typeExtendsA.getReference().canAccess(iface.getField("field"))); } - + //contract: DoesnotExtendA in different package can access fields of A, excluding private, protected and package protected { CtType typeDoesnotExtendA = factory.Class().get(spoon.test.imports.testclasses.memberaccess2.DoesnotExtendA.class); @@ -587,7 +586,7 @@ public void testNestedAccessPathWithTypedParameter() { CtClass mmwliother = launcher.getFactory().Class().get("spoon.test.imports.testclasses2.AbstractMapBasedMultimap$OtherWrappedList$WrappedListIterator"); assertEquals("private class WrappedListIterator extends spoon.test.imports.testclasses2.AbstractMapBasedMultimap.OtherWrappedList.WrappedIterator {}",mmwliother.toString()); - + } @Test @@ -849,7 +848,7 @@ public void testSuperInheritanceHierarchyFunction() throws Exception { CtType clientClass = (CtClass) ModelUtils.buildClass(ClientClass.class); CtTypeReference childClass = clientClass.getSuperclass(); CtTypeReference superClass = childClass.getSuperclass(); - + List result = clientClass.map(new SuperInheritanceHierarchyFunction().includingSelf(true)).map(e->{ assertTrue(e instanceof CtType); return ((CtType)e).getQualifiedName(); @@ -905,7 +904,7 @@ public void testSuperInheritanceHierarchyFunctionListener() throws Exception { CtType clientClass = (CtClass) ModelUtils.buildClass(ClientClass.class); CtTypeReference childClass = clientClass.getSuperclass(); CtTypeReference superClass = childClass.getSuperclass(); - + //contract: the enter and exit are always called with CtTypeReference instance List result = clientClass.map(new SuperInheritanceHierarchyFunction().includingSelf(true).setListener(new CtScannerListener() { @Override @@ -996,12 +995,12 @@ public void testSuperInheritanceHierarchyFunctionNoClasspath() { assertEquals("NotInClasspath", typeRefs.get(1).getQualifiedName()); assertEquals("java.lang.Object", typeRefs.get(2).getQualifiedName()); - //contract: super inheritance scanner in reference mode, which starts on class which is not available in model returns no Object, because it does not know if type is class or interface + //contract: super inheritance scanner in reference mode, which starts on class which is not available in model returns no Object, because it does not know if type is class or interface typeRefs = classUSC.getSuperclass().map(new SuperInheritanceHierarchyFunction().includingSelf(true).returnTypeReferences(true)).list(); assertEquals(1, typeRefs.size()); assertEquals("NotInClasspath", typeRefs.get(0).getQualifiedName()); - //contract: super inheritance scanner in type mode, which starts on class which is not available in model returns nothing + //contract: super inheritance scanner in type mode, which starts on class which is not available in model returns nothing types = classUSC.getSuperclass().map(new SuperInheritanceHierarchyFunction().includingSelf(true)).list(); assertEquals(0, types.size()); } @@ -1355,7 +1354,7 @@ public void testGetImportKindReturnRightValue() { ctImport = spoon.getFactory().createImport(aType.getPackage().getReference()); assertEquals(CtImportKind.ALL_TYPES, ctImport.getImportKind()); } - + @Test public void testVisitImportByKind() { // contract: the CtImportVisitor is called based on the reference class type and the boolean isImportAllStaticTypeMembers @@ -1364,7 +1363,7 @@ public void testVisitImportByKind() { CtType aType = spoon.getFactory().Type().get(Reflection.class); CtTypeReference typeRef; - + CtImport ctImport = spoon.getFactory().createImport(aType.getReference()); assertImportVisitor(ctImport); @@ -1393,37 +1392,37 @@ void setKind(CtImportKind kind) { } ImportInfo info = new ImportInfo(); imprt.accept(new CtImportVisitor() { - + @Override public void visitTypeImport(CtTypeReference typeReference) { info.setKind(CtImportKind.TYPE); assertSame(imprt.getReference(), typeReference); } - + @Override public void visitMethodImport(CtExecutableReference executableReference) { info.setKind(CtImportKind.METHOD); assertSame(imprt.getReference(), executableReference); } - + @Override public void visitFieldImport(CtFieldReference fieldReference) { info.setKind(CtImportKind.FIELD); assertSame(imprt.getReference(), fieldReference); } - + @Override public void visitAllTypesImport(CtPackageReference packageReference) { info.setKind(CtImportKind.ALL_TYPES); assertSame(imprt.getReference(), packageReference); } - + @Override public void visitAllStaticMembersImport(CtTypeMemberWildcardImportReference typeReference) { info.setKind(CtImportKind.ALL_STATIC_MEMBERS); assertSame(imprt.getReference(), typeReference); } - + @Override public void visitUnresolvedImport(CtUnresolvedImport ctUnresolvedImport) { info.setKind(CtImportKind.UNRESOLVED); @@ -1477,7 +1476,7 @@ public void testBug2369_autoimports(Launcher launcher) { " }" + nl + "}", printByPrinter(launcher.getFactory().Type().get("spoon.test.imports.testclasses.JavaLongUse"))); } - + public static String printByPrinter(CtElement element) { DefaultJavaPrettyPrinter pp = (DefaultJavaPrettyPrinter) element.getFactory().getEnvironment().createPrettyPrinterAutoImport(); //this call applies print validators, which modifies model before printing diff --git a/src/test/java/spoon/test/imports/name_scope/NameScopeTest.java b/src/test/java/spoon/test/imports/name_scope/NameScopeTest.java index fab9fc38565..ef6954ff007 100644 --- a/src/test/java/spoon/test/imports/name_scope/NameScopeTest.java +++ b/src/test/java/spoon/test/imports/name_scope/NameScopeTest.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtLiteral; @@ -51,19 +50,19 @@ public void testNameScopeScanner() throws Exception { //needed to compute imports launcher.getEnvironment().setAutoImports(true); }, Renata.class); - + CtField fieldMichal = typeRenata.getField("michal"); CtType typeTereza = typeRenata.getNestedType("Tereza"); - + CtMethod methodDraw = typeTereza.getMethodsByName("draw").get(0); - + CtType typeFile = typeRenata.getFactory().Type().createReference(File.class).getTypeDeclaration(); CtType typeSystem = typeRenata.getFactory().Type().createReference(System.class).getTypeDeclaration(); CtMethod methodCurrentTimeMillis = typeSystem.getMethodsByName("currentTimeMillis").get(0); - + CtType typeFiles = typeRenata.getFactory().Type().createReference(Files.class).getTypeDeclaration(); CtMethod methodsNewDirectoryStream = typeFiles.getMethodsByName("newDirectoryStream").get(0); - + LexicalScopeScanner scanner = new LexicalScopeScanner(); scanner.setVisitCompilationUnitContent(true); final LexicalScope[] scopes = new LexicalScope[2]; diff --git a/src/test/java/spoon/test/intercession/IntercessionScanner.java b/src/test/java/spoon/test/intercession/IntercessionScanner.java index 3ed1b6b12a0..48d6482cb63 100644 --- a/src/test/java/spoon/test/intercession/IntercessionScanner.java +++ b/src/test/java/spoon/test/intercession/IntercessionScanner.java @@ -16,6 +16,10 @@ */ package spoon.test.intercession; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtThrow; import spoon.reflect.declaration.CtElement; @@ -24,11 +28,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.CtScanner; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Set; - public abstract class IntercessionScanner extends CtScanner { protected final Factory factory; protected final List> COLLECTIONS; diff --git a/src/test/java/spoon/test/intercession/IntercessionTest.java b/src/test/java/spoon/test/intercession/IntercessionTest.java index 9d5477121af..8af2799d759 100644 --- a/src/test/java/spoon/test/intercession/IntercessionTest.java +++ b/src/test/java/spoon/test/intercession/IntercessionTest.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; - import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/intercession/OneCanCallSetterWithNullParameterizedTest.java b/src/test/java/spoon/test/intercession/OneCanCallSetterWithNullParameterizedTest.java index ee6b392d7b9..3bac963e01f 100644 --- a/src/test/java/spoon/test/intercession/OneCanCallSetterWithNullParameterizedTest.java +++ b/src/test/java/spoon/test/intercession/OneCanCallSetterWithNullParameterizedTest.java @@ -16,6 +16,10 @@ */ package spoon.test.intercession; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import spoon.Launcher; @@ -26,11 +30,6 @@ import spoon.support.DefaultCoreFactory; import spoon.support.StandardEnvironment; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - import static org.junit.jupiter.api.DynamicTest.dynamicTest; import static spoon.test.parent.ContractOnSettersParametrizedTest.createCompatibleObject; diff --git a/src/test/java/spoon/test/intercession/RemoveTest.java b/src/test/java/spoon/test/intercession/RemoveTest.java index 98e0971c7a5..94ee6bd9a57 100644 --- a/src/test/java/spoon/test/intercession/RemoveTest.java +++ b/src/test/java/spoon/test/intercession/RemoveTest.java @@ -18,9 +18,7 @@ import java.util.ArrayList; - import org.junit.jupiter.api.Test; - import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtClass; diff --git a/src/test/java/spoon/test/intercession/insertBefore/InsertBeforeExample.java b/src/test/java/spoon/test/intercession/insertBefore/InsertBeforeExample.java index 235f8f9dc8f..77882a52c23 100644 --- a/src/test/java/spoon/test/intercession/insertBefore/InsertBeforeExample.java +++ b/src/test/java/spoon/test/intercession/insertBefore/InsertBeforeExample.java @@ -1,32 +1,32 @@ package spoon.test.intercession.insertBefore; class InsertBeforeExample { - public InsertBeforeExample() { - super(); - } + public InsertBeforeExample() { + super(); + } - int ifWithoutBraces() { - // without braces - if (1==0+1) - return 0; - return -1; - } + int ifWithoutBraces() { + // without braces + if (1==0+1) + return 0; + return -1; + } - int ifWithBraces() { - if (1==0+1) { - return 0; - } - return -1; - } + int ifWithBraces() { + if (1==0+1) { + return 0; + } + return -1; + } - void switchMethod() { - int i=0,j=0,k=0,l=0; - switch(i){ - case 0: j++; - case 1: k++; - case 2: l++; - case 3: l++;k++; - } - } + void switchMethod() { + int i=0,j=0,k=0,l=0; + switch(i){ + case 0: j++; + case 1: k++; + case 2: l++; + case 3: l++;k++; + } + } } diff --git a/src/test/java/spoon/test/intercession/insertBefore/InsertMethodsTest.java b/src/test/java/spoon/test/intercession/insertBefore/InsertMethodsTest.java index b99aae3d75d..68cde75cfe5 100644 --- a/src/test/java/spoon/test/intercession/insertBefore/InsertMethodsTest.java +++ b/src/test/java/spoon/test/intercession/insertBefore/InsertMethodsTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/interfaces/InterfaceTest.java b/src/test/java/spoon/test/interfaces/InterfaceTest.java index 1b4bdcc24a3..68c6bddedd7 100644 --- a/src/test/java/spoon/test/interfaces/InterfaceTest.java +++ b/src/test/java/spoon/test/interfaces/InterfaceTest.java @@ -16,44 +16,43 @@ */ package spoon.test.interfaces; -import spoon.test.SpoonTestHelpers; -import spoon.test.interfaces.testclasses.RedefinesStaticMethodInterface; -import spoon.SpoonModelBuilder; -import spoon.reflect.factory.Factory; -import spoon.test.interfaces.testclasses.RedefinesDefaultMethodInterface; -import spoon.reflect.code.CtStatement; -import spoon.test.interfaces.testclasses.InterfaceWithDefaultMethods; -import spoon.reflect.declaration.CtInterface; -import spoon.test.interfaces.testclasses.ExtendsStaticMethodInterface; +import java.io.File; +import java.util.Collection; +import java.util.function.Consumer; +import java.util.stream.Collectors; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.Assertions; -import spoon.support.reflect.CtExtendedModifier; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.declaration.CtType; -import spoon.reflect.code.CtBlock; -import spoon.test.interfaces.testclasses.ExtendsDefaultMethodInterface; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.SpoonModelBuilder; import spoon.reflect.CtModel; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtMethod; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.support.reflect.CtExtendedModifier; +import spoon.test.SpoonTestHelpers; +import spoon.test.interfaces.testclasses.ExtendsDefaultMethodInterface; +import spoon.test.interfaces.testclasses.ExtendsStaticMethodInterface; +import spoon.test.interfaces.testclasses.InterfaceWithDefaultMethods; +import spoon.test.interfaces.testclasses.RedefinesDefaultMethodInterface; +import spoon.test.interfaces.testclasses.RedefinesStaticMethodInterface; import spoon.testing.utils.ModelTest; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.Collection; -import java.io.File; - -import static spoon.test.SpoonTestHelpers.contentEquals; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static spoon.testing.utils.ModelUtils.build; -import static spoon.testing.utils.ModelUtils.createFactory; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.test.SpoonTestHelpers.contentEquals; +import static spoon.testing.utils.ModelUtils.build; +import static spoon.testing.utils.ModelUtils.createFactory; public class InterfaceTest { diff --git a/src/test/java/spoon/test/interfaces/TestInterfaceWithoutSetup.java b/src/test/java/spoon/test/interfaces/TestInterfaceWithoutSetup.java index ff0b1e556bd..5015935f1ba 100644 --- a/src/test/java/spoon/test/interfaces/TestInterfaceWithoutSetup.java +++ b/src/test/java/spoon/test/interfaces/TestInterfaceWithoutSetup.java @@ -16,25 +16,24 @@ */ package spoon.test.interfaces; -import spoon.reflect.factory.Factory; -import spoon.support.reflect.CtExtendedModifier; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtField; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; -import org.junit.jupiter.api.Test; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.support.reflect.CtExtendedModifier; import spoon.testing.utils.ModelTest; -import java.util.Set; -import java.io.IOException; -import java.nio.file.Files; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestInterfaceWithoutSetup { diff --git a/src/test/java/spoon/test/invocations/InvocationTest.java b/src/test/java/spoon/test/invocations/InvocationTest.java index 2dd9ad5e54d..396d59df83e 100644 --- a/src/test/java/spoon/test/invocations/InvocationTest.java +++ b/src/test/java/spoon/test/invocations/InvocationTest.java @@ -16,35 +16,34 @@ */ package spoon.test.invocations; -import spoon.reflect.visitor.filter.AbstractFilter; -import spoon.reflect.code.CtTypeAccess; -import spoon.reflect.factory.Factory; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.reflect.code.CtInvocation; -import spoon.reflect.reference.CtExecutableReference; -import spoon.SpoonAPI; -import spoon.test.invocations.testclasses.Foo; -import spoon.reflect.declaration.CtExecutable; -import spoon.reflect.declaration.CtType; -import spoon.test.invocations.testclasses.Bar; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.SpoonAPI; import spoon.reflect.CtModel; +import spoon.reflect.code.CtInvocation; +import spoon.reflect.code.CtTypeAccess; import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Collections; -import java.util.stream.Collectors; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.visitor.filter.AbstractFilter; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.test.invocations.testclasses.Bar; +import spoon.test.invocations.testclasses.Foo; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static spoon.testing.utils.ModelUtils.build; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static spoon.testing.utils.ModelUtils.build; public class InvocationTest { diff --git a/src/test/java/spoon/test/issue3321/AnnotationPositionTest.java b/src/test/java/spoon/test/issue3321/AnnotationPositionTest.java index d0b7a733033..b2688ba41af 100644 --- a/src/test/java/spoon/test/issue3321/AnnotationPositionTest.java +++ b/src/test/java/spoon/test/issue3321/AnnotationPositionTest.java @@ -1,17 +1,17 @@ package spoon.test.issue3321; -import spoon.reflect.cu.SourcePosition; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.reflect.cu.SourcePosition; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtParameter; import spoon.reflect.factory.Factory; import spoon.test.issue3321.testclasses.AnnoUser; import spoon.testing.utils.GitHubIssue; -import spoon.reflect.declaration.CtParameter; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtMethod; -import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class AnnotationPositionTest { diff --git a/src/test/java/spoon/test/issue3321/CtClassProcessor.java b/src/test/java/spoon/test/issue3321/CtClassProcessor.java index bded288c54c..9b2ca1417ab 100644 --- a/src/test/java/spoon/test/issue3321/CtClassProcessor.java +++ b/src/test/java/spoon/test/issue3321/CtClassProcessor.java @@ -9,8 +9,8 @@ * Apr, 2020 **/ public class CtClassProcessor extends AbstractProcessor { - @Override - public void process(CtClass element) { + @Override + public void process(CtClass element) { - } + } } diff --git a/src/test/java/spoon/test/issue3321/SniperPrettyPrinterJavaxTest.java b/src/test/java/spoon/test/issue3321/SniperPrettyPrinterJavaxTest.java index f898443e541..151867bffca 100644 --- a/src/test/java/spoon/test/issue3321/SniperPrettyPrinterJavaxTest.java +++ b/src/test/java/spoon/test/issue3321/SniperPrettyPrinterJavaxTest.java @@ -1,24 +1,24 @@ package spoon.test.issue3321; -import spoon.support.sniper.SniperJavaPrettyPrinter; +import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.compiler.Environment; -import org.junit.jupiter.api.Test; +import spoon.support.sniper.SniperJavaPrettyPrinter; public class SniperPrettyPrinterJavaxTest { - @Test - public void testThatCanGenerateSniperPrettyPrintedSourceForJavaxAnnotatedClasses() { - //This test insure that annotations being cloned and associated to to elements - //(here a CtParameter and its associated CtTypeReference) do not trigger a crash of the sniper pretty printer. - final Launcher l = new Launcher(); - Environment e = l.getEnvironment(); + @Test + public void testThatCanGenerateSniperPrettyPrintedSourceForJavaxAnnotatedClasses() { + //This test insure that annotations being cloned and associated to to elements + //(here a CtParameter and its associated CtTypeReference) do not trigger a crash of the sniper pretty printer. + final Launcher l = new Launcher(); + Environment e = l.getEnvironment(); - e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); - e.setNoClasspath(true); - e.setAutoImports(true); - l.addProcessor(new CtClassProcessor()); - l.addInputResource("src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java"); - l.setSourceOutputDirectory("src/test/resources"); - l.run(); - } + e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); + e.setNoClasspath(true); + e.setAutoImports(true); + l.addProcessor(new CtClassProcessor()); + l.addInputResource("src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java"); + l.setSourceOutputDirectory("src/test/resources"); + l.run(); + } } diff --git a/src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java b/src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java index fd058ccf24e..5c315d35190 100644 --- a/src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java +++ b/src/test/java/spoon/test/issue3321/source/JavaxImportTestSource.java @@ -1,9 +1,7 @@ package spoon.test.issue3321.source; -import spoon.test.issue3321.SomeObjectDto; - -import javax.validation.Valid; import javax.validation.constraints.NotNull; +import spoon.test.issue3321.SomeObjectDto; /** * @author Gibah Joseph @@ -11,7 +9,7 @@ * Apr, 2020 **/ public class JavaxImportTestSource { - public JavaxImportTestSource setObject(@NotNull SomeObjectDto someObjectDto) { - return this; - } + public JavaxImportTestSource setObject(@NotNull SomeObjectDto someObjectDto) { + return this; + } } diff --git a/src/test/java/spoon/test/jar/JarTest.java b/src/test/java/spoon/test/jar/JarTest.java index 42f056d6459..8cd1a2f5d99 100644 --- a/src/test/java/spoon/test/jar/JarTest.java +++ b/src/test/java/spoon/test/jar/JarTest.java @@ -16,27 +16,26 @@ */ package spoon.test.jar; -import spoon.compiler.SpoonResource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; +import spoon.Launcher; import spoon.SpoonModelBuilder; -import spoon.reflect.factory.Factory; -import spoon.compiler.SpoonResourceHelper; import spoon.compiler.SpoonFile; +import spoon.compiler.SpoonResource; +import spoon.compiler.SpoonResourceHelper; +import spoon.reflect.factory.Factory; import spoon.support.compiler.VirtualFile; import spoon.support.compiler.ZipFolder; -import spoon.Launcher; -import org.junit.jupiter.api.Test; - -import java.io.UnsupportedEncodingException; -import java.io.InputStream; -import java.io.IOException; -import java.io.ByteArrayOutputStream; -import java.util.List; -import java.io.File; -import java.util.Arrays; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; public class JarTest { @@ -48,12 +47,12 @@ public void testJarResources() throws Exception { List files = folder.getAllFiles(); assertEquals(5, files.size()); assertEquals("Manifest-Version: 1.0\r\n\r\n", readFileString(files.stream().filter(f -> "META-INF/MANIFEST.MF".equals(f.getName())).findFirst().get(), "ISO-8859-1")); - assertEquals("\n" + - "\n" + - " \n" + - " \n" + - " \n" + - "\n" + + assertEquals("\n" + + "\n" + + " \n" + + " \n" + + " \n" + + "\n" + "", readFileString(files.stream().filter(f -> ".classpath".equals(f.getName())).findFirst().get(), "ISO-8859-1")); } @@ -63,7 +62,7 @@ private byte[] readFileBytes(SpoonFile file) { while(true) { int count = is.read(buff); if (count < 0) { - break; + break; } baos.write(buff, 0, count); } diff --git a/src/test/java/spoon/test/javadoc/JavaDocTest.java b/src/test/java/spoon/test/javadoc/JavaDocTest.java index 25e32b6f091..09893104004 100644 --- a/src/test/java/spoon/test/javadoc/JavaDocTest.java +++ b/src/test/java/spoon/test/javadoc/JavaDocTest.java @@ -16,6 +16,7 @@ */ package spoon.test.javadoc; +import java.util.List; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.OutputType; @@ -40,8 +41,6 @@ import spoon.test.javadoc.testclasses.Bar; import spoon.testing.utils.ModelTest; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import static spoon.testing.utils.Check.assertCtElementEquals; diff --git a/src/test/java/spoon/test/jdtimportbuilder/ImportBuilderTest.java b/src/test/java/spoon/test/jdtimportbuilder/ImportBuilderTest.java index 71863b07ec3..f9d4f32d679 100644 --- a/src/test/java/spoon/test/jdtimportbuilder/ImportBuilderTest.java +++ b/src/test/java/spoon/test/jdtimportbuilder/ImportBuilderTest.java @@ -16,31 +16,30 @@ */ package spoon.test.jdtimportbuilder; -import spoon.reflect.factory.Factory; -import spoon.test.imports.testclasses.A; -import spoon.reflect.reference.CtFieldReference; -import spoon.test.jdtimportbuilder.testclasses.StaticImport; +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.experimental.CtUnresolvedImport; import spoon.reflect.cu.CompilationUnit; +import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtImport; -import spoon.test.jdtimportbuilder.testclasses.StaticImportWithInheritance; import spoon.reflect.declaration.CtImportKind; -import spoon.experimental.CtUnresolvedImport; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtPackageReference; import spoon.reflect.reference.CtTypeReference; -import spoon.Launcher; -import spoon.reflect.declaration.CtClass; -import spoon.test.jdtimportbuilder.testclasses.StarredImport; +import spoon.test.imports.testclasses.A; import spoon.test.imports.testclasses.ClassWithInvocation; -import org.junit.jupiter.api.Test; +import spoon.test.jdtimportbuilder.testclasses.StarredImport; +import spoon.test.jdtimportbuilder.testclasses.StaticImport; +import spoon.test.jdtimportbuilder.testclasses.StaticImportWithInheritance; import spoon.testing.utils.ModelTest; -import java.util.stream.Collectors; -import java.util.Set; -import java.util.Collection; -import java.util.Iterator; - -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Created by urli on 09/08/2017. diff --git a/src/test/java/spoon/test/labels/TestLabels.java b/src/test/java/spoon/test/labels/TestLabels.java index c9b87a3570c..96182fff05b 100644 --- a/src/test/java/spoon/test/labels/TestLabels.java +++ b/src/test/java/spoon/test/labels/TestLabels.java @@ -16,116 +16,113 @@ */ package spoon.test.labels; -import spoon.reflect.code.CtBreak; -import spoon.reflect.code.CtSwitch; -import spoon.reflect.code.CtIf; -import spoon.reflect.code.CtWhile; -import spoon.reflect.code.CtStatement; +import java.util.List; import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtBreak; import spoon.reflect.code.CtCase; -import spoon.Launcher; -import spoon.reflect.code.CtFor; -import spoon.reflect.code.CtDo; import spoon.reflect.code.CtContinue; +import spoon.reflect.code.CtDo; +import spoon.reflect.code.CtFor; +import spoon.reflect.code.CtIf; +import spoon.reflect.code.CtStatement; +import spoon.reflect.code.CtSwitch; +import spoon.reflect.code.CtWhile; import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.filter.NamedElementFilter; -import org.junit.jupiter.api.Test; import spoon.testing.utils.ModelTest; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Created by urli on 19/06/2017. */ public class TestLabels { - @ModelTest("./src/test/java/spoon/test/labels/testclasses/ManyLabels.java") - public void testLabelsAreDetected(Factory factory) { - CtMethod mainMethod = factory.getModel().getElements(new NamedElementFilter<>(CtMethod.class,"main")).get(0); + @ModelTest("./src/test/java/spoon/test/labels/testclasses/ManyLabels.java") + public void testLabelsAreDetected(Factory factory) { + CtMethod mainMethod = factory.getModel().getElements(new NamedElementFilter<>(CtMethod.class,"main")).get(0); - CtBlock body = mainMethod.getBody(); - assertEquals(2, body.getStatements().size()); + CtBlock body = mainMethod.getBody(); + assertEquals(2, body.getStatements().size()); - CtBlock block = (CtBlock) body.getStatement(0); - CtSwitch ctSwitch = (CtSwitch) body.getStatement(1); + CtBlock block = (CtBlock) body.getStatement(0); + CtSwitch ctSwitch = (CtSwitch) body.getStatement(1); - assertEquals("labelBlock",block.getLabel()); - assertEquals("sw", ctSwitch.getLabel()); + assertEquals("labelBlock",block.getLabel()); + assertEquals("sw", ctSwitch.getLabel()); - assertTrue(block.getStatement(1) instanceof CtIf); + assertTrue(block.getStatement(1) instanceof CtIf); - CtIf firstIf = (CtIf) block.getStatement(1); + CtIf firstIf = (CtIf) block.getStatement(1); - CtBlock then = firstIf.getThenStatement(); - CtBreak firstBreak = (CtBreak) then.getStatement(1); + CtBlock then = firstIf.getThenStatement(); + CtBreak firstBreak = (CtBreak) then.getStatement(1); - assertEquals("labelBlock", firstBreak.getTargetLabel()); - assertSame(block, firstBreak.getLabelledStatement()); + assertEquals("labelBlock", firstBreak.getTargetLabel()); + assertSame(block, firstBreak.getLabelledStatement()); - CtIf secondIf = (CtIf) block.getStatement(2); - assertEquals("labelIf", secondIf.getLabel()); + CtIf secondIf = (CtIf) block.getStatement(2); + assertEquals("labelIf", secondIf.getLabel()); - CtBlock thenBlock = secondIf.getThenStatement(); - CtIf innerIf = (CtIf) thenBlock.getStatement(0); + CtBlock thenBlock = secondIf.getThenStatement(); + CtIf innerIf = (CtIf) thenBlock.getStatement(0); - CtBlock innerThenBlock = innerIf.getThenStatement(); - CtBreak breakInnerIf = (CtBreak) innerThenBlock.getStatement(0); - assertSame(secondIf, breakInnerIf.getLabelledStatement()); + CtBlock innerThenBlock = innerIf.getThenStatement(); + CtBreak breakInnerIf = (CtBreak) innerThenBlock.getStatement(0); + assertSame(secondIf, breakInnerIf.getLabelledStatement()); - CtCase firstCase = (CtCase) ctSwitch.getCases().get(0); - List statementList = firstCase.getStatements(); + CtCase firstCase = (CtCase) ctSwitch.getCases().get(0); + List statementList = firstCase.getStatements(); - assertEquals(2, statementList.size()); + assertEquals(2, statementList.size()); - CtDo ctDo = (CtDo) statementList.get(0); - assertEquals("label", ctDo.getLabel()); + CtDo ctDo = (CtDo) statementList.get(0); + assertEquals("label", ctDo.getLabel()); - CtBreak finalBreak = (CtBreak) statementList.get(1); - assertNull(finalBreak.getTargetLabel()); - assertNull(finalBreak.getLabelledStatement()); + CtBreak finalBreak = (CtBreak) statementList.get(1); + assertNull(finalBreak.getTargetLabel()); + assertNull(finalBreak.getLabelledStatement()); - CtBlock doBlock = (CtBlock) ctDo.getBody(); - CtWhile ctWhile = (CtWhile) doBlock.getStatement(1); - assertEquals("lWhile", ctWhile.getLabel()); + CtBlock doBlock = (CtBlock) ctDo.getBody(); + CtWhile ctWhile = (CtWhile) doBlock.getStatement(1); + assertEquals("lWhile", ctWhile.getLabel()); - CtBlock whileBlock = (CtBlock) ctWhile.getBody(); - CtFor forLoop = (CtFor) whileBlock.getStatement(0); - CtBreak breakSwitch = (CtBreak) whileBlock.getStatement(1); + CtBlock whileBlock = (CtBlock) ctWhile.getBody(); + CtFor forLoop = (CtFor) whileBlock.getStatement(0); + CtBreak breakSwitch = (CtBreak) whileBlock.getStatement(1); - assertEquals("sw", breakSwitch.getTargetLabel()); - assertSame(ctSwitch, breakSwitch.getLabelledStatement()); + assertEquals("sw", breakSwitch.getTargetLabel()); + assertSame(ctSwitch, breakSwitch.getLabelledStatement()); - assertEquals("forloop", forLoop.getLabel()); - CtBlock forBlock = (CtBlock) forLoop.getBody(); + assertEquals("forloop", forLoop.getLabel()); + CtBlock forBlock = (CtBlock) forLoop.getBody(); - assertEquals(7, forBlock.getStatements().size()); - CtIf firstForIf = (CtIf) forBlock.getStatement(1); - CtIf secondForIf = (CtIf) forBlock.getStatement(2); - CtIf thirdForIf = (CtIf) forBlock.getStatement(3); - CtIf fourthForIf = (CtIf) forBlock.getStatement(4); + assertEquals(7, forBlock.getStatements().size()); + CtIf firstForIf = (CtIf) forBlock.getStatement(1); + CtIf secondForIf = (CtIf) forBlock.getStatement(2); + CtIf thirdForIf = (CtIf) forBlock.getStatement(3); + CtIf fourthForIf = (CtIf) forBlock.getStatement(4); - CtBreak breakItself = (CtBreak) forBlock.getStatement(6); + CtBreak breakItself = (CtBreak) forBlock.getStatement(6); - CtContinue continueFor = (CtContinue) ((CtBlock) firstForIf.getThenStatement()).getStatement(0); - assertSame(forLoop, continueFor.getLabelledStatement()); + CtContinue continueFor = (CtContinue) ((CtBlock) firstForIf.getThenStatement()).getStatement(0); + assertSame(forLoop, continueFor.getLabelledStatement()); - CtContinue continueWhile = (CtContinue) ((CtBlock) secondForIf.getThenStatement()).getStatement(0); - assertSame(ctWhile, continueWhile.getLabelledStatement()); + CtContinue continueWhile = (CtContinue) ((CtBlock) secondForIf.getThenStatement()).getStatement(0); + assertSame(ctWhile, continueWhile.getLabelledStatement()); - CtContinue continueDo = (CtContinue) ((CtBlock) thirdForIf.getThenStatement()).getStatement(0); - assertSame(ctDo, continueDo.getLabelledStatement()); + CtContinue continueDo = (CtContinue) ((CtBlock) thirdForIf.getThenStatement()).getStatement(0); + assertSame(ctDo, continueDo.getLabelledStatement()); - CtBreak breakDo = (CtBreak) ((CtBlock) fourthForIf.getThenStatement()).getStatement(0); - assertSame(ctDo, breakDo.getLabelledStatement()); + CtBreak breakDo = (CtBreak) ((CtBlock) fourthForIf.getThenStatement()).getStatement(0); + assertSame(ctDo, breakDo.getLabelledStatement()); - assertEquals("labelbreak", breakItself.getLabel()); - assertEquals("labelbreak", breakItself.getTargetLabel()); - assertSame(breakItself, breakItself.getLabelledStatement()); - } + assertEquals("labelbreak", breakItself.getLabel()); + assertEquals("labelbreak", breakItself.getTargetLabel()); + assertSame(breakItself, breakItself.getLabelledStatement()); + } } diff --git a/src/test/java/spoon/test/lambda/AnonymousInLambdaTest.java b/src/test/java/spoon/test/lambda/AnonymousInLambdaTest.java index c358a69284f..2ef818f9345 100644 --- a/src/test/java/spoon/test/lambda/AnonymousInLambdaTest.java +++ b/src/test/java/spoon/test/lambda/AnonymousInLambdaTest.java @@ -1,13 +1,12 @@ package spoon.test.lambda; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.processing.AbstractProcessor; import spoon.reflect.declaration.CtClass; -import java.util.HashSet; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.assertFalse; public class AnonymousInLambdaTest { diff --git a/src/test/java/spoon/test/lambda/LambdaTest.java b/src/test/java/spoon/test/lambda/LambdaTest.java index 4f1c099cee3..401037c7301 100644 --- a/src/test/java/spoon/test/lambda/LambdaTest.java +++ b/src/test/java/spoon/test/lambda/LambdaTest.java @@ -16,6 +16,12 @@ */ package spoon.test.lambda; +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -53,13 +59,6 @@ import spoon.test.lambda.testclasses.Tacos; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -317,7 +316,7 @@ public void testTypeParameterOfLambdaWithoutType() { assertEquals("SingleSubscriber", ctParameterFirstLambda.getType().getSimpleName()); } @Test - public void testTypeParameterOfLambdaWithoutType2() { + public void testTypeParameterOfLambdaWithoutType2() { final CtLambda lambda2 = bar.getElements(new TypeFilter>(CtLambda.class)).get(1); assertEquals(2, lambda2.getParameters().size()); final CtParameter ctParameterSecondLambda = lambda2.getParameters().get(0); @@ -380,7 +379,7 @@ public void testBuildExecutableReferenceFromLambda() throws Exception { assertNotNull(collect); assertEquals(1, collect.size()); } - + @Test public void testEqualsLambdaParameterRef() { CtLambda lambda = getLambdaInFooByNumber(8); @@ -397,7 +396,7 @@ public void testLambdaMethod() { CtTypeReference iface = lambda.getType(); assertEquals(Consumer.class.getName(), iface.getQualifiedName()); assertEquals(iface.getTypeDeclaration().getMethodsByName("accept").get(0), method); -/* This assertion fails now +/* This assertion fails now CtExecutableReference lambdaRef = lambda.getReference(); CtExecutableReference methodRef = lambdaRef.getOverridingExecutable(); // because methodRef is null @@ -463,7 +462,7 @@ public void testLambdaWithGenericExtendingMultipleInterfaces() { @Test public void testCastLambdaWithIntersection() { - // contract: intersection types on lambda parameters are supported + // contract: intersection types on lambda parameters are supported final CtLambda lambda1 = intersection.getElements(new TypeFilter>(CtLambda.class)).get(1); lambda1.getReference(); final CtLambda lambda2 = intersection.getElements(new TypeFilter>(CtLambda.class)).get(2); @@ -515,7 +514,7 @@ private void assertParameterIsNamedBy(String name, CtParameter parameter) { private void assertIsWellPrinted(String expected, CtLambda lambda) { assertEquals(expected, printByPrinter(lambda), "Lambda must be well printed"); } - + private static String printByPrinter(CtElement element) { return ImportTest.printByPrinter(element); } diff --git a/src/test/java/spoon/test/limits/utils/InternalTest.java b/src/test/java/spoon/test/limits/utils/InternalTest.java index 90ea46a5778..acbfcfaec0a 100644 --- a/src/test/java/spoon/test/limits/utils/InternalTest.java +++ b/src/test/java/spoon/test/limits/utils/InternalTest.java @@ -16,6 +16,7 @@ */ package spoon.test.limits.utils; +import java.util.List; import org.junit.jupiter.api.Test; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtNamedElement; @@ -23,8 +24,6 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.test.limits.utils.testclasses.ContainInternalClass; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertSame; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/test/literal/LiteralTest.java b/src/test/java/spoon/test/literal/LiteralTest.java index 4d7e994e5d8..c4bc7e360e1 100644 --- a/src/test/java/spoon/test/literal/LiteralTest.java +++ b/src/test/java/spoon/test/literal/LiteralTest.java @@ -16,30 +16,30 @@ */ package spoon.test.literal; -import spoon.reflect.factory.Factory; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.support.comparator.DeepRepresentationComparator; -import spoon.reflect.declaration.CtType; -import spoon.reflect.code.CtLiteral; -import spoon.reflect.factory.CodeFactory; -import spoon.test.literal.testclasses.Tacos; +import java.util.List; +import java.util.TreeSet; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.reflect.code.CtLiteral; import spoon.reflect.code.LiteralBase; import spoon.reflect.cu.SourcePosition; -import spoon.reflect.factory.TypeFactory; import spoon.reflect.declaration.CtClass; -import org.junit.jupiter.api.Test; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.CodeFactory; +import spoon.reflect.factory.Factory; +import spoon.reflect.factory.TypeFactory; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.support.comparator.DeepRepresentationComparator; +import spoon.test.literal.testclasses.Tacos; import spoon.testing.utils.GitHubIssue; import spoon.testing.utils.ModelTest; -import java.util.List; -import java.util.TreeSet; -import static spoon.testing.utils.ModelUtils.buildClass; -import static spoon.testing.utils.ModelUtils.canBeBuilt; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.utils.ModelUtils.buildClass; +import static spoon.testing.utils.ModelUtils.canBeBuilt; public class LiteralTest { diff --git a/src/test/java/spoon/test/literal/UnicodeBugTest.java b/src/test/java/spoon/test/literal/UnicodeBugTest.java index 043d8c8fefb..2bc9f427a4f 100644 --- a/src/test/java/spoon/test/literal/UnicodeBugTest.java +++ b/src/test/java/spoon/test/literal/UnicodeBugTest.java @@ -1,16 +1,15 @@ package spoon.test.literal; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.processing.AbstractProcessor; +import spoon.reflect.CtModel; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtCodeElement; import spoon.reflect.code.CtLiteral; import spoon.reflect.declaration.CtField; -import spoon.Launcher; -import spoon.processing.AbstractProcessor; import spoon.reflect.visitor.filter.TypeFilter; -import spoon.reflect.CtModel; import spoon.support.compiler.VirtualFile; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/logging/LogTest.java b/src/test/java/spoon/test/logging/LogTest.java index 9de1d6c96b6..cdc0e4e25ea 100644 --- a/src/test/java/spoon/test/logging/LogTest.java +++ b/src/test/java/spoon/test/logging/LogTest.java @@ -19,6 +19,9 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.AfterTestExecutionCallback; @@ -26,8 +29,8 @@ import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolver; -import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.slf4j.LoggerFactory; import spoon.FluentLauncher; import spoon.Launcher; @@ -41,10 +44,6 @@ import spoon.support.Level; import spoon.testing.utils.GitHubIssue; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -139,10 +138,10 @@ public void process(CtConstructor element) { // do nothing } public boolean isToBeProcessed(CtConstructor candidate) { - List> invocations = Query.getElements(candidate, new TypeFilter<>(CtInvocation.class)); - invocations.forEach(i -> getEnvironment().report(this, Level.INFO, i, "Message")); - return false; - }}; + List> invocations = Query.getElements(candidate, new TypeFilter<>(CtInvocation.class)); + invocations.forEach(i -> getEnvironment().report(this, Level.INFO, i, "Message")); + return false; + }}; assertDoesNotThrow(() -> new FluentLauncher().inputResource(codePath).processor(processor).buildModel()); } diff --git a/src/test/java/spoon/test/loop/LoopTest.java b/src/test/java/spoon/test/loop/LoopTest.java index d5b07bdb3e8..a88ecb10765 100644 --- a/src/test/java/spoon/test/loop/LoopTest.java +++ b/src/test/java/spoon/test/loop/LoopTest.java @@ -16,27 +16,26 @@ */ package spoon.test.loop; -import spoon.test.loop.testclasses.Condition; -import spoon.test.loop.testclasses.Join; -import spoon.reflect.visitor.filter.TypeFilter; +import java.io.File; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.CtModel; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtFor; import spoon.reflect.code.CtForEach; import spoon.reflect.code.CtLocalVariable; -import spoon.reflect.declaration.CtConstructor; import spoon.reflect.code.CtLoop; -import spoon.reflect.declaration.CtType; -import spoon.reflect.code.CtBlock; -import spoon.Launcher; -import spoon.reflect.code.CtFor; -import spoon.reflect.CtModel; import spoon.reflect.declaration.CtClass; -import org.junit.jupiter.api.Test; - -import java.io.File; +import spoon.reflect.declaration.CtConstructor; +import spoon.reflect.declaration.CtType; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.test.loop.testclasses.Condition; +import spoon.test.loop.testclasses.Join; -import static spoon.testing.utils.ModelUtils.build; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.utils.ModelUtils.build; public class LoopTest { private static final String nl = System.lineSeparator(); diff --git a/src/test/java/spoon/test/main/MainTest.java b/src/test/java/spoon/test/main/MainTest.java index c7eb7fc65db..733a32ee763 100644 --- a/src/test/java/spoon/test/main/MainTest.java +++ b/src/test/java/spoon/test/main/MainTest.java @@ -16,18 +16,17 @@ */ package spoon.test.main; -import org.junit.jupiter.api.Test; -import spoon.ContractVerifier; -import spoon.Launcher; -import spoon.reflect.declaration.CtPackage; -import spoon.reflect.declaration.CtType; - import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import spoon.ContractVerifier; +import spoon.Launcher; +import spoon.reflect.declaration.CtPackage; +import spoon.reflect.declaration.CtType; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -73,7 +72,7 @@ public void testGenericContract() throws IOException { // we verify all the contracts new ContractVerifier(rootPackage).verify(); } - + private boolean filePathContains(Path path, String substring) { //normalize path separators to linux, to simplify searching for substring return path.toFile().getAbsolutePath().replace('\\', '/').contains(substring); diff --git a/src/test/java/spoon/test/method/MethodTest.java b/src/test/java/spoon/test/method/MethodTest.java index 50d8fa1e21b..96424d85897 100644 --- a/src/test/java/spoon/test/method/MethodTest.java +++ b/src/test/java/spoon/test/method/MethodTest.java @@ -16,45 +16,43 @@ */ package spoon.test.method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Test; +import spoon.Launcher; import spoon.reflect.code.CtInvocation; -import spoon.reflect.factory.Factory; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtParameter; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.test.method.testclasses.Hierarchy; -import spoon.test.method.testclasses.Tacos; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtTypeParameter; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.filter.NamedElementFilter; -import spoon.reflect.declaration.CtTypeParameter; +import spoon.reflect.visitor.filter.TypeFilter; import spoon.test.delete.testclasses.Adobada; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.declaration.CtType; -import spoon.Launcher; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtMethod; +import spoon.test.method.testclasses.Hierarchy; import spoon.test.method.testclasses.Methods; -import org.junit.jupiter.api.Test; +import spoon.test.method.testclasses.Tacos; import spoon.testing.utils.ModelTest; -import java.util.List; -import java.util.Set; -import java.util.ConcurrentModificationException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Arrays; - import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.sameInstance; -import static spoon.testing.utils.ModelUtils.buildClass; -import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static spoon.testing.utils.ModelUtils.build; -import static spoon.testing.utils.ModelUtils.createFactory; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static spoon.testing.utils.ModelUtils.build; +import static spoon.testing.utils.ModelUtils.buildClass; +import static spoon.testing.utils.ModelUtils.createFactory; public class MethodTest { diff --git a/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java b/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java index e9fc7a3c2ce..d841a295358 100644 --- a/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java +++ b/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java @@ -1,133 +1,132 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.method_overriding; - -import spoon.SpoonModelBuilder; -import spoon.reflect.factory.Factory; -import spoon.test.method_overriding.testclasses2.ObjectInterface; -import spoon.compiler.SpoonResourceHelper; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.reflect.declaration.CtType; -import spoon.testing.utils.ModelUtils; -import spoon.Launcher; -import spoon.reflect.declaration.CtMethod; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.ArrayList; -import java.util.function.BiFunction; -import java.util.Comparator; -import java.util.List; -import java.io.File; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertFalse; - -public class MethodOverriddingTest { - - @Test - public void testShadowInterfaceMethodsCanOverrideObjectMethods() { - //contract: Interface (made by reflection) method equals overrides Object#equals - Factory f = new Launcher().getFactory(); - CtType iface = f.Interface().get(Comparator.class); - assertTrue(iface.isShadow()); - CtMethod comparatorEquals = iface.getMethodsByName("equals").get(0); - - CtType object = f.Class().get(Object.class); - assertTrue(object.isShadow()); - CtMethod objectEquals = object.getMethodsByName("equals").get(0); - - assertTrue(comparatorEquals.isOverriding(objectEquals)); - } - - @Test - public void testInterfaceMethodsCanOverrideObjectMethods() throws Exception { - //contract: Interface (made from sources) method equals overrides Object#equals - Launcher launcher = new Launcher(); - Factory f = launcher.getFactory(); - SpoonModelBuilder comp = launcher.createCompiler(); - comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/spoon/test/method_overriding/testclasses2/ObjectInterface.java")); - comp.build(); - CtType iface = f.Interface().get(ObjectInterface.class); - assertFalse(iface.isShadow()); - CtMethod ifaceEquals = iface.getMethodsByName("equals").get(0); - - CtType object = iface.getFactory().Class().get(Object.class); - assertTrue(object.isShadow()); - CtMethod objectEquals = object.getMethodsByName("equals").get(0); - - assertTrue(ifaceEquals.isOverriding(objectEquals)); - } - - @Test - public void testMethodOverride() { - checkMethodOverride((m1, m2)->m1.isOverriding(m2)); - } - - @Test - public void testMethodOverrideByReference() { - checkMethodOverride((m1, m2)->m1.getReference().isOverriding(m2.getReference())); - } - - private void checkMethodOverride(BiFunction, CtMethod, Boolean> isOverriding) { - Factory factory = ModelUtils.build(new File("src/test/java/spoon/test/method_overriding/testclasses").listFiles()); - Map> methodsByName = new HashMap<>(); - factory.getModel().filterChildren(new TypeFilter<>(CtMethod.class)).forEach((CtMethod m)->{ - List methods = methodsByName.get(m.getSimpleName()); - if(methods==null) { - methods = new ArrayList<>(); - methodsByName.put(m.getSimpleName(), methods); - } - methods.add(m); - }); - assertFalse(methodsByName.isEmpty()); - for (Map.Entry> e : methodsByName.entrySet()) { - combine(e.getValue(), 0, isOverriding); - } - } - - private void combine(List value, int start, BiFunction, CtMethod, Boolean> isOverriding) { - CtMethod m1 = value.get(start); - if(start+1 < value.size()) { - for (CtMethod m2 : value.subList(start+1, value.size())) { - if(m1.getDeclaringType().isSubtypeOf(m2.getDeclaringType().getReference())) { - checkOverride(m1, m2, isOverriding); - } else if(m2.getDeclaringType().isSubtypeOf(m1.getDeclaringType().getReference())) { - checkOverride(m2, m1, isOverriding); - } else { - checkNotOverride(m1, m2, isOverriding); - } - } - combine(value, start+1, isOverriding); - } - } - - private void checkOverride(CtMethod m1, CtMethod m2, BiFunction, CtMethod, Boolean> isOverriding) { - assertTrue(isOverriding.apply(m1, m2), descr(m1) + " overriding " + descr(m2)); - assertFalse(isOverriding.apply(m2, m1), descr(m2) + " NOT overriding " + descr(m1)); - } - - private void checkNotOverride(CtMethod m1, CtMethod m2, BiFunction, CtMethod, Boolean> isOverriding) { - assertFalse(isOverriding.apply(m1, m2), descr(m1) + " NOT overriding " + descr(m2)); - assertFalse(isOverriding.apply(m2, m1), descr(m2) + " NOT overriding " + descr(m1)); - } - - private String descr(CtMethod m) { - return m.getDeclaringType().getSimpleName()+"#"+m.getSimpleName(); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.method_overriding; + +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.SpoonModelBuilder; +import spoon.compiler.SpoonResourceHelper; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.Factory; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.test.method_overriding.testclasses2.ObjectInterface; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MethodOverriddingTest { + + @Test + public void testShadowInterfaceMethodsCanOverrideObjectMethods() { + //contract: Interface (made by reflection) method equals overrides Object#equals + Factory f = new Launcher().getFactory(); + CtType iface = f.Interface().get(Comparator.class); + assertTrue(iface.isShadow()); + CtMethod comparatorEquals = iface.getMethodsByName("equals").get(0); + + CtType object = f.Class().get(Object.class); + assertTrue(object.isShadow()); + CtMethod objectEquals = object.getMethodsByName("equals").get(0); + + assertTrue(comparatorEquals.isOverriding(objectEquals)); + } + + @Test + public void testInterfaceMethodsCanOverrideObjectMethods() throws Exception { + //contract: Interface (made from sources) method equals overrides Object#equals + Launcher launcher = new Launcher(); + Factory f = launcher.getFactory(); + SpoonModelBuilder comp = launcher.createCompiler(); + comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/spoon/test/method_overriding/testclasses2/ObjectInterface.java")); + comp.build(); + CtType iface = f.Interface().get(ObjectInterface.class); + assertFalse(iface.isShadow()); + CtMethod ifaceEquals = iface.getMethodsByName("equals").get(0); + + CtType object = iface.getFactory().Class().get(Object.class); + assertTrue(object.isShadow()); + CtMethod objectEquals = object.getMethodsByName("equals").get(0); + + assertTrue(ifaceEquals.isOverriding(objectEquals)); + } + + @Test + public void testMethodOverride() { + checkMethodOverride((m1, m2)->m1.isOverriding(m2)); + } + + @Test + public void testMethodOverrideByReference() { + checkMethodOverride((m1, m2)->m1.getReference().isOverriding(m2.getReference())); + } + + private void checkMethodOverride(BiFunction, CtMethod, Boolean> isOverriding) { + Factory factory = ModelUtils.build(new File("src/test/java/spoon/test/method_overriding/testclasses").listFiles()); + Map> methodsByName = new HashMap<>(); + factory.getModel().filterChildren(new TypeFilter<>(CtMethod.class)).forEach((CtMethod m)->{ + List methods = methodsByName.get(m.getSimpleName()); + if(methods==null) { + methods = new ArrayList<>(); + methodsByName.put(m.getSimpleName(), methods); + } + methods.add(m); + }); + assertFalse(methodsByName.isEmpty()); + for (Map.Entry> e : methodsByName.entrySet()) { + combine(e.getValue(), 0, isOverriding); + } + } + + private void combine(List value, int start, BiFunction, CtMethod, Boolean> isOverriding) { + CtMethod m1 = value.get(start); + if(start+1 < value.size()) { + for (CtMethod m2 : value.subList(start+1, value.size())) { + if(m1.getDeclaringType().isSubtypeOf(m2.getDeclaringType().getReference())) { + checkOverride(m1, m2, isOverriding); + } else if(m2.getDeclaringType().isSubtypeOf(m1.getDeclaringType().getReference())) { + checkOverride(m2, m1, isOverriding); + } else { + checkNotOverride(m1, m2, isOverriding); + } + } + combine(value, start+1, isOverriding); + } + } + + private void checkOverride(CtMethod m1, CtMethod m2, BiFunction, CtMethod, Boolean> isOverriding) { + assertTrue(isOverriding.apply(m1, m2), descr(m1) + " overriding " + descr(m2)); + assertFalse(isOverriding.apply(m2, m1), descr(m2) + " NOT overriding " + descr(m1)); + } + + private void checkNotOverride(CtMethod m1, CtMethod m2, BiFunction, CtMethod, Boolean> isOverriding) { + assertFalse(isOverriding.apply(m1, m2), descr(m1) + " NOT overriding " + descr(m2)); + assertFalse(isOverriding.apply(m2, m1), descr(m2) + " NOT overriding " + descr(m1)); + } + + private String descr(CtMethod m) { + return m.getDeclaringType().getSimpleName()+"#"+m.getSimpleName(); + } +} diff --git a/src/test/java/spoon/test/methodreference/MethodReferenceTest.java b/src/test/java/spoon/test/methodreference/MethodReferenceTest.java index 4cea92b42db..7ce0b2a8f24 100644 --- a/src/test/java/spoon/test/methodreference/MethodReferenceTest.java +++ b/src/test/java/spoon/test/methodreference/MethodReferenceTest.java @@ -16,6 +16,11 @@ */ package spoon.test.methodreference; +import java.io.File; +import java.lang.reflect.Method; +import java.util.Comparator; +import java.util.List; +import java.util.function.Supplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -44,12 +49,6 @@ import spoon.test.methodreference.testclasses.Foo; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.lang.reflect.Method; -import java.util.Comparator; -import java.util.List; -import java.util.function.Supplier; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -227,7 +226,7 @@ public void testNoClasspathSuperExecutable() { assertNotNull(toStringMethod.getAnnotation(overrideRef)); assertNotNull(toStringMethod.getReference().getOverridingExecutable()); } - + @Test public void testGetGenericMethodFromReference() throws Exception { CtType classCloud = ModelUtils.buildClass(Cloud.class); @@ -247,7 +246,7 @@ public void testGetGenericMethodFromReference() throws Exception { assertNotNull(method2); assertEquals("method", method2.getName()); } - + @Test public void testGetGenericExecutableReference() throws Exception { CtType classCloud = ModelUtils.buildClass(Cloud.class); diff --git a/src/test/java/spoon/test/model/AnonymousExecutableTest.java b/src/test/java/spoon/test/model/AnonymousExecutableTest.java index 8213cd48664..125756dbca0 100644 --- a/src/test/java/spoon/test/model/AnonymousExecutableTest.java +++ b/src/test/java/spoon/test/model/AnonymousExecutableTest.java @@ -16,14 +16,13 @@ */ package spoon.test.model; +import java.util.List; import org.junit.jupiter.api.Test; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtType; import spoon.reflect.visitor.filter.TypeFilter; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/test/model/BlockTest.java b/src/test/java/spoon/test/model/BlockTest.java index 977fd1a23e0..b0c5e09d978 100644 --- a/src/test/java/spoon/test/model/BlockTest.java +++ b/src/test/java/spoon/test/model/BlockTest.java @@ -16,8 +16,9 @@ */ package spoon.test.model; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; - import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtStatement; @@ -25,9 +26,6 @@ import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; -import java.util.ArrayList; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static spoon.testing.utils.ModelUtils.createFactory; diff --git a/src/test/java/spoon/test/model/ClassWithSuperAndIFace.java b/src/test/java/spoon/test/model/ClassWithSuperAndIFace.java index 41c9bcdb41d..b2ade841d89 100644 --- a/src/test/java/spoon/test/model/ClassWithSuperAndIFace.java +++ b/src/test/java/spoon/test/model/ClassWithSuperAndIFace.java @@ -1,14 +1,14 @@ -package spoon.test.model; - -import spoon.test.model.testclasses.InterfaceWrithFields; - -public class ClassWithSuperAndIFace extends Foo implements InterfaceWrithFields -{ - String classField; - - public ClassWithSuperAndIFace() - { - // TODO Auto-generated constructor stub - } - -} +package spoon.test.model; + +import spoon.test.model.testclasses.InterfaceWrithFields; + +public class ClassWithSuperAndIFace extends Foo implements InterfaceWrithFields +{ + String classField; + + public ClassWithSuperAndIFace() + { + // TODO Auto-generated constructor stub + } + +} diff --git a/src/test/java/spoon/test/model/Foo.java b/src/test/java/spoon/test/model/Foo.java index 3496697bae8..95f912bad40 100644 --- a/src/test/java/spoon/test/model/Foo.java +++ b/src/test/java/spoon/test/model/Foo.java @@ -3,21 +3,21 @@ public class Foo extends Bar { int i; void fooMethod(){} - + Foo() {} - + @Override void m() {} - + void useInner( Inner inner ) {} } class Bar extends Baz {} class Baz { - + int j; void bazMethod(){} void m() {} class Inner {} -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/model/IncrementalLauncherTest.java b/src/test/java/spoon/test/model/IncrementalLauncherTest.java index 11914f073c7..85ce4964949 100644 --- a/src/test/java/spoon/test/model/IncrementalLauncherTest.java +++ b/src/test/java/spoon/test/model/IncrementalLauncherTest.java @@ -16,8 +16,6 @@ */ package spoon.test.model; -import static org.junit.jupiter.api.Assertions.*; - import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -28,12 +26,10 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; - import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import spoon.IncrementalLauncher; import spoon.reflect.CtModel; import spoon.reflect.code.CtAssignment; @@ -42,6 +38,8 @@ import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtType; +import static org.junit.jupiter.api.Assertions.*; + public class IncrementalLauncherTest { final File RESOURCES_DIR = new File("./src/test/resources/incremental"); @@ -55,7 +53,7 @@ public class IncrementalLauncherTest { * The directory where the incremental launcher will cache the generated files. * Each testcase gets a new one created. */ - File cacheDir; + File cacheDir; @BeforeEach public void setUp() throws Exception { @@ -251,7 +249,7 @@ public void testSaveCacheIssue3404() { Set inputResources = new HashSet<>(); inputResources.add(new File("./src/test/resources/incremental/saveCacheIssue3404/A.java")); Set sourceClasspath = Collections.EMPTY_SET; - + IncrementalLauncher launcher1 = new IncrementalLauncher(inputResources, sourceClasspath, cacheDir); launcher1.getEnvironment().setShouldCompile(false); // in noclasspath we are @@ -260,4 +258,3 @@ public void testSaveCacheIssue3404() { launcher1.saveCache(); } } - diff --git a/src/test/java/spoon/test/model/SwitchCaseTest.java b/src/test/java/spoon/test/model/SwitchCaseTest.java index 1bec7134751..1b18329106c 100644 --- a/src/test/java/spoon/test/model/SwitchCaseTest.java +++ b/src/test/java/spoon/test/model/SwitchCaseTest.java @@ -8,30 +8,16 @@ package spoon.test.model; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static spoon.testing.utils.ModelUtils.build; -import static spoon.testing.utils.ModelUtils.createFactory; - import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.code.CaseKind; @@ -55,6 +41,18 @@ import spoon.support.compiler.VirtualFile; import spoon.testing.utils.GitHubIssue; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.utils.ModelUtils.build; +import static spoon.testing.utils.ModelUtils.createFactory; + @DisplayName("Switchcase Tests") public class SwitchCaseTest { diff --git a/src/test/java/spoon/test/model/TypeTest.java b/src/test/java/spoon/test/model/TypeTest.java index df3000a3747..45f3a25747a 100644 --- a/src/test/java/spoon/test/model/TypeTest.java +++ b/src/test/java/spoon/test/model/TypeTest.java @@ -6,6 +6,11 @@ * Spoon is available either under the terms of the MIT License (see LICENSE-MIT.txt) of the Cecill-C License (see LICENSE-CECILL-C.txt). You as the user are entitled to choose the terms under which to adopt Spoon. */ package spoon.test.model; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledForJreRange; import org.junit.jupiter.api.condition.JRE; @@ -21,12 +26,6 @@ import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.filter.AllTypeMembersFunction; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -172,7 +171,7 @@ public void testMultiClassNotEnable() { spoon.addInputResource("src/test/resources/multiclass/module2"); spoon.buildModel(); }); - } + } @Test public void testMultiClassEnable() { diff --git a/src/test/java/spoon/test/modifiers/ModifiersTest.java b/src/test/java/spoon/test/modifiers/ModifiersTest.java index 71dd42666da..f747050338b 100644 --- a/src/test/java/spoon/test/modifiers/ModifiersTest.java +++ b/src/test/java/spoon/test/modifiers/ModifiersTest.java @@ -16,6 +16,9 @@ */ package spoon.test.modifiers; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonException; @@ -31,10 +34,6 @@ import spoon.test.modifiers.testclasses.StaticMethod; import spoon.testing.utils.ModelUtils; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -42,226 +41,226 @@ public class ModifiersTest { - @Test - public void testMethodWithVarargsDoesNotBecomeTransient() { - // contract: method with varsargs should not become transient - Launcher spoon = new Launcher(); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); - spoon.buildModel(); + @Test + public void testMethodWithVarargsDoesNotBecomeTransient() { + // contract: method with varsargs should not become transient + Launcher spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); + spoon.buildModel(); - CtType myClass = spoon.getFactory().Type().get(MethodVarArgs.class); - CtMethod methodVarargs = myClass.getMethodsByName("getInitValues").get(0); + CtType myClass = spoon.getFactory().Type().get(MethodVarArgs.class); + CtMethod methodVarargs = myClass.getMethodsByName("getInitValues").get(0); - Set expectedModifiers = Collections.singleton(ModifierKind.PROTECTED); + Set expectedModifiers = Collections.singleton(ModifierKind.PROTECTED); - assertEquals(expectedModifiers, methodVarargs.getModifiers()); + assertEquals(expectedModifiers, methodVarargs.getModifiers()); - spoon = new Launcher(); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); - spoon.getEnvironment().setShouldCompile(true); - spoon.run(); - } + spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); + spoon.getEnvironment().setShouldCompile(true); + spoon.run(); + } - @Test - public void testCtModifiableAddRemoveReturnCtModifiable() { - // contract: CtModifiable#addModifier and CtModifiable#removeModifier should return CtModifiable + @Test + public void testCtModifiableAddRemoveReturnCtModifiable() { + // contract: CtModifiable#addModifier and CtModifiable#removeModifier should return CtModifiable - Launcher spoon = new Launcher(); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); - spoon.buildModel(); + Launcher spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); + spoon.buildModel(); - CtType myClass = spoon.getFactory().Type().get(MethodVarArgs.class); - CtMethod methodVarargs = myClass.getMethodsByName("getInitValues").get(0); + CtType myClass = spoon.getFactory().Type().get(MethodVarArgs.class); + CtMethod methodVarargs = myClass.getMethodsByName("getInitValues").get(0); - Object o = methodVarargs.addModifier(ModifierKind.FINAL); - assertEquals(methodVarargs, o); + Object o = methodVarargs.addModifier(ModifierKind.FINAL); + assertEquals(methodVarargs, o); - o = methodVarargs.removeModifier(ModifierKind.FINAL); - assertEquals(methodVarargs, o); - } + o = methodVarargs.removeModifier(ModifierKind.FINAL); + assertEquals(methodVarargs, o); + } - @Test - public void testSetVisibility() { - // contract: setVisibility should only work with public/private/protected modifiers + @Test + public void testSetVisibility() { + // contract: setVisibility should only work with public/private/protected modifiers - Launcher spoon = new Launcher(); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/StaticMethod.java"); - spoon.buildModel(); + Launcher spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/StaticMethod.java"); + spoon.buildModel(); - CtType myClass = spoon.getFactory().Type().get(StaticMethod.class); - CtMethod methodPublicStatic = myClass.getMethodsByName("maMethod").get(0); + CtType myClass = spoon.getFactory().Type().get(StaticMethod.class); + CtMethod methodPublicStatic = myClass.getMethodsByName("maMethod").get(0); - assertEquals(ModifierKind.PUBLIC, methodPublicStatic.getVisibility()); - methodPublicStatic.setVisibility(ModifierKind.PROTECTED); - assertEquals(ModifierKind.PROTECTED, methodPublicStatic.getVisibility()); - try { - methodPublicStatic.setVisibility(ModifierKind.FINAL); - fail(); - } catch (SpoonException e) { - } + assertEquals(ModifierKind.PUBLIC, methodPublicStatic.getVisibility()); + methodPublicStatic.setVisibility(ModifierKind.PROTECTED); + assertEquals(ModifierKind.PROTECTED, methodPublicStatic.getVisibility()); + try { + methodPublicStatic.setVisibility(ModifierKind.FINAL); + fail(); + } catch (SpoonException e) { + } - assertEquals(ModifierKind.PROTECTED, methodPublicStatic.getVisibility()); - } - - @Test - public void testGetModifiersHelpers() { - // contract: the CtModifiable helpers like isPublic, isFinal etc returns right values - - Launcher spoon = new Launcher(); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/AbstractClass.java"); - spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/ConcreteClass.java"); - spoon.getEnvironment().setShouldCompile(true); - spoon.run(); - - CtType abstractClass = spoon.getFactory().Type().get(AbstractClass.class); - - checkCtModifiableHelpersAssertion(abstractClass, true, false, false, true, false, false, false, false, false, false, false); - - assertEquals(6, abstractClass.getFields().size()); - for (CtField field : abstractClass.getFields()) { - switch (field.getSimpleName()) { - case "privateField": - checkCtModifiableHelpersAssertion(field, false, false, true, false, false, false, false, false, false, false, false); - break; - - case "protectedField": - checkCtModifiableHelpersAssertion(field, false, true, false, false, false, false, false, false, false, false, false); - break; - - case "privateStaticField": - checkCtModifiableHelpersAssertion(field, false, false, true, false, false, true, false, false, false, false, false); - break; - - case "publicFinalField": - checkCtModifiableHelpersAssertion(field, true, false, false, false, true, false, false, false, false, false, false); - break; - - case "transientField": - checkCtModifiableHelpersAssertion(field, false, false, false, false, false, false, true, false, false, false, false); - break; - - case "volatileField": - checkCtModifiableHelpersAssertion(field, false, false, false, false, false, false, false, true, false, false, false); - break; - - default: - fail("The field "+field.getSimpleName()+" should be take into account."); - } - } - - assertEquals(7, abstractClass.getMethods().size()); - - for (CtMethod method : abstractClass.getMethods()) { - switch (method.getSimpleName()) { - case "method": - checkCtModifiableHelpersAssertion(method, true, false, false, false, true, true, false, false, false, false, false); - break; - - case "onlyStatic": - checkCtModifiableHelpersAssertion(method, true, false, false, false, false, true, false, false, false, false, false); - break; - - case "otherMethod": - checkCtModifiableHelpersAssertion(method, false, true, false, true, false, false, false, false, false, false, false); - break; - - case "anotherOne": - checkCtModifiableHelpersAssertion(method, false, false, false, true, false, false, false, false, false, false, false); - break; - - case "synchronizedMethod": - checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, true, false, false); - break; - - case "nativeMethod": - checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, true, false); - break; - - case "strictfpMethod": - checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, false, true); - break; - - default: - fail("The method "+method.getSimpleName()+" should be taken into account."); - } - } - - CtType concreteClass = spoon.getFactory().Type().get("spoon.test.modifiers.testclasses.ConcreteClass"); - checkCtModifiableHelpersAssertion(concreteClass, false, false, false, false, true, false, false, false, false, false, false); - - assertEquals(2, concreteClass.getFields().size()); - for (CtField field : concreteClass.getFields()) { - switch (field.getSimpleName()) { - case "className": - checkCtModifiableHelpersAssertion(field, true, false, false, false, true, true, false, false, false, false, false); - break; - - case "test": - checkCtModifiableHelpersAssertion(field, false, false, true, false, false, true, false, false, false, false, false); - break; - - default: - fail("The field "+field.getSimpleName()+" should be take into account."); - } - } - - assertEquals(2, concreteClass.getMethods().size()); - for (CtMethod method : concreteClass.getMethods()) { - switch (method.getSimpleName()) { - case "otherMethod": - checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, false, false); - break; - - case "anotherOne": - checkCtModifiableHelpersAssertion(method, false, false, false, false, true, false, false, false, false, false, false); - break; - - default: - fail("The method "+method.getSimpleName()+" should be taken into account."); - } - } - } - - private void checkCtModifiableHelpersAssertion(CtModifiable element, boolean isPublic, boolean isProtected, boolean isPrivate, boolean isAbstract, boolean isFinal, boolean isStatic, boolean isTransient, boolean isVolatile, boolean isSynchronized, boolean isNative, boolean isStrictfp) { - assertEquals(isPublic, element.isPublic(), "isPublic for " + element + " is wrong"); - assertEquals(isProtected, element.isProtected(), "isProtected for " + element + " is wrong"); - assertEquals(isPrivate, element.isPrivate(), "isPrivate for " + element + " is wrong"); - assertEquals(isAbstract, element.isAbstract(), "isAbstract for " + element + " is wrong"); - assertEquals(isFinal, element.isFinal(), "isFinal for " + element + " is wrong"); - assertEquals(isStatic, element.isStatic(), "isStatic for " + element + " is wrong"); - assertEquals(isTransient, element.isTransient(), "isTransient for " + element + " is wrong"); - assertEquals(isVolatile, element.isVolatile(), "isVolatile for " + element + " is wrong"); - assertEquals(isSynchronized, element.isSynchronized(), "isSynchronized for " + element + " is wrong"); - assertEquals(isNative, element.isNative(), "isNative for " + element + " is wrong"); - assertEquals(isStrictfp, element.isStrictfp(), "isStrictfp for " + element + " is wrong"); - } - - @Test - public void testClearModifiersByEmptySet() throws Exception { - //contract: it is possible to remove modifiers by setModifiers(emptySet) - CtType ctClass = ModelUtils.buildClass(StaticMethod.class); - assertTrue(ctClass.hasModifier(ModifierKind.PUBLIC)); - assertEquals(1, ctClass.getModifiers().size()); - - ctClass.setModifiers(Collections.emptySet()); - assertFalse(ctClass.hasModifier(ModifierKind.PUBLIC)); - assertEquals(0, ctClass.getModifiers().size()); - } - - @Test - public void testClearModifiersByNull() throws Exception { - //contract: it is possible to remove modifiers by setModifiers(null) - CtType ctClass = ModelUtils.buildClass(StaticMethod.class); - assertTrue(ctClass.hasModifier(ModifierKind.PUBLIC)); - assertEquals(1, ctClass.getModifiers().size()); - - // contract: one can get the modifiers through CtRole.EMODIFIER - Collection valueByRole = ctClass.getValueByRole(CtRole.EMODIFIER); - assertEquals(1, valueByRole.size()); - - ctClass.setModifiers(null); - assertFalse(ctClass.hasModifier(ModifierKind.PUBLIC)); - assertEquals(0, ctClass.getModifiers().size()); - - } + assertEquals(ModifierKind.PROTECTED, methodPublicStatic.getVisibility()); + } + + @Test + public void testGetModifiersHelpers() { + // contract: the CtModifiable helpers like isPublic, isFinal etc returns right values + + Launcher spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/AbstractClass.java"); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/ConcreteClass.java"); + spoon.getEnvironment().setShouldCompile(true); + spoon.run(); + + CtType abstractClass = spoon.getFactory().Type().get(AbstractClass.class); + + checkCtModifiableHelpersAssertion(abstractClass, true, false, false, true, false, false, false, false, false, false, false); + + assertEquals(6, abstractClass.getFields().size()); + for (CtField field : abstractClass.getFields()) { + switch (field.getSimpleName()) { + case "privateField": + checkCtModifiableHelpersAssertion(field, false, false, true, false, false, false, false, false, false, false, false); + break; + + case "protectedField": + checkCtModifiableHelpersAssertion(field, false, true, false, false, false, false, false, false, false, false, false); + break; + + case "privateStaticField": + checkCtModifiableHelpersAssertion(field, false, false, true, false, false, true, false, false, false, false, false); + break; + + case "publicFinalField": + checkCtModifiableHelpersAssertion(field, true, false, false, false, true, false, false, false, false, false, false); + break; + + case "transientField": + checkCtModifiableHelpersAssertion(field, false, false, false, false, false, false, true, false, false, false, false); + break; + + case "volatileField": + checkCtModifiableHelpersAssertion(field, false, false, false, false, false, false, false, true, false, false, false); + break; + + default: + fail("The field "+field.getSimpleName()+" should be take into account."); + } + } + + assertEquals(7, abstractClass.getMethods().size()); + + for (CtMethod method : abstractClass.getMethods()) { + switch (method.getSimpleName()) { + case "method": + checkCtModifiableHelpersAssertion(method, true, false, false, false, true, true, false, false, false, false, false); + break; + + case "onlyStatic": + checkCtModifiableHelpersAssertion(method, true, false, false, false, false, true, false, false, false, false, false); + break; + + case "otherMethod": + checkCtModifiableHelpersAssertion(method, false, true, false, true, false, false, false, false, false, false, false); + break; + + case "anotherOne": + checkCtModifiableHelpersAssertion(method, false, false, false, true, false, false, false, false, false, false, false); + break; + + case "synchronizedMethod": + checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, true, false, false); + break; + + case "nativeMethod": + checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, true, false); + break; + + case "strictfpMethod": + checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, false, true); + break; + + default: + fail("The method "+method.getSimpleName()+" should be taken into account."); + } + } + + CtType concreteClass = spoon.getFactory().Type().get("spoon.test.modifiers.testclasses.ConcreteClass"); + checkCtModifiableHelpersAssertion(concreteClass, false, false, false, false, true, false, false, false, false, false, false); + + assertEquals(2, concreteClass.getFields().size()); + for (CtField field : concreteClass.getFields()) { + switch (field.getSimpleName()) { + case "className": + checkCtModifiableHelpersAssertion(field, true, false, false, false, true, true, false, false, false, false, false); + break; + + case "test": + checkCtModifiableHelpersAssertion(field, false, false, true, false, false, true, false, false, false, false, false); + break; + + default: + fail("The field "+field.getSimpleName()+" should be take into account."); + } + } + + assertEquals(2, concreteClass.getMethods().size()); + for (CtMethod method : concreteClass.getMethods()) { + switch (method.getSimpleName()) { + case "otherMethod": + checkCtModifiableHelpersAssertion(method, false, true, false, false, false, false, false, false, false, false, false); + break; + + case "anotherOne": + checkCtModifiableHelpersAssertion(method, false, false, false, false, true, false, false, false, false, false, false); + break; + + default: + fail("The method "+method.getSimpleName()+" should be taken into account."); + } + } + } + + private void checkCtModifiableHelpersAssertion(CtModifiable element, boolean isPublic, boolean isProtected, boolean isPrivate, boolean isAbstract, boolean isFinal, boolean isStatic, boolean isTransient, boolean isVolatile, boolean isSynchronized, boolean isNative, boolean isStrictfp) { + assertEquals(isPublic, element.isPublic(), "isPublic for " + element + " is wrong"); + assertEquals(isProtected, element.isProtected(), "isProtected for " + element + " is wrong"); + assertEquals(isPrivate, element.isPrivate(), "isPrivate for " + element + " is wrong"); + assertEquals(isAbstract, element.isAbstract(), "isAbstract for " + element + " is wrong"); + assertEquals(isFinal, element.isFinal(), "isFinal for " + element + " is wrong"); + assertEquals(isStatic, element.isStatic(), "isStatic for " + element + " is wrong"); + assertEquals(isTransient, element.isTransient(), "isTransient for " + element + " is wrong"); + assertEquals(isVolatile, element.isVolatile(), "isVolatile for " + element + " is wrong"); + assertEquals(isSynchronized, element.isSynchronized(), "isSynchronized for " + element + " is wrong"); + assertEquals(isNative, element.isNative(), "isNative for " + element + " is wrong"); + assertEquals(isStrictfp, element.isStrictfp(), "isStrictfp for " + element + " is wrong"); + } + + @Test + public void testClearModifiersByEmptySet() throws Exception { + //contract: it is possible to remove modifiers by setModifiers(emptySet) + CtType ctClass = ModelUtils.buildClass(StaticMethod.class); + assertTrue(ctClass.hasModifier(ModifierKind.PUBLIC)); + assertEquals(1, ctClass.getModifiers().size()); + + ctClass.setModifiers(Collections.emptySet()); + assertFalse(ctClass.hasModifier(ModifierKind.PUBLIC)); + assertEquals(0, ctClass.getModifiers().size()); + } + + @Test + public void testClearModifiersByNull() throws Exception { + //contract: it is possible to remove modifiers by setModifiers(null) + CtType ctClass = ModelUtils.buildClass(StaticMethod.class); + assertTrue(ctClass.hasModifier(ModifierKind.PUBLIC)); + assertEquals(1, ctClass.getModifiers().size()); + + // contract: one can get the modifiers through CtRole.EMODIFIER + Collection valueByRole = ctClass.getValueByRole(CtRole.EMODIFIER); + assertEquals(1, valueByRole.size()); + + ctClass.setModifiers(null); + assertFalse(ctClass.hasModifier(ModifierKind.PUBLIC)); + assertEquals(0, ctClass.getModifiers().size()); + + } } diff --git a/src/test/java/spoon/test/module/TestModule.java b/src/test/java/spoon/test/module/TestModule.java index a0176d03079..e4ba373984a 100644 --- a/src/test/java/spoon/test/module/TestModule.java +++ b/src/test/java/spoon/test/module/TestModule.java @@ -16,6 +16,16 @@ */ package spoon.test.module; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -46,17 +56,6 @@ import spoon.support.compiler.jdt.JDTBasedSpoonCompiler; import spoon.support.compiler.jdt.JDTBatchCompiler; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -380,7 +379,7 @@ public void testModuleComplianceLevelException() { throw e; } }); - } + } @Test public void testModuleOverlappingPackages() { diff --git a/src/test/java/spoon/test/parameters/ParameterTest.java b/src/test/java/spoon/test/parameters/ParameterTest.java index 4b84e423816..4ac8967756c 100644 --- a/src/test/java/spoon/test/parameters/ParameterTest.java +++ b/src/test/java/spoon/test/parameters/ParameterTest.java @@ -18,8 +18,6 @@ import java.util.List; - -import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.declaration.CtClass; diff --git a/src/test/java/spoon/test/parent/ContractOnSettersParametrizedTest.java b/src/test/java/spoon/test/parent/ContractOnSettersParametrizedTest.java index 82f463b976e..c71eedf3c04 100644 --- a/src/test/java/spoon/test/parent/ContractOnSettersParametrizedTest.java +++ b/src/test/java/spoon/test/parent/ContractOnSettersParametrizedTest.java @@ -16,6 +16,13 @@ */ package spoon.test.parent; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import spoon.SpoonException; @@ -40,14 +47,6 @@ import spoon.support.modelobs.action.Action; import spoon.test.SpoonTestHelpers; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.assertTrue; import static spoon.testing.utils.ModelUtils.createFactory; @@ -55,7 +54,7 @@ * check that all setters of the metamodel do the right things: * - call setParent * - trigger a change event - */ +*/ public class ContractOnSettersParametrizedTest { private static final Factory factory = createFactory(); diff --git a/src/test/java/spoon/test/parent/ParentTest.java b/src/test/java/spoon/test/parent/ParentTest.java index 282081727a2..4ebddcf5f2f 100644 --- a/src/test/java/spoon/test/parent/ParentTest.java +++ b/src/test/java/spoon/test/parent/ParentTest.java @@ -21,7 +21,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/src/test/java/spoon/test/parent/SetParentTest.java b/src/test/java/spoon/test/parent/SetParentTest.java index 592906c627a..3264d3be81b 100644 --- a/src/test/java/spoon/test/parent/SetParentTest.java +++ b/src/test/java/spoon/test/parent/SetParentTest.java @@ -16,6 +16,10 @@ */ package spoon.test.parent; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import spoon.reflect.CtModelImpl; @@ -32,11 +36,6 @@ import spoon.reflect.reference.CtReference; import spoon.test.SpoonTestHelpers; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -53,13 +52,13 @@ public Collection createReceiverList() { List values = new ArrayList<>(); for (CtType t : SpoonTestHelpers.getAllInstantiableMetamodelInterfaces()) { if (!(CtReference.class.isAssignableFrom(t.getActualClass()))) { - values.add(DynamicTest.dynamicTest(t.getSimpleName(), () -> + values.add(DynamicTest.dynamicTest(t.getSimpleName(), () -> testSetParentDoesNotAlterState(t))); } } return values; } - + private void testSetParentDoesNotAlterState(CtType toTest) throws Throwable { // contract: setParent does not modifiy the state of the parent diff --git a/src/test/java/spoon/test/parent/TopLevelTypeTest.java b/src/test/java/spoon/test/parent/TopLevelTypeTest.java index 410e8765778..9e12d2ef9f0 100644 --- a/src/test/java/spoon/test/parent/TopLevelTypeTest.java +++ b/src/test/java/spoon/test/parent/TopLevelTypeTest.java @@ -1,62 +1,61 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.parent; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.compiler.SpoonResourceHelper; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.factory.Factory; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class TopLevelTypeTest -{ - Factory factory; - - @BeforeEach - public void setup() throws Exception { - Launcher spoon = new Launcher(); - spoon.setArgs(new String[] {"--output-type", "nooutput" }); - factory = spoon.createFactory(); - spoon.createCompiler( - factory, - SpoonResourceHelper - .resources("./src/test/java/spoon/test/parent/Foo.java")) - .build(); - } - - - @Test - public void testTopLevelType() { - CtClass foo = factory.Class().get(Foo.class); - assertEquals(foo, foo.getTopLevelType()); - CtMethod internalClassMethod = foo.getMethod("internalClass"); - assertEquals(foo, internalClassMethod.getDeclaringType()); - assertEquals(foo, internalClassMethod.getTopLevelType()); - CtClass internalClass = (CtClass)internalClassMethod.getBody().getStatement(0); - assertEquals(foo, internalClassMethod.getDeclaringType()); - assertEquals(foo, internalClassMethod.getTopLevelType()); - CtMethod mm = internalClass.getMethod("m"); - assertEquals(internalClass, mm.getDeclaringType()); - assertEquals(foo, mm.getTopLevelType()); - } - -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.parent; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.compiler.SpoonResourceHelper; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.factory.Factory; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TopLevelTypeTest +{ + Factory factory; + + @BeforeEach + public void setup() throws Exception { + Launcher spoon = new Launcher(); + spoon.setArgs(new String[] {"--output-type", "nooutput" }); + factory = spoon.createFactory(); + spoon.createCompiler( + factory, + SpoonResourceHelper + .resources("./src/test/java/spoon/test/parent/Foo.java")) + .build(); + } + + + @Test + public void testTopLevelType() { + CtClass foo = factory.Class().get(Foo.class); + assertEquals(foo, foo.getTopLevelType()); + CtMethod internalClassMethod = foo.getMethod("internalClass"); + assertEquals(foo, internalClassMethod.getDeclaringType()); + assertEquals(foo, internalClassMethod.getTopLevelType()); + CtClass internalClass = (CtClass)internalClassMethod.getBody().getStatement(0); + assertEquals(foo, internalClassMethod.getDeclaringType()); + assertEquals(foo, internalClassMethod.getTopLevelType()); + CtMethod mm = internalClass.getMethod("m"); + assertEquals(internalClass, mm.getDeclaringType()); + assertEquals(foo, mm.getTopLevelType()); + } + +} diff --git a/src/test/java/spoon/test/path/PathTest.java b/src/test/java/spoon/test/path/PathTest.java index 50b8423a4bc..ded14f50e26 100644 --- a/src/test/java/spoon/test/path/PathTest.java +++ b/src/test/java/spoon/test/path/PathTest.java @@ -22,7 +22,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -262,7 +261,7 @@ public void testFastPathWithIndex() { CtStatement ifStmt = ((CtIf) method.getBody() .getStatement(2)).getElseStatement(); - //check that path with index + //check that path with index CtPath absPath = new CtElementPathBuilder().setUseNamesInPath(false).fromElement(ifStmt); assertEquals("#subPackage[name=spoon]#subPackage[name=test]#subPackage[name=path]#subPackage[name=testclasses]#containedType[name=Foo]#typeMember[index=3]#body#statement[index=2]#else", absPath.toString()); } @@ -282,7 +281,7 @@ public void testRoles() { // now we get the absolute path CtPath absPath = path.evaluateOn(factory.getModel().getRootPackage()).get(0).getPath(); assertEquals("#subPackage[name=spoon]#subPackage[name=test]#subPackage[name=path]#subPackage[name=testclasses]#containedType[name=Foo]#method[signature=foo()]#body#statement[index=2]#else", absPath.toString()); - + // contract: subpath enables to have relative path CtPath subPath = absPath.relativePath(fooClass); @@ -297,11 +296,11 @@ public void testRoles() { expected ); } - + @Test public void testAmbiguousTypeMembers() { CtType type = factory.Type().get("spoon.test.path.testclasses.Foo"); - + for (CtTypeMember typeMember : type.getTypeMembers()) { CtPath path = typeMember.getPath(); List elements = path.evaluateOn(factory.getModel().getRootPackage()); @@ -409,4 +408,4 @@ public void testFieldOfArrayType() { assertEquals(1, result.size()); assertSame(argType, result.get(0)); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/pattern/RecordPatternTest.java b/src/test/java/spoon/test/pattern/RecordPatternTest.java index 9d47fc4cbec..c407bf7242a 100644 --- a/src/test/java/spoon/test/pattern/RecordPatternTest.java +++ b/src/test/java/spoon/test/pattern/RecordPatternTest.java @@ -1,5 +1,6 @@ package spoon.test.pattern; +import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -17,9 +18,6 @@ import spoon.reflect.code.CtUnnamedPattern; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.compiler.VirtualFile; -import spoon.testing.assertions.SpoonAssertions; - -import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/pattern/SwitchPatternTest.java b/src/test/java/spoon/test/pattern/SwitchPatternTest.java index 9600bd4b85a..d46e79ebcd2 100644 --- a/src/test/java/spoon/test/pattern/SwitchPatternTest.java +++ b/src/test/java/spoon/test/pattern/SwitchPatternTest.java @@ -1,5 +1,8 @@ package spoon.test.pattern; +import java.nio.file.StandardCopyOption; +import java.util.List; +import java.util.function.Predicate; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; @@ -16,10 +19,6 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.compiler.VirtualFile; -import java.nio.file.StandardCopyOption; -import java.util.List; -import java.util.function.Predicate; - import static org.assertj.core.api.Assertions.assertThat; class SwitchPatternTest { diff --git a/src/test/java/spoon/test/pkg/PackageTest.java b/src/test/java/spoon/test/pkg/PackageTest.java index e3563763fdb..6dae8927ea8 100644 --- a/src/test/java/spoon/test/pkg/PackageTest.java +++ b/src/test/java/spoon/test/pkg/PackageTest.java @@ -24,10 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; - -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.OutputType; @@ -58,7 +55,6 @@ import spoon.testing.utils.ModelTest; import spoon.testing.utils.ModelUtils; - import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -175,12 +171,12 @@ public void testHandlesDuplicatePackageInfo(){ compilationUnits.forEach( cu -> org.hamcrest.MatcherAssert.assertThat(cu.getFile().getName(), equalTo("package-info.java"))); } - + @Test public void testAnnotationInPackageInfoWhenTemplatesCompiled() throws Exception { final Launcher launcher = new Launcher(); Environment environment = launcher.getEnvironment(); - + environment.setAutoImports(true); environment.setCommentEnabled(true); launcher.addInputResource("./src/test/java/spoon/test/pkg/package-info.java"); diff --git a/src/test/java/spoon/test/pkg/processors/ElementProcessor.java b/src/test/java/spoon/test/pkg/processors/ElementProcessor.java index 6c6a708fe62..455f4012d4e 100644 --- a/src/test/java/spoon/test/pkg/processors/ElementProcessor.java +++ b/src/test/java/spoon/test/pkg/processors/ElementProcessor.java @@ -8,10 +8,9 @@ * Created by urli on 11/09/2017. */ public class ElementProcessor extends AbstractProcessor { - public void process(CtElement element) { - if(element instanceof CtPackage){ - ((CtPackage) element).setSimpleName("newtest"); - } - } + public void process(CtElement element) { + if(element instanceof CtPackage){ + ((CtPackage) element).setSimpleName("newtest"); + } + } } - diff --git a/src/test/java/spoon/test/pkg/test_templates/FakeTemplate.java b/src/test/java/spoon/test/pkg/test_templates/FakeTemplate.java index a78ca29a4de..ee497c45e21 100644 --- a/src/test/java/spoon/test/pkg/test_templates/FakeTemplate.java +++ b/src/test/java/spoon/test/pkg/test_templates/FakeTemplate.java @@ -1,10 +1,10 @@ -package spoon.test.pkg.test_templates; - -import spoon.template.ExtensionTemplate; - -public class FakeTemplate extends ExtensionTemplate -{ - public FakeTemplate() - { - } -} +package spoon.test.pkg.test_templates; + +import spoon.template.ExtensionTemplate; + +public class FakeTemplate extends ExtensionTemplate +{ + public FakeTemplate() + { + } +} diff --git a/src/test/java/spoon/test/position/PositionTest.java b/src/test/java/spoon/test/position/PositionTest.java index 6a8e108d801..e637f631c8e 100644 --- a/src/test/java/spoon/test/position/PositionTest.java +++ b/src/test/java/spoon/test/position/PositionTest.java @@ -21,10 +21,8 @@ import java.io.IOException; import java.util.Iterator; import java.util.List; - import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; - import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; @@ -152,8 +150,8 @@ public void testPositionClass() { assertEquals("FooClazz", contentAtPosition(classContent, position.getNameStart(), position.getNameEnd())); assertEquals("@Deprecated\npublic", contentAtPosition(classContent, position.getModifierSourceStart(), position.getModifierSourceEnd())); } - - + + @Test public void testPositionClassWithComments() { //contract: check that comments before and after the 'class' keyword are handled well by PositionBuilder @@ -169,15 +167,15 @@ public void testPositionClassWithComments() { assertEquals(42, position.getSourceStart()); assertEquals(132, position.getSourceEnd()); - assertEquals("/*c1*/\n" + - "//lc1\n" + - "public /*c2*/\n" + - "//lc2 /*\n" + - "class \n" + - "// */\n" + - "/*c3 class // */\n" + - "FooClazzWithComments {\n" + - "\n" + + assertEquals("/*c1*/\n" + + "//lc1\n" + + "public /*c2*/\n" + + "//lc2 /*\n" + + "class \n" + + "// */\n" + + "/*c3 class // */\n" + + "FooClazzWithComments {\n" + + "\n" + "}", contentAtPosition(classContent, position)); assertEquals("{\n\n}", contentAtPosition(classContent, position.getBodyStart(), position.getBodyEnd())); @@ -189,8 +187,8 @@ public void testPositionClassWithComments() { assertEquals(4, foo2.getPosition().getEndLine()); assertEquals("FooClazzWithComments", contentAtPosition(classContent, position.getNameStart(), position.getNameEnd())); - assertEquals("/*c1*/\n" + - "//lc1\n" + + assertEquals("/*c1*/\n" + + "//lc1\n" + "public", contentAtPosition(classContent, position.getModifierSourceStart(), position.getModifierSourceEnd())); } @@ -204,7 +202,7 @@ public void testPositionParameterTypeReference() throws Exception { assertEquals("T extends List", contentAtPosition(classContent, foo.getFormalCtTypeParameters().get(0).getPosition())); assertEquals("X", contentAtPosition(classContent, foo.getFormalCtTypeParameters().get(1).getPosition())); } - { + { CtTypeReference field1Type = foo.getField("field1").getType(); //this probably points to an bug in JDT. But we have no workaround in Spoon assertEquals("List", contentAtPosition(classContent, field1Type.getPosition())); @@ -240,7 +238,7 @@ public void testPositionParameterTypeReference() throws Exception { assertEquals("U extends List", contentAtPosition(classContent, methodGType.getPosition())); } } - + @Test public void testPositionInterface() { final Factory build = build(new File("src/test/java/spoon/test/position/testclasses/")); @@ -264,7 +262,7 @@ public void testPositionInterface() { assertEquals("FooInterface", contentAtPosition(classContent, position.getNameStart(), position.getNameEnd())); assertEquals("@Deprecated\n@InnerAnnot(value=\"machin\")\npublic", contentAtPosition(classContent, position.getModifierSourceStart(), position.getModifierSourceEnd())); - + { SourcePosition annPosition = foo.getAnnotations().get(0).getPosition(); assertEquals("@Deprecated", contentAtPosition(classContent, annPosition.getSourceStart(), annPosition.getSourceEnd())); @@ -301,7 +299,7 @@ public void testPositionAnnotation() { assertEquals("FooAnnotation", contentAtPosition(classContent, position.getNameStart(), position.getNameEnd())); assertEquals("@Target(value={})\n" + "@Retention(RetentionPolicy.RUNTIME) \npublic abstract", contentAtPosition(classContent, position.getModifierSourceStart(), position.getModifierSourceEnd())); - + CtMethod method1 = foo.getMethodsByName("value").get(0); BodyHolderSourcePosition position1 = (BodyHolderSourcePosition) method1.getPosition(); @@ -503,12 +501,12 @@ public void testPositionMethod() throws Exception { CtMethod mWithLine = foo.getMethod("mWithLine", build.Type().integerPrimitiveType()); SourcePosition position4 = mWithLine.getPosition(); contentAtPosition(classContent, position4); - + { CtMethod methodWithEmptyBody = foo.getMethodsByName("emptyMethod").get(0); BodyHolderSourcePosition pos = (BodyHolderSourcePosition) methodWithEmptyBody.getPosition(); assertEquals("public void emptyMethod() {}", contentAtPosition(classContent, pos)); - + assertEquals("{}", contentAtPosition(classContent, pos.getBodyStart(), pos.getBodyEnd())); } } @@ -676,7 +674,7 @@ public void testSourcePosition() { assertEquals("(unknown file)", s.toString()); assertTrue(s.hashCode() > 0); // no NPE } - + private static void assertFails(Runnable code) { try { code.run(); @@ -739,7 +737,7 @@ public void testPositionMethodTypeParameter() throws Exception { assertEquals("T extends List", contentAtPosition(classContent, typeParam.getPosition())); assertFalse(typeParam.getPosition() instanceof DeclarationSourcePosition); } - + @Test public void testPositionOfAnnonymousType() throws Exception { //contract: the annonymous type has consistent position @@ -748,8 +746,8 @@ public void testPositionOfAnnonymousType() throws Exception { CtNewClass newClass = (CtNewClass) foo.getEnumValue("X").getDefaultExpression(); CtClass annonClass = newClass.getAnonymousClass(); - assertEquals("{\n" + - " void m() {};\n" + + assertEquals("{\n" + + " void m() {};\n" + " }", contentAtPosition(classContent, annonClass.getPosition())); BodyHolderSourcePosition bhsp = (BodyHolderSourcePosition) annonClass.getPosition(); int start = annonClass.getPosition().getSourceStart(); @@ -765,7 +763,7 @@ public void testPositionOfAnnonymousType() throws Exception { assertEquals(start, bhsp.getNameStart()); assertEquals(start - 1, bhsp.getNameEnd()); } - + @Test public void testPositionOfAnnonymousTypeByNewInterface() throws Exception { //contract: the annonymous type has consistent position @@ -778,16 +776,16 @@ public void testPositionOfAnnonymousTypeByNewInterface() throws Exception { BodyHolderSourcePosition bhsp = (BodyHolderSourcePosition) annonClass.getPosition(); int start = annonClass.getPosition().getSourceStart(); int end = annonClass.getPosition().getSourceEnd(); - assertEquals("{\r\n" + - " @Override\r\n" + - " public void accept(Set t) {\r\n" + - " }\r\n" + + assertEquals("{\r\n" + + " @Override\r\n" + + " public void accept(Set t) {\r\n" + + " }\r\n" + " }", contentAtPosition(classContent, start, end)); - - assertEquals("{\r\n" + - " @Override\r\n" + - " public void accept(Set t) {\r\n" + - " }\r\n" + + + assertEquals("{\r\n" + + " @Override\r\n" + + " public void accept(Set t) {\r\n" + + " }\r\n" + " }", contentAtPosition(classContent, bhsp.getBodyStart(), bhsp.getBodyEnd())); //there is no name and no modifiers and they are located at source start @@ -797,12 +795,12 @@ public void testPositionOfAnnonymousTypeByNewInterface() throws Exception { assertEquals(start, bhsp.getNameStart()); assertEquals(start - 1, bhsp.getNameEnd()); } - + @Test public void testPositionOfCtImport() throws Exception { //contract: the CtImport has position final CtType foo = buildClass( - launcher -> launcher.getEnvironment().setAutoImports(true), + launcher -> launcher.getEnvironment().setAutoImports(true), AnnonymousClassNewIface.class); String originSources = foo.getPosition().getCompilationUnit().getOriginalSourceCode(); List imports = foo.getPosition().getCompilationUnit().getImports(); @@ -817,7 +815,7 @@ public void testPositionOfCtImport() throws Exception { assertEquals("import java.util.function.Consumer;", contentAtPosition(originSources, ctImport.getPosition())); } } - + @Test public void testEmptyModifiersOfMethod() throws Exception { @@ -843,7 +841,7 @@ public void testTypeModifiersPositionAfterComment() throws Exception { cfg.getEnvironment().setCommentEnabled(true); }, Kokos.class); String classContent = getClassContent(type); - + CtExtendedModifier modifier = type.getExtendedModifiers().iterator().next(); // a type might have implicit modifiers, and those should not have a valid position if (modifier.isImplicit()) { @@ -853,7 +851,7 @@ public void testTypeModifiersPositionAfterComment() throws Exception { SourcePosition commentPos = type.getComments().get(0).getPosition(); //modifier is not positioned in comment, but after comment assertTrue(commentPos.getSourceEnd() < modifier.getPosition().getSourceStart()); - + assertEquals("public", contentAtPosition(classContent, modifier.getPosition())); } @@ -962,9 +960,9 @@ public void testArrayArgParameter() throws Exception { } { CtParameter param = foo.getMethodsByName("m6").get(0).getParameters().get(0); - assertEquals("String[]//[]\n" + + assertEquals("String[]//[]\n" + " p[]", contentAtPosition(classContent, param.getPosition())); - assertEquals("String[]//[]\n" + + assertEquals("String[]//[]\n" + " p[]", contentAtPosition(classContent, param.getType().getPosition())); } { @@ -978,7 +976,7 @@ public void testArrayArgParameter() throws Exception { assertEquals("String[]...", contentAtPosition(classContent, param.getType().getPosition())); } } - + @Test public void testExpressions() throws Exception { //contract: the expression including type casts has correct position which includes all brackets too @@ -992,16 +990,16 @@ public void testExpressions() throws Exception { assertEquals("(String)null", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); assertEquals("( String) ( (Serializable)(( (null ))))", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); assertEquals("(((String) null))", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); - assertEquals("( /*c2*/\n" + - " (\n" + - " /*c3*/ String\n" + - " /*c4*/) //c5\n" + - " null /*c6*/\n" + - " //c7\n" + + assertEquals("( /*c2*/\n" + + " (\n" + + " /*c3*/ String\n" + + " /*c4*/) //c5\n" + + " null /*c6*/\n" + + " //c7\n" + " )", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); assertEquals("(List) null", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); assertEquals("(List>>) null", contentAtPosition(classContent, statements.get(idx++).getArguments().get(0).getPosition())); - + //contract: check the position of expression without type casts { CtExpression expr = statements.get(1).getArguments().get(0); @@ -1016,7 +1014,7 @@ public void testExpressions() throws Exception { assertEquals("( String) ( (Serializable)(( (null ))))", contentAtPosition(classContent, expr.getPosition())); //if there is type cast in expression, then it uses CompoundSourcePosition assertTrue(expr.getPosition() instanceof CompoundSourcePosition); - + //contract: check the position of type casts assertEquals("( String)", contentAtPosition(classContent, expr.getTypeCasts().get(0).getPosition())); assertEquals("(Serializable)", contentAtPosition(classContent, expr.getTypeCasts().get(1).getPosition())); @@ -1034,73 +1032,73 @@ public void testCatchPosition() throws Exception { { CtCatch catcher = tryStatement.getCatchers().get(0); CtCatchVariable catchVar = catcher.getParameter(); - + BodyHolderSourcePosition catcherPos = (BodyHolderSourcePosition) catcher.getPosition(); DeclarationSourcePosition catchVarPos = (DeclarationSourcePosition) catchVar.getPosition(); - assertEquals(" catch (final IOException e) {\n" + - " throw new RuntimeException(e);\n" + + assertEquals(" catch (final IOException e) {\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, catcherPos.getSourceStart(), catcherPos.getSourceEnd())); assertEquals("final IOException e", contentAtPosition(classContent, catchVarPos.getSourceStart(), catchVarPos.getSourceEnd())); assertEquals("", contentAtPosition(classContent, catcherPos.getModifierSourceStart(), catcherPos.getModifierSourceEnd())); assertEquals("final", contentAtPosition(classContent, catchVarPos.getModifierSourceStart(), catchVarPos.getModifierSourceEnd())); - + assertEquals(" catch (", contentAtPosition(classContent, catcherPos.getModifierSourceEnd() + 1, catcherPos.getNameStart() - 1)); assertEquals(" IOException ", contentAtPosition(classContent, catchVarPos.getModifierSourceEnd() + 1, catchVarPos.getNameStart() - 1)); assertEquals("final IOException e", contentAtPosition(classContent, catcherPos.getNameStart(), catcherPos.getNameEnd())); assertEquals("e", contentAtPosition(classContent, catchVarPos.getNameStart(), catchVarPos.getNameEnd())); - assertEquals("{\n" + - " throw new RuntimeException(e);\n" + + assertEquals("{\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, catcherPos.getBodyStart(), catcherPos.getBodyEnd())); } { CtCatch catcher = tryStatement.getCatchers().get(1); BodyHolderSourcePosition pos = (BodyHolderSourcePosition) catcher.getPosition(); - assertEquals(" /*1*/ catch/*2*/ ( /*3*/ final @Deprecated /*4*/ ClassCastException /*5*/ e /*6*/) /*7*/ {\n" + - " throw new RuntimeException(e);\n" + + assertEquals(" /*1*/ catch/*2*/ ( /*3*/ final @Deprecated /*4*/ ClassCastException /*5*/ e /*6*/) /*7*/ {\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, pos.getSourceStart(), pos.getSourceEnd())); assertEquals("", contentAtPosition(classContent, pos.getModifierSourceStart(), pos.getModifierSourceEnd())); assertEquals(" /*3*/ final @Deprecated /*4*/ ClassCastException /*5*/ e", contentAtPosition(classContent, pos.getNameStart(), pos.getNameEnd())); - assertEquals("{\n" + - " throw new RuntimeException(e);\n" + + assertEquals("{\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, pos.getBodyStart(), pos.getBodyEnd())); } { CtCatch catcher = tryStatement.getCatchers().get(2); BodyHolderSourcePosition pos = (BodyHolderSourcePosition) catcher.getPosition(); - assertEquals(" catch /* ignore this catch */\n" + - " //and this catch too!\n" + - " ( /**catch it ( */\n" + - " //catch (\n" + - " OutOfMemoryError|RuntimeException e) {\n" + - " throw new RuntimeException(e);\n" + + assertEquals(" catch /* ignore this catch */\n" + + " //and this catch too!\n" + + " ( /**catch it ( */\n" + + " //catch (\n" + + " OutOfMemoryError|RuntimeException e) {\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, pos.getSourceStart(), pos.getSourceEnd())); assertEquals("", contentAtPosition(classContent, pos.getModifierSourceStart(), pos.getModifierSourceEnd())); - assertEquals(" /**catch it ( */\n" + - " //catch (\n" + + assertEquals(" /**catch it ( */\n" + + " //catch (\n" + " OutOfMemoryError|RuntimeException e", contentAtPosition(classContent, pos.getNameStart(), pos.getNameEnd())); - assertEquals("{\n" + - " throw new RuntimeException(e);\n" + + assertEquals("{\n" + + " throw new RuntimeException(e);\n" + " }", contentAtPosition(classContent, pos.getBodyStart(), pos.getBodyEnd())); } } @Test public void testEnumConstructorCallComment() throws Exception { - //contract: check position the enum constructor call + //contract: check position the enum constructor call final CtType foo = buildClass(FooEnum.class); - + String classContent = getClassContent(foo); CtField field = foo.getField("GET"); { - assertEquals("/**\n" + - " * Getter.\n" + - " * T get()\n" + - " */\n" + + assertEquals("/**\n" + + " * Getter.\n" + + " * T get()\n" + + " */\n" + " GET(-1)", contentAtPosition(classContent, field.getPosition())); - + assertEquals("(-1)", contentAtPosition(classContent, field.getDefaultExpression().getPosition())); } } @@ -1108,7 +1106,7 @@ public void testEnumConstructorCallComment() throws Exception { public void testSwitchCase() throws Exception { //contract: check position of the statements of the case of switch final CtType foo = buildClass(FooSwitch.class); - + String classContent = getClassContent(foo); CtSwitch switchStatement = foo.getMethodsByName("m1").get(0).getBody().getStatement(0); int caseIdx = 0; @@ -1118,26 +1116,26 @@ public void testSwitchCase() throws Exception { } { CtCase caseStmt = switchStatement.getCases().get(caseIdx++); - assertEquals("case C1: \n" + - " System.out.println();\n" + + assertEquals("case C1: \n" + + " System.out.println();\n" + " break;", contentAtPosition(classContent, caseStmt.getPosition())); } { CtCase caseStmt = switchStatement.getCases().get(caseIdx++); - assertEquals("case C2: {\n" + - " return 2;\n" + + assertEquals("case C2: {\n" + + " return 2;\n" + " }", contentAtPosition(classContent, caseStmt.getPosition())); } { CtCase caseStmt = switchStatement.getCases().get(caseIdx++); - assertEquals("case C3: {\n" + - " return 2;\n" + + assertEquals("case C3: {\n" + + " return 2;\n" + " }", contentAtPosition(classContent, caseStmt.getPosition())); } { CtCase caseStmt = switchStatement.getCases().get(caseIdx++); - assertEquals("default:\n" + - " System.out.println();\n" + + assertEquals("default:\n" + + " System.out.println();\n" + " break;", contentAtPosition(classContent, caseStmt.getPosition())); } } @@ -1145,7 +1143,7 @@ public void testSwitchCase() throws Exception { public void testFooForEach() throws Exception { //contract: check position of the for each position final CtType foo = buildClass(FooForEach.class); - + String classContent = getClassContent(foo); List stmts = (List) foo.getMethodsByName("m").get(0).getBody().getStatements(); int caseIdx = 0; @@ -1157,14 +1155,14 @@ public void testFooForEach() throws Exception { } { CtForEach forEach = stmts.get(caseIdx++); - assertEquals("for (final String item : items) {\n" + + assertEquals("for (final String item : items) {\n" + " }", contentAtPosition(classContent, forEach.getPosition())); assertEquals("final String item", contentAtPosition(classContent, forEach.getVariable().getPosition())); assertEquals("items", contentAtPosition(classContent, forEach.getExpression().getPosition())); } { CtForEach forEach = stmts.get(caseIdx++); - assertEquals("for (/*1*/ final @Deprecated /*2*/ String /*3*/ i /*4*/ : items) \n" + + assertEquals("for (/*1*/ final @Deprecated /*2*/ String /*3*/ i /*4*/ : items) \n" + " this.getClass();", contentAtPosition(classContent, forEach.getPosition())); assertEquals("/*1*/ final @Deprecated /*2*/ String /*3*/ i", contentAtPosition(classContent, forEach.getVariable().getPosition())); assertEquals("items", contentAtPosition(classContent, forEach.getExpression().getPosition())); @@ -1290,11 +1288,11 @@ public void testImportPosition() throws Exception { cfg.getEnvironment().setAutoImports(true); }, CompilationUnitComments.class); String classContent = getClassContent(type); - + CtCompilationUnit cu = type.getPosition().getCompilationUnit(); CtImport imprt = cu.getImports().get(0); - - assertEquals("//import comment\n" + + + assertEquals("//import comment\n" + "import java.util.ArrayList;", contentAtPosition(classContent, imprt.getPosition())); assertEquals("java.util.ArrayList", contentAtPosition(classContent, imprt.getReference().getPosition())); } @@ -1307,11 +1305,11 @@ public void testPackageDeclarationWithCommentPosition() throws Exception { cfg.getEnvironment().setAutoImports(true); }, CompilationUnitComments.class); String classContent = getClassContent(type); - + CtCompilationUnit cu = type.getPosition().getCompilationUnit(); CtPackageDeclaration packageDecl = cu.getPackageDeclaration(); - - assertEquals("/* package declaration comments*/\n" + + + assertEquals("/* package declaration comments*/\n" + "package spoon.test.position.testclasses;", contentAtPosition(classContent, packageDecl.getPosition())); assertEquals("spoon.test.position.testclasses", contentAtPosition(classContent, packageDecl.getReference().getPosition())); } @@ -1332,7 +1330,7 @@ public void testSourcePositionOfFieldReference() throws Exception { cfg.getEnvironment().setAutoImports(true); }, FooField.class); String classContent = getClassContent(foo); - + CtAssignment assignment = (CtAssignment) foo.getMethodsByName("m").get(0).getBody().getStatements().get(0); CtFieldWrite fieldWrite = (CtFieldWrite) assignment.getAssigned(); assertEquals("FooField.f.field2", contentAtPosition(classContent, fieldWrite.getPosition())); diff --git a/src/test/java/spoon/test/position/TestSourceFragment.java b/src/test/java/spoon/test/position/TestSourceFragment.java index bb07c4dc358..4f437518f85 100644 --- a/src/test/java/spoon/test/position/TestSourceFragment.java +++ b/src/test/java/spoon/test/position/TestSourceFragment.java @@ -21,9 +21,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonResourceHelper; @@ -107,11 +105,11 @@ public void testSourceFragmentAddChild() { //add child assertSame(rootFragment, rootFragment.add(f = createFragment(10, 15))); assertSame(rootFragment.getFirstChild(), f); - + //add child which is next sibling of first child assertSame(rootFragment, rootFragment.add(f = createFragment(15, 20))); assertSame(rootFragment.getFirstChild().getNextSibling(), f); - + //add another child of same start/end, which has to be child of last child assertSame(rootFragment, rootFragment.add(f = createFragment(15, 20))); assertSame(rootFragment.getFirstChild().getNextSibling().getFirstChild(), f); @@ -123,7 +121,7 @@ public void testSourceFragmentAddChild() { //add next sibling of root element assertSame(rootFragment, rootFragment.add(f = createFragment(20, 100))); assertSame(rootFragment.getNextSibling(), f); - + //add prev sibling of root element. We should get new root f = createFragment(5, 10); assertSame(f, rootFragment.add(f)); @@ -145,11 +143,11 @@ public void testSourceFragmentAddChildBeforeOrAfter() { @Test public void testSourceFragmentWrapChild() { - //contract: the existing child fragment can be wrapped by a new parent + //contract: the existing child fragment can be wrapped by a new parent ElementSourceFragment rootFragment = createFragment(0, 100); ElementSourceFragment child = createFragment(50, 60); rootFragment.add(child); - + ElementSourceFragment childWrapper = createFragment(40, 60); rootFragment.add(childWrapper); assertSame(rootFragment.getFirstChild(), childWrapper); @@ -158,11 +156,11 @@ public void testSourceFragmentWrapChild() { @Test public void testSourceFragmentWrapChildrenAndSiblings() { - //contract: the two SourceFragment trees merge correctly together + //contract: the two SourceFragment trees merge correctly together ElementSourceFragment rootFragment = createFragment(0, 100); ElementSourceFragment child = createFragment(50, 60); rootFragment.add(child); - + ElementSourceFragment childWrapper = createFragment(40, 70); ElementSourceFragment childA = createFragment(40, 50); ElementSourceFragment childB = createFragment(50, 55); @@ -187,7 +185,7 @@ public void testElementSourceFragment_getSourceFragmentOf() { rootFragment.add(createFragment(50, 60)); rootFragment.add(createFragment(60, 70)); rootFragment.add(x = createFragment(50, 55)); - + assertSame(x, rootFragment.getSourceFragmentOf(null, 50, 55)); assertSame(rootFragment, rootFragment.getSourceFragmentOf(null, 0, 100)); assertSame(rootFragment.getFirstChild(), rootFragment.getSourceFragmentOf(null, 50, 60)); @@ -195,7 +193,7 @@ public void testElementSourceFragment_getSourceFragmentOf() { } private static final CompilationUnit DUMMY_COMPILATION_UNIT = new CompilationUnitImpl(); - + private ElementSourceFragment createFragment(int start, int end) { SourcePosition sp = new SourcePositionImpl(DUMMY_COMPILATION_UNIT, start, end - 1, null); return new ElementSourceFragment(new SourcePositionHolder() { @@ -221,34 +219,34 @@ public void testExactSourceFragments() throws Exception { comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/" + FooSourceFragments.class.getName().replace('.', '/') + ".java")); comp.build(); Factory f = comp.getFactory(); - + final CtType foo = f.Type().get(FooSourceFragments.class); // contract: the fragment returned by getOriginalSourceFragment are correct checkElementFragments(foo.getMethodsByName("m1").get(0).getBody().getStatement(0), "if", "(", "x > 0", ")", "{this.getClass();}", "else", "{/*empty*/}"); checkElementFragments(foo.getMethodsByName("m2").get(0).getBody().getStatement(0), - "/*c0*/", " ", "if", " ", "/*c1*/", "\t", "(", " ", "//c2", "\n\t\t\t\t", "x > 0", " ", "/*c3*/", " ", ")", " ", "/*c4*/", " ", "{ \n" + - " this.getClass();\n" + - " }", " ", "/*c5*/ else /*c6*/ {\n" + - " /*empty*/\n" + + "/*c0*/", " ", "if", " ", "/*c1*/", "\t", "(", " ", "//c2", "\n\t\t\t\t", "x > 0", " ", "/*c3*/", " ", ")", " ", "/*c4*/", " ", "{ \n" + + " this.getClass();\n" + + " }", " ", "/*c5*/ else /*c6*/ {\n" + + " /*empty*/\n" + " }", " ", "/*c7*/"); checkElementFragments(foo.getMethodsByName("m3").get(0), - "/**\n" + - " * c0\n" + + "/**\n" + + " * c0\n" + " */", "\n\t", group("public", "\n\t", "@Deprecated", " ", "//c1 ends with tab and space\t ", "\n\t", "static"), " ", "/*c2*/", " ", "<", group("T", ",", " ", "U"), ">", - " ", "T", " ", "m3", "(", group("U param", ",", " ", "@Deprecated int p2"), ")", " ", "{\n" + - " return null;\n" + + " ", "T", " ", "m3", "(", group("U param", ",", " ", "@Deprecated int p2"), ")", " ", "{\n" + + " return null;\n" + " }"); checkElementFragments(foo.getMethodsByName("m4").get(0).getBody().getStatement(0),"label",":"," ", "while", "(", "true", ")", ";"); checkElementFragments(foo.getMethodsByName("m5").get(0).getBody().getStatement(0),"f", " ", "=", " ", "7.2", ";"); checkElementFragments(((CtAssignment)foo.getMethodsByName("m5").get(0).getBody().getStatement(0)).getAssignment(),"7.2"); - + } - + @Test public void testSourceFragmentsOfCompilationUnit() throws Exception { //contract: SourceFragments of compilation unit children like, package declaration, imports, types @@ -259,37 +257,37 @@ public void testSourceFragmentsOfCompilationUnit() throws Exception { comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/" + FooSourceFragments.class.getName().replace('.', '/') + ".java")); comp.build(); Factory f = comp.getFactory(); - + final CtType foo = f.Type().get(FooSourceFragments.class); CtCompilationUnit compilationUnit = foo.getPosition().getCompilationUnit(); - + ElementSourceFragment fragment = compilationUnit.getOriginalSourceFragment(); List children = fragment.getChildrenFragments(); assertEquals(11, children.size()); - assertEquals("/**\n" + - " * Javadoc at top of file\n" + + assertEquals("/**\n" + + " * Javadoc at top of file\n" + " */", children.get(0).getSourceCode()); assertEquals("\n", children.get(1).getSourceCode()); - assertEquals("/* comment before package declaration*/\n" + + assertEquals("/* comment before package declaration*/\n" + "package spoon.test.position.testclasses;", children.get(2).getSourceCode()); assertEquals("\n\n", children.get(3).getSourceCode()); - assertEquals("/*\n" + - " * Comment before import\n" + - " */\n" + + assertEquals("/*\n" + + " * Comment before import\n" + + " */\n" + "import java.lang.Deprecated;", children.get(4).getSourceCode()); assertEquals("\n\n", children.get(5).getSourceCode()); assertEquals("import java.lang.Class;", children.get(6).getSourceCode()); assertEquals("\n\n", children.get(7).getSourceCode()); assertTrue(((ElementSourceFragment) children.get(8)).getElement() instanceof CtClass); - assertStartsWith("/*\n" + - " * Comment before type\n" + - " */\n" + + assertStartsWith("/*\n" + + " * Comment before type\n" + + " */\n" + "public class FooSourceFragments", children.get(8).getSourceCode()); assertEndsWith("//after last type member\n}", children.get(8).getSourceCode()); assertEquals("\n\n", children.get(9).getSourceCode()); assertEquals("//comment at the end of file", children.get(10).getSourceCode()); } - + private void assertStartsWith(String expectedPrefix, String real) { assertEquals(expectedPrefix, real.substring(0, Math.min(expectedPrefix.length(), real.length()))); @@ -310,15 +308,15 @@ public void testSourceFragmentsOfFieldAccess() throws Exception { comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/" + FooField.class.getName().replace('.', '/') + ".java")); comp.build(); Factory f = comp.getFactory(); - + final CtType foo = f.Type().get(FooField.class); - + CtAssignment assignment = (CtAssignment) foo.getMethodsByName("m").get(0).getBody().getStatements().get(0); CtFieldWrite fieldWrite = (CtFieldWrite) assignment.getAssigned(); CtFieldReference fieldRef = fieldWrite.getVariable(); CtFieldRead fieldRead = (CtFieldRead) fieldWrite.getTarget(); CtFieldReference fieldRef2 = fieldRead.getVariable(); - + ElementSourceFragment fieldWriteSF = fieldWrite.getOriginalSourceFragment(); List children = fieldWriteSF.getChildrenFragments(); assertEquals(3, children.size()); @@ -337,7 +335,7 @@ public void testSourceFragmentsOfFieldAccess() throws Exception { public void testSourceFragmentsOfNewArrayList() throws Exception { //contract: SourceFragments of constructor call is as expected final CtType type = ModelUtils.buildClass(NewArrayList.class); - + CtConstructorCall constCall = (CtConstructorCall) type.getMethodsByName("m").get(0).getBody().getStatements().get(0); //new ArrayList<>(); ElementSourceFragment constCallSF = constCall.getOriginalSourceFragment(); @@ -349,7 +347,7 @@ public void testSourceFragmentsOfNewArrayList() throws Exception { assertEquals("(", children.get(3).getSourceCode()); assertEquals(")", children.get(4).getSourceCode()); assertEquals(";", children.get(5).getSourceCode()); - + List children2 = ((ElementSourceFragment) children.get(2)).getChildrenFragments(); assertEquals(3, children2.size()); assertEquals("ArrayList", children2.get(0).getSourceCode()); @@ -373,10 +371,10 @@ public void testSourceFragmentsOfNewAnnonymousClass() throws Exception { assertEquals("(", children.get(3).getSourceCode()); assertEquals(")", children.get(4).getSourceCode()); assertEquals(" ", children.get(5).getSourceCode()); - assertEquals("{" + - " @Override" + - " public void accept(Set t) {" + - " }" + + assertEquals("{" + + " @Override" + + " public void accept(Set t) {" + + " }" + " }", children.get(6).getSourceCode().replaceAll("\\r|\\n", "")); } { @@ -389,13 +387,13 @@ public void testSourceFragmentsOfNewAnnonymousClass() throws Exception { assertEquals(5, children.size()); assertEquals("{", children.get(0).getSourceCode()); assertEquals(" ", children.get(1).getSourceCode().replaceAll("\\r|\\n", "")); - assertEquals("@Override" + - " public void accept(Set t) {" + + assertEquals("@Override" + + " public void accept(Set t) {" + " }", children.get(2).getSourceCode().replaceAll("\\r|\\n", "")); assertEquals(" ", children.get(3).getSourceCode().replaceAll("\\r|\\n", "")); assertEquals("}", children.get(4).getSourceCode()); - - + + } } @@ -439,7 +437,7 @@ private static void assertGroupsEqual(Object[] expectedFragments, List toCodeStrings(List csf) { return csf.stream().map(SourceFragment::getSourceCode).collect(Collectors.toList()); } diff --git a/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java b/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java index a8a41a070ec..a0c83cec4d3 100644 --- a/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java +++ b/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java @@ -16,6 +16,21 @@ */ package spoon.test.prettyprinter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; @@ -63,22 +78,6 @@ import spoon.testing.utils.LineSeparatorExtension; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.utils.ModelUtils.build; @@ -102,7 +101,7 @@ public void testPrintClassWithStaticImportOfMethod() { "public class ClassUsingStaticMethod {" + nl + " public void callFindFirst() {" + nl + " findFirst();" + nl + - " new ClassWithStaticMethod().notStaticFindFirst();" + nl + + " new ClassWithStaticMethod().notStaticFindFirst();" + nl + " }" + nl + "}" + nl; diff --git a/src/test/java/spoon/test/prettyprinter/LinesTest.java b/src/test/java/spoon/test/prettyprinter/LinesTest.java index 342de2efb9f..fe67605198b 100644 --- a/src/test/java/spoon/test/prettyprinter/LinesTest.java +++ b/src/test/java/spoon/test/prettyprinter/LinesTest.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/prettyprinter/LoopSniperJavaPrettyPrinterTest.java b/src/test/java/spoon/test/prettyprinter/LoopSniperJavaPrettyPrinterTest.java index e14503976b1..9ede7bf173e 100644 --- a/src/test/java/spoon/test/prettyprinter/LoopSniperJavaPrettyPrinterTest.java +++ b/src/test/java/spoon/test/prettyprinter/LoopSniperJavaPrettyPrinterTest.java @@ -5,7 +5,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; @@ -45,7 +44,7 @@ public void whileNoBraces() throws IOException { runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/loop/WhileNoBraces.java"); } - + @Test @Disabled public void whileWithBraces() throws IOException { @@ -85,4 +84,3 @@ public void process(CtLoop element) { } } - diff --git a/src/test/java/spoon/test/prettyprinter/PrinterTest.java b/src/test/java/spoon/test/prettyprinter/PrinterTest.java index 5e1debfa026..3655767f42f 100644 --- a/src/test/java/spoon/test/prettyprinter/PrinterTest.java +++ b/src/test/java/spoon/test/prettyprinter/PrinterTest.java @@ -26,7 +26,6 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.stream.Collectors; - import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -355,7 +354,7 @@ public void testPrinterTokenListener() throws Exception { pp.calculate(t.getPosition().getCompilationUnit(), Collections.singletonList(t)); //result of printing using standard DefaultTokenWriter String standardPrintedResult = pp.getResult(); - + StringBuilder allTokens = new StringBuilder(); //print type with custom listener //1) register custom TokenWriter which checks the TokenWriter contract @@ -366,24 +365,24 @@ public void testPrinterTokenListener() throws Exception { @Override public TokenWriter writeSeparator(String separator) { checkRepeatingOfTokens("writeSeparator"); - checkTokenWhitespace(separator, false); + checkTokenWhitespace(separator, false); //one of the separators assertTrue(separators.contains(separator), "Unexpected separator: " + separator); handleTabs(); allTokens.append(separator); return this; } - + @Override public TokenWriter writeOperator(String operator) { checkRepeatingOfTokens("writeOperator"); - checkTokenWhitespace(operator, false); + checkTokenWhitespace(operator, false); assertTrue(operators.contains(operator), "Unexpected operator: " + operator); handleTabs(); allTokens.append(operator); return this; } - + @Override public TokenWriter writeLiteral(String literal) { checkRepeatingOfTokens("writeLiteral"); @@ -392,17 +391,17 @@ public TokenWriter writeLiteral(String literal) { allTokens.append(literal); return this; } - + @Override public TokenWriter writeKeyword(String keyword) { checkRepeatingOfTokens("writeKeyword"); - checkTokenWhitespace(keyword, false); + checkTokenWhitespace(keyword, false); assertTrue(javaKeywords.contains(keyword), "Unexpected java keyword: " + keyword); handleTabs(); allTokens.append(keyword); return this; } - + @Override public TokenWriter writeIdentifier(String identifier) { checkRepeatingOfTokens("writeIdentifier"); @@ -423,7 +422,7 @@ public TokenWriter writeIdentifier(String identifier) { allTokens.append(identifier); return this; } - + @Override public TokenWriter writeComment(CtComment comment) { checkRepeatingOfTokens("writeComment"); @@ -436,7 +435,7 @@ public TokenWriter writeComment(CtComment comment) { allTokens.append(sptw.getPrinterHelper().toString()); return this; } - + @Override public TokenWriter writeln() { checkRepeatingOfTokens("writeln"); @@ -444,10 +443,10 @@ public TokenWriter writeln() { lastTokenWasEOL = true; return this; } - + private boolean lastTokenWasEOL = true; private int tabCount = 0; - + public TokenWriter handleTabs() { if(lastTokenWasEOL) { lastTokenWasEOL = false; @@ -460,7 +459,7 @@ public TokenWriter handleTabs() { } } } - + } return this; } @@ -517,14 +516,14 @@ private void checkRepeatingOfTokens(String tokenType) { this.lastToken = tokenType; } }); - + //2) print type using PrettyPrinter with listener pp.calculate(t.getPosition().getCompilationUnit(), Collections.singletonList(t)); String withEmptyListenerResult = pp.getResult(); //contract: each printed character is handled by listener. PrinterHelper is not called directly //and because PrinterTokenListener above does not use PrinterHelper, the result must be empty assertEquals(0, withEmptyListenerResult.length()); - + //contract: result built manually from tokens is same like the one made by DefaultTokenWriter assertEquals(standardPrintedResult, allTokens.toString()); } @@ -606,7 +605,7 @@ public DefaultTokenWriter writeKeyword(String token) { assertTrue(FileUtils.readFileToString(new File("spooned/HelloWorld.java"), "UTF-8").contains(" class")); } - + @Test public void testTypeLostPrintingStringClassReference() { // contract: when a class reference is printed, the type is not lost diff --git a/src/test/java/spoon/test/prettyprinter/QualifiedThisRefTest.java b/src/test/java/spoon/test/prettyprinter/QualifiedThisRefTest.java index f1c0b96392f..cb4559bbfef 100644 --- a/src/test/java/spoon/test/prettyprinter/QualifiedThisRefTest.java +++ b/src/test/java/spoon/test/prettyprinter/QualifiedThisRefTest.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -43,7 +42,6 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.compiler.VirtualFile; import spoon.support.reflect.code.CtFieldAccessImpl; -import spoon.support.reflect.code.CtTypeAccessImpl; import spoon.test.delete.testclasses.Adobada; import spoon.test.prettyprinter.testclasses.QualifiedThisRef; diff --git a/src/test/java/spoon/test/prettyprinter/SniperAnnotatedEnumTest.java b/src/test/java/spoon/test/prettyprinter/SniperAnnotatedEnumTest.java index f1d234878e1..dad418332fa 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperAnnotatedEnumTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperAnnotatedEnumTest.java @@ -1,12 +1,9 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; @@ -20,42 +17,44 @@ import spoon.support.sniper.SniperJavaPrettyPrinter; import spoon.testing.utils.GitHubIssue; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperAnnotatedEnumTest { - private static final Path INPUT_PATH = Paths.get("src/test/java/"); - private static final Path OUTPUT_PATH = Paths.get("target/test-output"); - - @BeforeAll - public static void setup() throws IOException { - FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); - } - - @Test - @GitHubIssue(issueNumber = 4779, fixed = true) - public void annotatedEnumTest() throws IOException { - runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/AnnotatedEnum.java"); - } - - private void runSniperJavaPrettyPrinter(String path) throws IOException { - final Launcher launcher = new Launcher(); - final Environment e = launcher.getEnvironment(); - e.setLevel("INFO"); - e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); - - launcher.addInputResource(INPUT_PATH.resolve(path).toString()); - launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); - - CtModel model = launcher.buildModel(); - CtClass ctClass = model.getElements(new TypeFilter<>(CtClass.class)).get(0); - - ctClass.addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); - - launcher.process(); - launcher.prettyprint(); - // Verify result file exists and is not empty - assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), - CoreMatchers.equalTo(true)); - - String content = Files.readString(OUTPUT_PATH.resolve(path)); - assertThat(content.trim(), CoreMatchers.containsString("/* test */public enum")); - } +private static final Path INPUT_PATH = Paths.get("src/test/java/"); +private static final Path OUTPUT_PATH = Paths.get("target/test-output"); + +@BeforeAll +public static void setup() throws IOException { + FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); +} + +@Test +@GitHubIssue(issueNumber = 4779, fixed = true) +public void annotatedEnumTest() throws IOException { + runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/AnnotatedEnum.java"); +} + +private void runSniperJavaPrettyPrinter(String path) throws IOException { + final Launcher launcher = new Launcher(); + final Environment e = launcher.getEnvironment(); + e.setLevel("INFO"); + e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); + + launcher.addInputResource(INPUT_PATH.resolve(path).toString()); + launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); + + CtModel model = launcher.buildModel(); + CtClass ctClass = model.getElements(new TypeFilter<>(CtClass.class)).get(0); + + ctClass.addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); + + launcher.process(); + launcher.prettyprint(); + // Verify result file exists and is not empty + assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), + CoreMatchers.equalTo(true)); + + String content = Files.readString(OUTPUT_PATH.resolve(path)); + assertThat(content.trim(), CoreMatchers.containsString("/* test */public enum")); +} } diff --git a/src/test/java/spoon/test/prettyprinter/SniperAssertTest.java b/src/test/java/spoon/test/prettyprinter/SniperAssertTest.java index ec3b7db9645..d71d6233b84 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperAssertTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperAssertTest.java @@ -1,17 +1,13 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.CtModel; @@ -20,6 +16,8 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.sniper.SniperJavaPrettyPrinter; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperAssertTest { private static final Path INPUT_PATH = Paths.get("src/test/java/"); private static final Path OUTPUT_PATH = Paths.get("target/test-output"); diff --git a/src/test/java/spoon/test/prettyprinter/SniperDefaultMethodTest.java b/src/test/java/spoon/test/prettyprinter/SniperDefaultMethodTest.java index 35d2e0dac46..ba40ab0cff8 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperDefaultMethodTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperDefaultMethodTest.java @@ -1,17 +1,13 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.CtModel; @@ -20,45 +16,47 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.sniper.SniperJavaPrettyPrinter; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperDefaultMethodTest { - private static final Path INPUT_PATH = Paths.get("src/test/java/"); - private static final Path OUTPUT_PATH = Paths.get("target/test-output"); +private static final Path INPUT_PATH = Paths.get("src/test/java/"); +private static final Path OUTPUT_PATH = Paths.get("target/test-output"); - @BeforeAll - public static void setup() throws IOException { - FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); - } +@BeforeAll +public static void setup() throws IOException { + FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); +} - @Test - public void defaultMethodTest() throws IOException { - runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DefaultMethod.java"); - } +@Test +public void defaultMethodTest() throws IOException { + runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DefaultMethod.java"); +} - private void runSniperJavaPrettyPrinter(String path) throws IOException { - final Launcher launcher = new Launcher(); - final Environment e = launcher.getEnvironment(); - e.setLevel("INFO"); - e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); +private void runSniperJavaPrettyPrinter(String path) throws IOException { + final Launcher launcher = new Launcher(); + final Environment e = launcher.getEnvironment(); + e.setLevel("INFO"); + e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); - launcher.addInputResource(INPUT_PATH.resolve(path).toString()); - launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); + launcher.addInputResource(INPUT_PATH.resolve(path).toString()); + launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); - CtModel model = launcher.buildModel(); + CtModel model = launcher.buildModel(); - CtMethod method = model.getElements(new TypeFilter<>(CtMethod.class)).get(0); + CtMethod method = model.getElements(new TypeFilter<>(CtMethod.class)).get(0); - method.getBody().addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); + method.getBody().addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); - launcher.process(); - launcher.prettyprint(); - // Verify result file exist and is not empty - assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), - CoreMatchers.equalTo(true)); + launcher.process(); + launcher.prettyprint(); + // Verify result file exist and is not empty + assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), + CoreMatchers.equalTo(true)); - String content = Files.readString(OUTPUT_PATH.resolve(path)); + String content = Files.readString(OUTPUT_PATH.resolve(path)); - assertThat(content, CoreMatchers.notNullValue()); - assertThat("Result class should not be empty", content.trim(), CoreMatchers.not(CoreMatchers.equalTo(""))); - assertThat("Method should still have default modifier", content.trim(), CoreMatchers.containsString(" default ")); - } + assertThat(content, CoreMatchers.notNullValue()); + assertThat("Result class should not be empty", content.trim(), CoreMatchers.not(CoreMatchers.equalTo(""))); + assertThat("Method should still have default modifier", content.trim(), CoreMatchers.containsString(" default ")); +} } diff --git a/src/test/java/spoon/test/prettyprinter/SniperDoubleBoundTest.java b/src/test/java/spoon/test/prettyprinter/SniperDoubleBoundTest.java index df343a35812..a488550ad2d 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperDoubleBoundTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperDoubleBoundTest.java @@ -1,17 +1,13 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.CtModel; @@ -20,41 +16,43 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.sniper.SniperJavaPrettyPrinter; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperDoubleBoundTest { - private static final Path INPUT_PATH = Paths.get("src/test/java/"); - private static final Path OUTPUT_PATH = Paths.get("target/test-output"); - - @BeforeAll - public static void setup() throws IOException { - FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); - } - - @Test - public void doubleBoundTest() throws IOException { - runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DoubleBound.java"); - } - - private void runSniperJavaPrettyPrinter(String path) throws IOException { - final Launcher launcher = new Launcher(); - final Environment e = launcher.getEnvironment(); - e.setLevel("INFO"); - e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); - - launcher.addInputResource(INPUT_PATH.resolve(path).toString()); - launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); - - CtModel model = launcher.buildModel(); - CtClass ctClass = model.getElements(new TypeFilter<>(CtClass.class)).get(0); - - ctClass.addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); - - launcher.process(); - launcher.prettyprint(); - // Verify result file exists and is not empty - assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), - CoreMatchers.equalTo(true)); - - String content = Files.readString(OUTPUT_PATH.resolve(path)); - assertThat(content.trim(), CoreMatchers.containsString("/* test */public class DoubleBound")); - } +private static final Path INPUT_PATH = Paths.get("src/test/java/"); +private static final Path OUTPUT_PATH = Paths.get("target/test-output"); + +@BeforeAll +public static void setup() throws IOException { + FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); +} + +@Test +public void doubleBoundTest() throws IOException { + runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DoubleBound.java"); +} + +private void runSniperJavaPrettyPrinter(String path) throws IOException { + final Launcher launcher = new Launcher(); + final Environment e = launcher.getEnvironment(); + e.setLevel("INFO"); + e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); + + launcher.addInputResource(INPUT_PATH.resolve(path).toString()); + launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); + + CtModel model = launcher.buildModel(); + CtClass ctClass = model.getElements(new TypeFilter<>(CtClass.class)).get(0); + + ctClass.addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); + + launcher.process(); + launcher.prettyprint(); + // Verify result file exists and is not empty + assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), + CoreMatchers.equalTo(true)); + + String content = Files.readString(OUTPUT_PATH.resolve(path)); + assertThat(content.trim(), CoreMatchers.containsString("/* test */public class DoubleBound")); +} } diff --git a/src/test/java/spoon/test/prettyprinter/SniperDoubleForInitializerTest.java b/src/test/java/spoon/test/prettyprinter/SniperDoubleForInitializerTest.java index 9e609706b88..b6d3f060158 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperDoubleForInitializerTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperDoubleForInitializerTest.java @@ -1,16 +1,12 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.CtModel; @@ -19,46 +15,48 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.sniper.SniperJavaPrettyPrinter; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperDoubleForInitializerTest { - private static final Path INPUT_PATH = Paths.get("src/test/java/"); - private static final Path OUTPUT_PATH = Paths.get("target/test-output"); +private static final Path INPUT_PATH = Paths.get("src/test/java/"); +private static final Path OUTPUT_PATH = Paths.get("target/test-output"); - @BeforeAll - public static void setup() throws IOException { - FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); - } +@BeforeAll +public static void setup() throws IOException { + FileUtils.deleteDirectory(OUTPUT_PATH.toFile()); +} - @Test - public void DoubleForInitializerTest() throws IOException { - runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DoubleForInitializer.java"); - } +@Test +public void DoubleForInitializerTest() throws IOException { + runSniperJavaPrettyPrinter("spoon/test/prettyprinter/testclasses/DoubleForInitializer.java"); +} - private void runSniperJavaPrettyPrinter(String path) throws IOException { - final Launcher launcher = new Launcher(); - final Environment e = launcher.getEnvironment(); - e.setLevel("INFO"); - e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); +private void runSniperJavaPrettyPrinter(String path) throws IOException { + final Launcher launcher = new Launcher(); + final Environment e = launcher.getEnvironment(); + e.setLevel("INFO"); + e.setPrettyPrinterCreator(() -> new SniperJavaPrettyPrinter(e)); - launcher.addInputResource(INPUT_PATH.resolve(path).toString()); - launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); + launcher.addInputResource(INPUT_PATH.resolve(path).toString()); + launcher.setSourceOutputDirectory(OUTPUT_PATH.toString()); - CtModel model = launcher.buildModel(); + CtModel model = launcher.buildModel(); - CtMethod method = model.getElements(new TypeFilter<>(CtMethod.class)).get(0); + CtMethod method = model.getElements(new TypeFilter<>(CtMethod.class)).get(0); - method.getBody().addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); + method.getBody().addComment(launcher.getFactory().Code().createComment("test", CommentType.BLOCK)); - launcher.process(); - launcher.prettyprint(); - // Verify result file exists and is not empty - assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), - CoreMatchers.equalTo(true)); + launcher.process(); + launcher.prettyprint(); + // Verify result file exists and is not empty + assertThat("Output file for " + path + " should exist", OUTPUT_PATH.resolve(path).toFile().exists(), + CoreMatchers.equalTo(true)); - String content = Files.readString(OUTPUT_PATH.resolve(path)); + String content = Files.readString(OUTPUT_PATH.resolve(path)); - assertThat(content, CoreMatchers.notNullValue()); - assertThat("Result class should not be empty", content.trim(), CoreMatchers.not(CoreMatchers.equalTo(""))); - assertThat("For loop should have one initializer for y", content.trim(), - CoreMatchers.containsString("int i = 0, y = 0;")); - } + assertThat(content, CoreMatchers.notNullValue()); + assertThat("Result class should not be empty", content.trim(), CoreMatchers.not(CoreMatchers.equalTo(""))); + assertThat("For loop should have one initializer for y", content.trim(), + CoreMatchers.containsString("int i = 0, y = 0;")); +} } diff --git a/src/test/java/spoon/test/prettyprinter/SniperInnerTypeTest.java b/src/test/java/spoon/test/prettyprinter/SniperInnerTypeTest.java index 6b4abbcdd6d..ec94dfd02c3 100644 --- a/src/test/java/spoon/test/prettyprinter/SniperInnerTypeTest.java +++ b/src/test/java/spoon/test/prettyprinter/SniperInnerTypeTest.java @@ -1,17 +1,13 @@ package spoon.test.prettyprinter; -import static org.hamcrest.MatcherAssert.assertThat; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; - import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.compiler.Environment; import spoon.reflect.CtModel; @@ -20,6 +16,8 @@ import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.sniper.SniperJavaPrettyPrinter; +import static org.hamcrest.MatcherAssert.assertThat; + public class SniperInnerTypeTest { private static final Path INPUT_PATH = Paths.get("src/test/java/"); private static final Path OUTPUT_PATH = Paths.get("target/test-output"); diff --git a/src/test/java/spoon/test/prettyprinter/TestSniperPrinter.java b/src/test/java/spoon/test/prettyprinter/TestSniperPrinter.java index 6d73c83ab0e..5de25308700 100644 --- a/src/test/java/spoon/test/prettyprinter/TestSniperPrinter.java +++ b/src/test/java/spoon/test/prettyprinter/TestSniperPrinter.java @@ -7,20 +7,34 @@ */ package spoon.test.prettyprinter; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; import spoon.Launcher; import spoon.SpoonException; import spoon.compiler.Environment; import spoon.processing.AbstractProcessor; import spoon.refactoring.Refactoring; import spoon.reflect.CtModel; -import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtCodeSnippetExpression; +import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtFor; import spoon.reflect.code.CtInvocation; @@ -49,32 +63,15 @@ import spoon.support.modelobs.ChangeCollector; import spoon.support.modelobs.SourceFragmentCreator; import spoon.support.sniper.SniperJavaPrettyPrinter; +import spoon.test.prettyprinter.testclasses.InvocationReplacement; import spoon.test.prettyprinter.testclasses.OneLineMultipleVariableDeclaration; import spoon.test.prettyprinter.testclasses.Throw; -import spoon.test.prettyprinter.testclasses.InvocationReplacement; import spoon.test.prettyprinter.testclasses.ToBeChanged; import spoon.testing.utils.GitHubIssue; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.stream.Stream; import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -382,7 +379,7 @@ public void testPrintTypesThrowsWhenPassedTypesFromMultipleCompilationUnits() { launcher.getEnvironment().createPrettyPrinter().printTypes(types); fail("Expected an IllegalArgumentException"); } catch (IllegalArgumentException e) { - // pass + // pass } } @@ -491,7 +488,7 @@ public void testNewlineInsertedBetweenCommentAndTypeMemberWithAddedModifier() { type.getNestedType("NonStaticInnerClass").addModifier(ModifierKind.STATIC); }; BiConsumer, String> assertCommentsCorrectlyPrinted = (type, result) -> { - assertThat(result, containsString("// field comment\n")); + assertThat(result, containsString("// field comment\n")); assertThat(result, containsString("// method comment\n")); assertThat(result, containsString("// nested type comment\n")); }; @@ -606,9 +603,9 @@ public void testAddedElementsIndentedWithAppropriateIndentationStyle() { // indentation as in the rest of the file Consumer> addElements = type -> { - Factory fact = type.getFactory(); - fact.createField(type, new HashSet<>(), fact.Type().integerPrimitiveType(), "z", fact.createLiteral(3)); - type.getMethod("sum").getBody() + Factory fact = type.getFactory(); + fact.createField(type, new HashSet<>(), fact.Type().integerPrimitiveType(), "z", fact.createLiteral(3)); + type.getMethod("sum").getBody() .addStatement(0, fact.createCodeSnippetStatement("System.out.println(z);")); }; BiConsumer, String> assertTabs = (type, result) -> { @@ -616,8 +613,8 @@ public void testAddedElementsIndentedWithAppropriateIndentationStyle() { assertThat(result, containsString("\n\t\tSystem")); }; BiConsumer, String> assertTwoSpaces = (type, result) -> { - assertThat(result, containsString("\n int z = 3;")); - assertThat(result, containsString("\n System")); + assertThat(result, containsString("\n int z = 3;")); + assertThat(result, containsString("\n System")); }; BiConsumer, String> assertFourSpaces = (type, result) -> { assertThat(result, containsString("\n int z = 3;")); @@ -759,12 +756,12 @@ void testSniperRespectsDeletionInForInit() { // contract: The sniper printer should detect deletions in for loop init as modifications // and print the model accordingly. - Consumer> deleteForUpdate = type -> { - CtFor ctFor = type.filterChildren(CtFor.class::isInstance).first(); + Consumer> deleteForUpdate = type -> { + CtFor ctFor = type.filterChildren(CtFor.class::isInstance).first(); ctFor.getForInit().forEach(CtElement::delete); }; BiConsumer, String> assertNotStaticFindFirstIsEmpty = (type, result) -> - assertThat(result, containsString("for (; i < 10; i++)")); + assertThat(result, containsString("for (; i < 10; i++)")); testSniper("ForLoop", deleteForUpdate, assertNotStaticFindFirstIsEmpty); } diff --git a/src/test/java/spoon/test/processing/ProcessingTest.java b/src/test/java/spoon/test/processing/ProcessingTest.java index bf851bacade..890bb48b924 100644 --- a/src/test/java/spoon/test/processing/ProcessingTest.java +++ b/src/test/java/spoon/test/processing/ProcessingTest.java @@ -18,7 +18,6 @@ import com.google.common.io.Files; - import java.io.File; import java.io.IOException; import java.nio.charset.Charset; @@ -27,7 +26,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -54,7 +52,6 @@ import spoon.test.processing.processors.RenameProcessor; import spoon.testing.utils.ProcessorUtils; - import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/src/test/java/spoon/test/processing/processors/CtClassProcessor.java b/src/test/java/spoon/test/processing/processors/CtClassProcessor.java index 5cc87eb6943..217299c42c6 100644 --- a/src/test/java/spoon/test/processing/processors/CtClassProcessor.java +++ b/src/test/java/spoon/test/processing/processors/CtClassProcessor.java @@ -23,7 +23,7 @@ */ public class CtClassProcessor extends GenericCtTypeProcessor { - public CtClassProcessor() { - super(CtClass.class); - } + public CtClassProcessor() { + super(CtClass.class); + } } diff --git a/src/test/java/spoon/test/processing/processors/CtInterfaceProcessor.java b/src/test/java/spoon/test/processing/processors/CtInterfaceProcessor.java index b5319cc6a7e..1ba4913b3bb 100644 --- a/src/test/java/spoon/test/processing/processors/CtInterfaceProcessor.java +++ b/src/test/java/spoon/test/processing/processors/CtInterfaceProcessor.java @@ -22,7 +22,7 @@ * Created by urli on 31/08/2017. */ public class CtInterfaceProcessor extends GenericCtTypeProcessor { - public CtInterfaceProcessor() { - super(CtInterface.class); - } + public CtInterfaceProcessor() { + super(CtInterface.class); + } } diff --git a/src/test/java/spoon/test/processing/processors/CtTypeProcessor.java b/src/test/java/spoon/test/processing/processors/CtTypeProcessor.java index a7dbdd47341..aba0efa3fa5 100644 --- a/src/test/java/spoon/test/processing/processors/CtTypeProcessor.java +++ b/src/test/java/spoon/test/processing/processors/CtTypeProcessor.java @@ -23,7 +23,7 @@ */ public class CtTypeProcessor extends GenericCtTypeProcessor { - public CtTypeProcessor() { - super(CtType.class); - } + public CtTypeProcessor() { + super(CtType.class); + } } diff --git a/src/test/java/spoon/test/processing/processors/GenericCtTypeProcessor.java b/src/test/java/spoon/test/processing/processors/GenericCtTypeProcessor.java index 9841cc6adef..af64f2e2c8b 100644 --- a/src/test/java/spoon/test/processing/processors/GenericCtTypeProcessor.java +++ b/src/test/java/spoon/test/processing/processors/GenericCtTypeProcessor.java @@ -16,25 +16,24 @@ */ package spoon.test.processing.processors; -import spoon.processing.AbstractProcessor; -import spoon.reflect.declaration.CtType; - import java.util.ArrayList; import java.util.List; +import spoon.processing.AbstractProcessor; +import spoon.reflect.declaration.CtType; /** * Created by urli on 10/08/2017. */ public abstract class GenericCtTypeProcessor extends AbstractProcessor { - public GenericCtTypeProcessor(Class zeClass) { - super.addProcessedElementType(zeClass); - } + public GenericCtTypeProcessor(Class zeClass) { + super.addProcessedElementType(zeClass); + } - public List elements = new ArrayList<>(); + public List elements = new ArrayList<>(); - @Override - public void process(T element) { - elements.add(element); - } + @Override + public void process(T element) { + elements.add(element); + } } diff --git a/src/test/java/spoon/test/processing/processors/ParallelProcessorTest.java b/src/test/java/spoon/test/processing/processors/ParallelProcessorTest.java index 3e1a8fae6f2..3c2144795c1 100644 --- a/src/test/java/spoon/test/processing/processors/ParallelProcessorTest.java +++ b/src/test/java/spoon/test/processing/processors/ParallelProcessorTest.java @@ -6,6 +6,13 @@ * Spoon is available either under the terms of the MIT License (see LICENSE-MIT.txt) of the Cecill-C License (see LICENSE-CECILL-C.txt). You as the user are entitled to choose the terms under which to adopt Spoon. */ package spoon.test.processing.processors; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReferenceArray; +import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import spoon.FluentLauncher; @@ -15,14 +22,6 @@ import spoon.processing.Processor; import spoon.reflect.declaration.CtElement; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReferenceArray; -import java.util.stream.IntStream; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/src/test/java/spoon/test/processing/processors/RenameProcessor.java b/src/test/java/spoon/test/processing/processors/RenameProcessor.java index 232e6d384c6..9ac23b4e7c1 100644 --- a/src/test/java/spoon/test/processing/processors/RenameProcessor.java +++ b/src/test/java/spoon/test/processing/processors/RenameProcessor.java @@ -22,34 +22,34 @@ import spoon.reflect.reference.CtReference; public class RenameProcessor extends AbstractProcessor { - private String oldName; - private String newName; + private String oldName; + private String newName; - public RenameProcessor(String oldName, String newName) { - this.oldName = oldName; - this.newName = newName; - } + public RenameProcessor(String oldName, String newName) { + this.oldName = oldName; + this.newName = newName; + } - @Override - public boolean isToBeProcessed(CtElement candidate) { - if (candidate instanceof CtNamedElement) { - CtNamedElement namedElement = (CtNamedElement) candidate; - return namedElement.getSimpleName().equals(oldName); - } else if (candidate instanceof CtReference) { - CtReference reference = (CtReference) candidate; - return reference.getSimpleName().equals(oldName); - } - return false; - } + @Override + public boolean isToBeProcessed(CtElement candidate) { + if (candidate instanceof CtNamedElement) { + CtNamedElement namedElement = (CtNamedElement) candidate; + return namedElement.getSimpleName().equals(oldName); + } else if (candidate instanceof CtReference) { + CtReference reference = (CtReference) candidate; + return reference.getSimpleName().equals(oldName); + } + return false; + } - @Override - public void process(CtElement element) { - if (element instanceof CtNamedElement) { - CtNamedElement namedElement = (CtNamedElement) element; - namedElement.setSimpleName(this.newName); - } else if (element instanceof CtReference) { - CtReference reference = (CtReference) element; - reference.setSimpleName(this.newName); - } - } + @Override + public void process(CtElement element) { + if (element instanceof CtNamedElement) { + CtNamedElement namedElement = (CtNamedElement) element; + namedElement.setSimpleName(this.newName); + } else if (element instanceof CtReference) { + CtReference reference = (CtReference) element; + reference.setSimpleName(this.newName); + } + } } diff --git a/src/test/java/spoon/test/processing/processors/TestProcessor.java b/src/test/java/spoon/test/processing/processors/TestProcessor.java index 7596b28cd0b..2dcc96d2e02 100644 --- a/src/test/java/spoon/test/processing/processors/TestProcessor.java +++ b/src/test/java/spoon/test/processing/processors/TestProcessor.java @@ -17,7 +17,6 @@ package spoon.test.processing.processors; import java.util.Date; - import spoon.processing.AbstractProcessor; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.declaration.CtClass; diff --git a/src/test/java/spoon/test/properties/PropertiesTest.java b/src/test/java/spoon/test/properties/PropertiesTest.java index 123c1696986..f05bfa9cdb5 100644 --- a/src/test/java/spoon/test/properties/PropertiesTest.java +++ b/src/test/java/spoon/test/properties/PropertiesTest.java @@ -19,7 +19,6 @@ import java.io.File; import java.util.Arrays; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonModelBuilder; diff --git a/src/test/java/spoon/test/properties/SimpleProcessor.java b/src/test/java/spoon/test/properties/SimpleProcessor.java index ec28c1eabdb..69e50eed82d 100644 --- a/src/test/java/spoon/test/properties/SimpleProcessor.java +++ b/src/test/java/spoon/test/properties/SimpleProcessor.java @@ -12,8 +12,8 @@ public class SimpleProcessor extends AbstractProcessor> { - @Override - public void process(CtMethod element) { + @Override + public void process(CtMethod element) { - } + } } diff --git a/src/test/java/spoon/test/query_function/VariableReferencesTest.java b/src/test/java/spoon/test/query_function/VariableReferencesTest.java index 8806d1e9066..ca25100e831 100644 --- a/src/test/java/spoon/test/query_function/VariableReferencesTest.java +++ b/src/test/java/spoon/test/query_function/VariableReferencesTest.java @@ -1,378 +1,377 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.query_function; - - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import spoon.Launcher; -import spoon.reflect.code.CtAbstractInvocation; -import spoon.reflect.code.CtBinaryOperator; -import spoon.reflect.code.CtCatchVariable; -import spoon.reflect.code.CtExpression; -import spoon.reflect.code.CtLambda; -import spoon.reflect.code.CtLiteral; -import spoon.reflect.code.CtLocalVariable; -import spoon.reflect.code.CtStatement; -import spoon.reflect.cu.SourcePosition; -import spoon.reflect.cu.position.NoSourcePosition; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtExecutable; -import spoon.reflect.declaration.CtField; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtParameter; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtVariable; -import spoon.reflect.factory.Factory; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.reference.CtLocalVariableReference; -import spoon.reflect.reference.CtVariableReference; -import spoon.reflect.visitor.chain.CtConsumableFunction; -import spoon.reflect.visitor.filter.CatchVariableReferenceFunction; -import spoon.reflect.visitor.filter.CatchVariableScopeFunction; -import spoon.reflect.visitor.filter.FieldScopeFunction; -import spoon.reflect.visitor.filter.LocalVariableReferenceFunction; -import spoon.reflect.visitor.filter.LocalVariableScopeFunction; -import spoon.reflect.visitor.filter.NamedElementFilter; -import spoon.reflect.visitor.filter.ParameterReferenceFunction; -import spoon.reflect.visitor.filter.ParameterScopeFunction; -import spoon.reflect.visitor.filter.PotentialVariableDeclarationFunction; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.reflect.visitor.filter.VariableReferenceFunction; -import spoon.reflect.visitor.filter.VariableScopeFunction; -import spoon.test.query_function.testclasses.VariableReferencesFromStaticMethod; -import spoon.test.query_function.testclasses.VariableReferencesModelTest; -import spoon.testing.utils.ModelUtils; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -public class VariableReferencesTest { - CtClass modelClass; - - @BeforeEach - public void setup() { - final Launcher launcher = new Launcher(); - launcher.setArgs(new String[] {"--output-type", "nooutput","--level","info" }); - launcher.getEnvironment().setCommentEnabled(true); - launcher.addInputResource("./src/test/java/spoon/test/query_function/testclasses/VariableReferencesModelTest.java"); - launcher.run(); - Factory factory = launcher.getFactory(); - modelClass = factory.Class().get(VariableReferencesModelTest.class); - } - - @Test - public void testCheckModelConsistency() { - //1) search for all variable declarations with name isTestFieldName(name)==true - //2) check that each of them is using different identification value - class Context { - Map unique = new HashMap<>(); - int maxKey = 0; - void checkKey(int key, CtElement ele) { - CtElement ambiguous = unique.put(key, ele); - if(ambiguous!=null) { - fail("Two variables [" + ambiguous.toString() + " in " + getParentMethodName(ambiguous) + "," + ele.toString() + " in " + getParentMethodName(ele) + "] has same value"); - } - maxKey = Math.max(maxKey, key); - } - } - Context context = new Context(); - - modelClass.filterChildren((CtElement e)->{ - if (e instanceof CtVariable) { - CtVariable var = (CtVariable) e; - if(isTestFieldName(var.getSimpleName())==false) { - return false; - } - //check only these variables whose name is isTestFieldName(name)==true - Integer val = getLiteralValue(var); - context.checkKey(val, var); - } - return false; - }).list(); - assertFalse(context.unique.isEmpty()); - assertEquals(context.maxKey, context.unique.size(), "Only these keys were found: " + context.unique.keySet()); - assertEquals((int) getLiteralValue((CtVariable) modelClass.filterChildren(new NamedElementFilter<>(CtVariable.class, "maxValue")).first()), context.maxKey, "AllLocalVars#maxValue must be equal to maximum value number "); - } - - @Test - public void testCatchVariableReferenceFunction() { - //visits all the CtCatchVariable elements whose name is isTestFieldName(name)==true and search for all their references - //The test detects whether found references are correct by these two checks: - //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) - //2) the model is searched for all variable references which has same identification number and counts them - //Then it checks that counted number of references and found number of references is same - modelClass.filterChildren((CtCatchVariable var)->{ - if(isTestFieldName(var.getSimpleName())) { - int value = getLiteralValue(var); - checkVariableAccess(var, value, new CatchVariableReferenceFunction()); - } - return false; - }).list(); - } - - @Test - public void testLocalVariableReferenceFunction() { - //visits all the CtLocalVariable elements whose name is isTestFieldName(name)==true and search for all their references - //The test detects whether found references are correct by these two checks: - //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) - //2) the model is searched for all variable references which has same identification number and counts them - //Then it checks that counted number of references and found number of references is same - modelClass.filterChildren((CtLocalVariable var)->{ - if(isTestFieldName(var.getSimpleName())) { - int value = getLiteralValue(var); - checkVariableAccess(var, value, new LocalVariableReferenceFunction()); - } - return false; - }).list(); - } - - @Test - public void testParameterReferenceFunction() { - //visits all the CtParameter elements whose name is isTestFieldName(name)==true and search for all their references - //The test detects whether found references are correct by these two checks: - //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) - //2) the model is searched for all variable references which has same identification number and counts them - //Then it checks that counted number of references and found number of references is same - modelClass.filterChildren((CtParameter var)->{ - if(isTestFieldName(var.getSimpleName())) { - int value = getLiteralValue(var); - checkVariableAccess(var, value, new ParameterReferenceFunction()); - } - return false; - }).list(); - } - - @Test - public void testVariableReferenceFunction() { - //visits all the CtVariable elements whose name is isTestFieldName(name)==true and search for all their references - //The test detects whether found references are correct by these two checks: - //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) - //2) the model is searched for all variable references which has same identification number and counts them - //Then it checks that counted number of references and found number of references is same - modelClass.filterChildren((CtVariable var)->{ - if(isTestFieldName(var.getSimpleName())) { - int value = getLiteralValue(var); - checkVariableAccess(var, value, new VariableReferenceFunction()); - } - return false; - }).list(); - } - - private boolean isTestFieldName(String name) { - return "field".equals(name); - } - - @Test - public void testVariableScopeFunction() { - //visits all the CtVariable elements whose name is "field" and search for all elements in their scopes - //Comparing with the result found by basic functions - List list = modelClass.filterChildren((CtVariable var)->{ - if("field".equals(var.getSimpleName())) { - if(var instanceof CtField) { - //field scope is not supported - return false; - } - CtElement[] real = var.map(new VariableScopeFunction()).list().toArray(new CtElement[0]); - if(var instanceof CtLocalVariable) { - assertArrayEquals(var.map(new LocalVariableScopeFunction()).list().toArray(new CtElement[0]), real); - } else if(var instanceof CtParameter) { - assertArrayEquals(var.map(new ParameterScopeFunction()).list().toArray(new CtElement[0]), real); - } else if(var instanceof CtCatchVariable) { - assertArrayEquals(var.map(new CatchVariableScopeFunction()).list().toArray(new CtElement[0]), real); - } else { - fail("Unexpected variable of type "+var.getClass().getName()); - } - return true; - } - return false; - }).list(); - assertFalse(list.isEmpty()); - } - - @Test - public void testFieldScopeFunction() { - // contract: FieldScopeFunction matches the right elements - CtElement[] real0 = modelClass.getFields().get(0).map(new FieldScopeFunction()).list().toArray(new CtElement[0]); - assertTrue(real0.length > 0); - CtElement[] real1 = modelClass.getFields().get(1).map(new FieldScopeFunction()).list().toArray(new CtElement[0]); - assertTrue(real1.length > 0); - } - @Test - public void testLocalVariableReferenceDeclarationFunction() { - modelClass.filterChildren((CtLocalVariableReference varRef)->{ - if(isTestFieldName(varRef.getSimpleName())) { - CtLocalVariable var = varRef.getDeclaration(); - assertNotNull(var, "The declaration of variable " + varRef.getSimpleName() + " in " + getParentMethodName(varRef) + " on line " + var.getPosition().getLine() + " with value " + getVariableReferenceValue(varRef) + " was not found"); - assertEquals(getVariableReferenceValue(varRef), (int) getLiteralValue(var), "CtLocalVariableReference#getDeclaration returned wrong declaration in " + getParentMethodName(varRef)); - } - return false; - }).list(); - } - - private void checkVariableAccess(CtVariable var, int value, CtConsumableFunction query) { - class Context { - int realCount = 0; - int expectedCount = 0; - Set unique = new HashSet<>(); - } - try { - Context context = new Context(); - //use provided reference returning function to found all occurrences of the variable - var.map(query).forEach((CtVariableReference fr)->{ - //check that all the found field references has expected right hand expression - assertEquals(value, getVariableReferenceValue(fr)); - //count number of found references - context.realCount++; - }); - //use filterChildren to scan all field references in model and count the number of field references which has same value => expectedCount - modelClass.filterChildren(new TypeFilter<>(CtVariableReference.class)) - .forEach((CtVariableReference varRef)->{ - if(isTestFieldName(varRef.getSimpleName())==false) { - return; - } - int refValue = getVariableReferenceValue(varRef); - if(refValue<0) { - fail("Variable reference has no value:\n"+varRef); - } - if(refValue==value) { - context.expectedCount++; - } - }); - //check that both scans found same number of references - assertEquals(context.expectedCount, context.realCount, "Number of references to field=" + value + " does not match"); - - } catch (Throwable e) { - e.printStackTrace(); - throw new AssertionError("Test failed on " + getParentMethodName(var), e); - } - } - - private String getParentMethodName(CtElement ele) { - CtMethod parentMethod = ele.getParent(CtMethod.class); - CtMethod m; - while(parentMethod!=null && (m=parentMethod.getParent(CtMethod.class))!=null) { - parentMethod = m; - } - if(parentMethod!=null) { - return parentMethod.getParent(CtType.class).getSimpleName()+"#"+parentMethod.getSimpleName(); - } else { - return ele.getParent(CtType.class).getSimpleName()+"#annonymous block"; - } - } - - private int getVariableReferenceValue(CtVariableReference fr) { - CtBinaryOperator binOp = fr.getParent(CtBinaryOperator.class); - if(binOp==null) { - return getCommentValue(fr); - } - return getLiteralValue(binOp.getRightHandOperand()); - } - - private Integer getLiteralValue(CtVariable var) { - CtExpression exp = var.getDefaultExpression(); - if(exp!=null) { - try { - return getLiteralValue(exp); - } catch (ClassCastException e) { - - } - } - if (var instanceof CtParameter) { - CtParameter param = (CtParameter) var; - CtExecutable l_exec = param.getParent(CtExecutable.class); - int l_argIdx = l_exec.getParameters().indexOf(param); - assertTrue(l_argIdx>=0); - if (l_exec instanceof CtLambda) { - CtLambda lambda = (CtLambda) l_exec; - CtLocalVariable lamVar = (CtLocalVariable)lambda.getParent(); - CtLocalVariableReference lamVarRef = lamVar.getParent().filterChildren((CtLocalVariableReference ref)->ref.getSimpleName().equals(lamVar.getSimpleName())).first(); - CtAbstractInvocation inv = lamVarRef.getParent(CtAbstractInvocation.class); - return getLiteralValue((CtExpression)inv.getArguments().get(l_argIdx)); - } else { - CtExecutableReference l_execRef = l_exec.getReference(); - List> list = l_exec.getFactory().Package().getRootPackage().filterChildren((CtAbstractInvocation inv)->{ - return inv.getExecutable().getExecutableDeclaration()==l_exec; - }).list(); - CtAbstractInvocation inv = list.get(0); - Integer firstValue = getLiteralValue((CtExpression)inv.getArguments().get(l_argIdx)); - //check that all found method invocations are using same key - list.forEach(inv2->{ - assertEquals(firstValue, getLiteralValue(inv2.getArguments().get(l_argIdx))); - }); - return firstValue; - } - } - return getCommentValue(var); - } - - private int getCommentValue(CtElement e) { - while(true) { - if(e==null) { - return -1; - } - if(e.getComments().isEmpty()==false) { - break; - } - e = e.getParent(); - } - if(e.getComments().size()==1) { - String l_c = e.getComments().get(0).getContent(); - return Integer.parseInt(l_c); - } - return -1; - } - - private Integer getLiteralValue(CtExpression exp) { - return ((CtLiteral) exp).getValue(); - } - - private SourcePosition getPosition(CtElement e) { - SourcePosition sp = e.getPosition(); - while(sp instanceof NoSourcePosition) { - e = e.getParent(); - if(e==null) { - break; - } - sp = e.getPosition(); - } - return sp; - } - - @Test - public void testPotentialVariableAccessFromStaticMethod() throws Exception { - Factory factory = ModelUtils.build(VariableReferencesFromStaticMethod.class); - CtClass clazz = factory.Class().get(VariableReferencesFromStaticMethod.class); - CtMethod staticMethod = clazz.getMethodsByName("staticMethod").get(0); - CtStatement stmt = staticMethod.getBody().getStatements().get(1); - assertEquals("org.junit.jupiter.api.Assertions.assertTrue(field == 2)", stmt.toString()); - CtLocalVariableReference varRef = stmt.filterChildren(new TypeFilter<>(CtLocalVariableReference.class)).first(); - List vars = varRef.map(new PotentialVariableDeclarationFunction()).list(); - assertEquals(1, vars.size(), "Found unexpected variable declaration."); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.query_function; + + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.code.CtAbstractInvocation; +import spoon.reflect.code.CtBinaryOperator; +import spoon.reflect.code.CtCatchVariable; +import spoon.reflect.code.CtExpression; +import spoon.reflect.code.CtLambda; +import spoon.reflect.code.CtLiteral; +import spoon.reflect.code.CtLocalVariable; +import spoon.reflect.code.CtStatement; +import spoon.reflect.cu.SourcePosition; +import spoon.reflect.cu.position.NoSourcePosition; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtExecutable; +import spoon.reflect.declaration.CtField; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtParameter; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtVariable; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.reference.CtLocalVariableReference; +import spoon.reflect.reference.CtVariableReference; +import spoon.reflect.visitor.chain.CtConsumableFunction; +import spoon.reflect.visitor.filter.CatchVariableReferenceFunction; +import spoon.reflect.visitor.filter.CatchVariableScopeFunction; +import spoon.reflect.visitor.filter.FieldScopeFunction; +import spoon.reflect.visitor.filter.LocalVariableReferenceFunction; +import spoon.reflect.visitor.filter.LocalVariableScopeFunction; +import spoon.reflect.visitor.filter.NamedElementFilter; +import spoon.reflect.visitor.filter.ParameterReferenceFunction; +import spoon.reflect.visitor.filter.ParameterScopeFunction; +import spoon.reflect.visitor.filter.PotentialVariableDeclarationFunction; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.reflect.visitor.filter.VariableReferenceFunction; +import spoon.reflect.visitor.filter.VariableScopeFunction; +import spoon.test.query_function.testclasses.VariableReferencesFromStaticMethod; +import spoon.test.query_function.testclasses.VariableReferencesModelTest; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +public class VariableReferencesTest { + CtClass modelClass; + + @BeforeEach + public void setup() { + final Launcher launcher = new Launcher(); + launcher.setArgs(new String[] {"--output-type", "nooutput","--level","info" }); + launcher.getEnvironment().setCommentEnabled(true); + launcher.addInputResource("./src/test/java/spoon/test/query_function/testclasses/VariableReferencesModelTest.java"); + launcher.run(); + Factory factory = launcher.getFactory(); + modelClass = factory.Class().get(VariableReferencesModelTest.class); + } + + @Test + public void testCheckModelConsistency() { + //1) search for all variable declarations with name isTestFieldName(name)==true + //2) check that each of them is using different identification value + class Context { + Map unique = new HashMap<>(); + int maxKey = 0; + void checkKey(int key, CtElement ele) { + CtElement ambiguous = unique.put(key, ele); + if(ambiguous!=null) { + fail("Two variables [" + ambiguous.toString() + " in " + getParentMethodName(ambiguous) + "," + ele.toString() + " in " + getParentMethodName(ele) + "] has same value"); + } + maxKey = Math.max(maxKey, key); + } + } + Context context = new Context(); + + modelClass.filterChildren((CtElement e)->{ + if (e instanceof CtVariable) { + CtVariable var = (CtVariable) e; + if(isTestFieldName(var.getSimpleName())==false) { + return false; + } + //check only these variables whose name is isTestFieldName(name)==true + Integer val = getLiteralValue(var); + context.checkKey(val, var); + } + return false; + }).list(); + assertFalse(context.unique.isEmpty()); + assertEquals(context.maxKey, context.unique.size(), "Only these keys were found: " + context.unique.keySet()); + assertEquals((int) getLiteralValue((CtVariable) modelClass.filterChildren(new NamedElementFilter<>(CtVariable.class, "maxValue")).first()), context.maxKey, "AllLocalVars#maxValue must be equal to maximum value number "); + } + + @Test + public void testCatchVariableReferenceFunction() { + //visits all the CtCatchVariable elements whose name is isTestFieldName(name)==true and search for all their references + //The test detects whether found references are correct by these two checks: + //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) + //2) the model is searched for all variable references which has same identification number and counts them + //Then it checks that counted number of references and found number of references is same + modelClass.filterChildren((CtCatchVariable var)->{ + if(isTestFieldName(var.getSimpleName())) { + int value = getLiteralValue(var); + checkVariableAccess(var, value, new CatchVariableReferenceFunction()); + } + return false; + }).list(); + } + + @Test + public void testLocalVariableReferenceFunction() { + //visits all the CtLocalVariable elements whose name is isTestFieldName(name)==true and search for all their references + //The test detects whether found references are correct by these two checks: + //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) + //2) the model is searched for all variable references which has same identification number and counts them + //Then it checks that counted number of references and found number of references is same + modelClass.filterChildren((CtLocalVariable var)->{ + if(isTestFieldName(var.getSimpleName())) { + int value = getLiteralValue(var); + checkVariableAccess(var, value, new LocalVariableReferenceFunction()); + } + return false; + }).list(); + } + + @Test + public void testParameterReferenceFunction() { + //visits all the CtParameter elements whose name is isTestFieldName(name)==true and search for all their references + //The test detects whether found references are correct by these two checks: + //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) + //2) the model is searched for all variable references which has same identification number and counts them + //Then it checks that counted number of references and found number of references is same + modelClass.filterChildren((CtParameter var)->{ + if(isTestFieldName(var.getSimpleName())) { + int value = getLiteralValue(var); + checkVariableAccess(var, value, new ParameterReferenceFunction()); + } + return false; + }).list(); + } + + @Test + public void testVariableReferenceFunction() { + //visits all the CtVariable elements whose name is isTestFieldName(name)==true and search for all their references + //The test detects whether found references are correct by these two checks: + //1) the each found reference is on the left side of binary operator and on the right side there is unique reference identification number. Like: (field == 7) + //2) the model is searched for all variable references which has same identification number and counts them + //Then it checks that counted number of references and found number of references is same + modelClass.filterChildren((CtVariable var)->{ + if(isTestFieldName(var.getSimpleName())) { + int value = getLiteralValue(var); + checkVariableAccess(var, value, new VariableReferenceFunction()); + } + return false; + }).list(); + } + + private boolean isTestFieldName(String name) { + return "field".equals(name); + } + + @Test + public void testVariableScopeFunction() { + //visits all the CtVariable elements whose name is "field" and search for all elements in their scopes + //Comparing with the result found by basic functions + List list = modelClass.filterChildren((CtVariable var)->{ + if("field".equals(var.getSimpleName())) { + if(var instanceof CtField) { + //field scope is not supported + return false; + } + CtElement[] real = var.map(new VariableScopeFunction()).list().toArray(new CtElement[0]); + if(var instanceof CtLocalVariable) { + assertArrayEquals(var.map(new LocalVariableScopeFunction()).list().toArray(new CtElement[0]), real); + } else if(var instanceof CtParameter) { + assertArrayEquals(var.map(new ParameterScopeFunction()).list().toArray(new CtElement[0]), real); + } else if(var instanceof CtCatchVariable) { + assertArrayEquals(var.map(new CatchVariableScopeFunction()).list().toArray(new CtElement[0]), real); + } else { + fail("Unexpected variable of type "+var.getClass().getName()); + } + return true; + } + return false; + }).list(); + assertFalse(list.isEmpty()); + } + + @Test + public void testFieldScopeFunction() { + // contract: FieldScopeFunction matches the right elements + CtElement[] real0 = modelClass.getFields().get(0).map(new FieldScopeFunction()).list().toArray(new CtElement[0]); + assertTrue(real0.length > 0); + CtElement[] real1 = modelClass.getFields().get(1).map(new FieldScopeFunction()).list().toArray(new CtElement[0]); + assertTrue(real1.length > 0); + } + @Test + public void testLocalVariableReferenceDeclarationFunction() { + modelClass.filterChildren((CtLocalVariableReference varRef)->{ + if(isTestFieldName(varRef.getSimpleName())) { + CtLocalVariable var = varRef.getDeclaration(); + assertNotNull(var, "The declaration of variable " + varRef.getSimpleName() + " in " + getParentMethodName(varRef) + " on line " + var.getPosition().getLine() + " with value " + getVariableReferenceValue(varRef) + " was not found"); + assertEquals(getVariableReferenceValue(varRef), (int) getLiteralValue(var), "CtLocalVariableReference#getDeclaration returned wrong declaration in " + getParentMethodName(varRef)); + } + return false; + }).list(); + } + + private void checkVariableAccess(CtVariable var, int value, CtConsumableFunction query) { + class Context { + int realCount = 0; + int expectedCount = 0; + Set unique = new HashSet<>(); + } + try { + Context context = new Context(); + //use provided reference returning function to found all occurrences of the variable + var.map(query).forEach((CtVariableReference fr)->{ + //check that all the found field references has expected right hand expression + assertEquals(value, getVariableReferenceValue(fr)); + //count number of found references + context.realCount++; + }); + //use filterChildren to scan all field references in model and count the number of field references which has same value => expectedCount + modelClass.filterChildren(new TypeFilter<>(CtVariableReference.class)) + .forEach((CtVariableReference varRef)->{ + if(isTestFieldName(varRef.getSimpleName())==false) { + return; + } + int refValue = getVariableReferenceValue(varRef); + if(refValue<0) { + fail("Variable reference has no value:\n"+varRef); + } + if(refValue==value) { + context.expectedCount++; + } + }); + //check that both scans found same number of references + assertEquals(context.expectedCount, context.realCount, "Number of references to field=" + value + " does not match"); + + } catch (Throwable e) { + e.printStackTrace(); + throw new AssertionError("Test failed on " + getParentMethodName(var), e); + } + } + + private String getParentMethodName(CtElement ele) { + CtMethod parentMethod = ele.getParent(CtMethod.class); + CtMethod m; + while(parentMethod!=null && (m=parentMethod.getParent(CtMethod.class))!=null) { + parentMethod = m; + } + if(parentMethod!=null) { + return parentMethod.getParent(CtType.class).getSimpleName()+"#"+parentMethod.getSimpleName(); + } else { + return ele.getParent(CtType.class).getSimpleName()+"#annonymous block"; + } + } + + private int getVariableReferenceValue(CtVariableReference fr) { + CtBinaryOperator binOp = fr.getParent(CtBinaryOperator.class); + if(binOp==null) { + return getCommentValue(fr); + } + return getLiteralValue(binOp.getRightHandOperand()); + } + + private Integer getLiteralValue(CtVariable var) { + CtExpression exp = var.getDefaultExpression(); + if(exp!=null) { + try { + return getLiteralValue(exp); + } catch (ClassCastException e) { + + } + } + if (var instanceof CtParameter) { + CtParameter param = (CtParameter) var; + CtExecutable l_exec = param.getParent(CtExecutable.class); + int l_argIdx = l_exec.getParameters().indexOf(param); + assertTrue(l_argIdx>=0); + if (l_exec instanceof CtLambda) { + CtLambda lambda = (CtLambda) l_exec; + CtLocalVariable lamVar = (CtLocalVariable)lambda.getParent(); + CtLocalVariableReference lamVarRef = lamVar.getParent().filterChildren((CtLocalVariableReference ref)->ref.getSimpleName().equals(lamVar.getSimpleName())).first(); + CtAbstractInvocation inv = lamVarRef.getParent(CtAbstractInvocation.class); + return getLiteralValue((CtExpression)inv.getArguments().get(l_argIdx)); + } else { + CtExecutableReference l_execRef = l_exec.getReference(); + List> list = l_exec.getFactory().Package().getRootPackage().filterChildren((CtAbstractInvocation inv)->{ + return inv.getExecutable().getExecutableDeclaration()==l_exec; + }).list(); + CtAbstractInvocation inv = list.get(0); + Integer firstValue = getLiteralValue((CtExpression)inv.getArguments().get(l_argIdx)); + //check that all found method invocations are using same key + list.forEach(inv2->{ + assertEquals(firstValue, getLiteralValue(inv2.getArguments().get(l_argIdx))); + }); + return firstValue; + } + } + return getCommentValue(var); + } + + private int getCommentValue(CtElement e) { + while(true) { + if(e==null) { + return -1; + } + if(e.getComments().isEmpty()==false) { + break; + } + e = e.getParent(); + } + if(e.getComments().size()==1) { + String l_c = e.getComments().get(0).getContent(); + return Integer.parseInt(l_c); + } + return -1; + } + + private Integer getLiteralValue(CtExpression exp) { + return ((CtLiteral) exp).getValue(); + } + + private SourcePosition getPosition(CtElement e) { + SourcePosition sp = e.getPosition(); + while(sp instanceof NoSourcePosition) { + e = e.getParent(); + if(e==null) { + break; + } + sp = e.getPosition(); + } + return sp; + } + + @Test + public void testPotentialVariableAccessFromStaticMethod() throws Exception { + Factory factory = ModelUtils.build(VariableReferencesFromStaticMethod.class); + CtClass clazz = factory.Class().get(VariableReferencesFromStaticMethod.class); + CtMethod staticMethod = clazz.getMethodsByName("staticMethod").get(0); + CtStatement stmt = staticMethod.getBody().getStatements().get(1); + assertEquals("org.junit.jupiter.api.Assertions.assertTrue(field == 2)", stmt.toString()); + CtLocalVariableReference varRef = stmt.filterChildren(new TypeFilter<>(CtLocalVariableReference.class)).first(); + List vars = varRef.map(new PotentialVariableDeclarationFunction()).list(); + assertEquals(1, vars.size(), "Found unexpected variable declaration."); + } +} diff --git a/src/test/java/spoon/test/receiverparameter/ReceiverParameterTest.java b/src/test/java/spoon/test/receiverparameter/ReceiverParameterTest.java index b9b767ce0b2..709f60f21bb 100644 --- a/src/test/java/spoon/test/receiverparameter/ReceiverParameterTest.java +++ b/src/test/java/spoon/test/receiverparameter/ReceiverParameterTest.java @@ -1,7 +1,6 @@ package spoon.test.receiverparameter; import java.util.List; - import spoon.reflect.CtModel; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtElement; diff --git a/src/test/java/spoon/test/record/CtRecordTest.java b/src/test/java/spoon/test/record/CtRecordTest.java index 7a1ac7c4af7..d3dfe4d5daf 100644 --- a/src/test/java/spoon/test/record/CtRecordTest.java +++ b/src/test/java/spoon/test/record/CtRecordTest.java @@ -1,13 +1,5 @@ package spoon.test.record; -import static java.lang.System.lineSeparator; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static spoon.testing.assertions.SpoonAssertions.assertThat; -import static org.assertj.core.api.Assertions.assertThat; - import java.util.Arrays; import java.util.Collection; import java.util.Comparator; @@ -15,7 +7,6 @@ import java.util.Set; import java.util.stream.Collectors; import javax.validation.constraints.NotNull; - import org.assertj.core.api.InstanceOfAssertFactory; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -37,6 +28,15 @@ import spoon.testing.assertions.SpoonAssertions; import spoon.testing.utils.ModelTest; +import static java.lang.System.lineSeparator; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.assertions.SpoonAssertions.assertThat; + public class CtRecordTest { @Test @@ -108,11 +108,11 @@ protected void enter(CtElement e) { assertEquals( Arrays.asList( "int first() {\n" + - " return this.first;\n" + - "}", + " return this.first;\n" + + "}", "float second() {\n" + - " return this.second;\n" + - "}" + " return this.second;\n" + + "}" ), head(records).getMethods().stream() .map(String::valueOf) diff --git a/src/test/java/spoon/test/refactoring/CtRenameLocalVariableRefactoringTest.java b/src/test/java/spoon/test/refactoring/CtRenameLocalVariableRefactoringTest.java index 71ae536745e..7cbaba5d136 100644 --- a/src/test/java/spoon/test/refactoring/CtRenameLocalVariableRefactoringTest.java +++ b/src/test/java/spoon/test/refactoring/CtRenameLocalVariableRefactoringTest.java @@ -1,278 +1,277 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.refactoring; - -import org.junit.jupiter.api.Test; -import spoon.Launcher; -import spoon.OutputType; -import spoon.SpoonException; -import spoon.SpoonModelBuilder; -import spoon.compiler.SpoonResourceHelper; -import spoon.refactoring.CtRenameLocalVariableRefactoring; -import spoon.reflect.code.CtLocalVariable; -import spoon.reflect.declaration.CtAnnotation; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtVariable; -import spoon.reflect.factory.Factory; -import spoon.reflect.reference.CtTypeReference; -import spoon.test.refactoring.testclasses.CtRenameLocalVariableRefactoringTestSubject; -import spoon.test.refactoring.testclasses.TestTryRename; -import spoon.testing.utils.ModelUtils; - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -public class CtRenameLocalVariableRefactoringTest -{ - @Test - public void testModelConsistency() throws Throwable { - //contract: check that all assertions in all methods of the RenameLocalVariableRefactorTestSubject are correct - new CtRenameLocalVariableRefactoringTestSubject().checkModelConsistency(); - } - - /*"nestedClassMethodWithoutRefs", "var3", "var1"*/ - /** - * If you need to debug behavior of refactoring on the exact method and variable in the {@link CtRenameLocalVariableRefactoringTestSubject} model, - * then provide - * 1) name of method of {@link CtRenameLocalVariableRefactoringTestSubject} - * 2) original name variable in the method - * 3) new name of variable in the method - * then put breakpoint on the line `this.getClass();` below and the debugger stops just before - * the to be inspected refactoring starts - */ - private String[] DEBUG = {/*"nestedClassMethodWithoutRefs", "var3", "var1"*/}; - - /** - * The {@link CtRenameLocalVariableRefactoringTestSubject} class is loaded as spoon model. Then: - * - It looks for each CtVariable and it's CtAnnotation and tries to rename that variable to the name defined by annotation. - * - If the annotation name is prefixed with "-", then that refactoring should fail. - * - If the annotation name is not prefixed, then that refactoring should pass. - * If it behaves different then expected, then this test fails - */ - @Test - public void testRenameAllLocalVariablesOfRenameTestSubject() throws Exception { - final Launcher launcher = new Launcher(); - final SpoonModelBuilder comp = launcher.createCompiler(); - comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/" + CtRenameLocalVariableRefactoringTestSubject.class.getName().replace('.', '/') + ".java")); - comp.build(); - final Factory factory = comp.getFactory(); - - CtClass varRenameClass = (CtClass)factory.Type().get(CtRenameLocalVariableRefactoringTestSubject.class); - CtTypeReference tryRename = varRenameClass.getFactory().createCtTypeReference(TestTryRename.class); - - varRenameClass.getMethods().forEach(method->{ - //debugging support - if(DEBUG.length==3 && DEBUG[0].equals(method.getSimpleName())==false) { - return; - } - method.filterChildren((CtVariable var)->true) - .map((CtVariable var)->var.getAnnotation(tryRename)) - .forEach((CtAnnotation annotation)->{ - String[] newNames = annotation.getActualAnnotation().value(); - CtVariable targetVariable = (CtVariable)annotation.getAnnotatedElement(); - for (String newName : newNames) { - boolean renameShouldPass = newName.startsWith("-")==false; - if (!renameShouldPass) { - newName = newName.substring(1); - } - if (targetVariable instanceof CtLocalVariable) { - //debugging support - if(DEBUG.length==3 && DEBUG[1].equals(targetVariable.getSimpleName()) && DEBUG[2].equals(newName)) { - //put breakpoint here and continue debugging of the buggy case - this.getClass(); - } - checkLocalVariableRename(launcher, (CtLocalVariable) targetVariable, newName, renameShouldPass); - } else { - //TODO test rename of other variables, e.g. parameters and catch... later - } - } - }); - }); - } - - private void checkLocalVariableRename(Launcher launcher, CtLocalVariable targetVariable, String newName, boolean renameShouldPass) { - - String originName = targetVariable.getSimpleName(); - CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); - refactor.setTarget(targetVariable); - refactor.setNewName(newName); - if(renameShouldPass) { - try { - refactor.refactor(); - } catch(SpoonException e) { - throw new AssertionError(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" should NOT fail when trying rename to \""+newName+"\"\n"+targetVariable.toString(), e); - } - assertEquals(newName, targetVariable.getSimpleName(), getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\" passed, but the name of variable was not changed"); - assertCorrectModel(launcher, getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\""); - } else { - try { - refactor.refactor(); - fail(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" should fail when trying rename to \""+newName+"\""); - } catch(SpoonException e) { - } - assertEquals(originName, targetVariable.getSimpleName(), getParentMethodName(targetVariable)+" Rename of \""+originName+"\" failed when trying rename to \""+newName+"\" but the name of variable should not be changed"); - } - if(renameShouldPass) { - rollback(targetVariable, originName); - } - assertEquals(originName, targetVariable.getSimpleName()); - } - - private void rollback(CtLocalVariable targetVariable, String originName) { - String newName = targetVariable.getSimpleName(); - CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); - refactor.setTarget(targetVariable); - //rollback changes - refactor.setNewName(originName); - try { - refactor.refactor(); - } catch(SpoonException e) { - throw new AssertionError(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\" passed, but rename back to \""+originName+"\" failed", e); - } - } - - private void assertCorrectModel(Launcher launcher, String refactoringDescription) { - File outputBinDirectory = new File("./target/spooned-refactoring-test"); - if (!outputBinDirectory.exists()) { - outputBinDirectory.mkdirs(); - } - launcher.setBinaryOutputDirectory(outputBinDirectory); - launcher.setSourceOutputDirectory(outputBinDirectory); - -// 1) print modified model, - try { - launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); - } catch (Throwable e) { - new AssertionError("The printing of java sources failed after: "+refactoringDescription, e); - } - -// 2) build it - try { - launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.CTTYPES); - } catch (Throwable e) { - new AssertionError("The compilation of java sources in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e); - } -// 3) create instance using that new model and test consistency - try (TestClassloader classLoader = new TestClassloader(launcher)) { - Class testModelClass = classLoader.loadClass(CtRenameLocalVariableRefactoringTestSubject.class.getName()); - testModelClass.getMethod("checkModelConsistency").invoke(testModelClass.newInstance()); - } catch (InvocationTargetException e) { - throw new AssertionError("The model validation of code in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e.getTargetException()); - } catch (Throwable e) { - throw new AssertionError("The model validation of code in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e); - } - } - - private class TestClassloader extends URLClassLoader { - TestClassloader(Launcher launcher) throws MalformedURLException { - super(new URL[] { new File(launcher.getEnvironment().getBinaryOutputDirectory()).toURL()}, CtRenameLocalVariableRefactoringTest.class.getClassLoader()); - } - - @Override - public Class loadClass(String s) throws ClassNotFoundException { - try { - return findClass(s); - } catch (Exception e) { - return super.loadClass(s); - } - } - } - - - private String getParentMethodName(CtElement ele) { - CtMethod parentMethod = ele.getParent(CtMethod.class); - CtMethod m; - while(parentMethod!=null && (m=parentMethod.getParent(CtMethod.class))!=null) { - parentMethod = m; - } - if(parentMethod!=null) { - return parentMethod.getParent(CtType.class).getSimpleName()+"#"+parentMethod.getSimpleName(); - } else { - return ele.getParent(CtType.class).getSimpleName()+"#annonymous block"; - } - } - - - @Test - public void testRefactorWrongUsage() throws Exception { - CtType varRenameClass = ModelUtils.buildClass(CtRenameLocalVariableRefactoringTestSubject.class); - CtLocalVariable local1Var = varRenameClass.filterChildren((CtLocalVariable var)-> "local1".equals(var.getSimpleName())).first(); - - //contract: a target variable is not defined. Throw SpoonException - CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); - refactor.setNewName("local1"); - try { - refactor.refactor(); - fail(); - } catch(SpoonException e) { - //should fail - OK - } - //contract: invalid rename request to empty string. Throw SpoonException - refactor.setTarget(local1Var); - try { - refactor.setNewName(""); - fail(); - } catch(SpoonException e) { - //should fail - OK - } - - //contract: invalid rename request to variable name which contains space. Throw SpoonException - try { - refactor.setNewName("x "); - fail(); - } catch(SpoonException e) { - //should fail - OK - } - - //contract: invalid rename request to variable name which contains space. Throw SpoonException - try { - refactor.setNewName("x y"); - fail(); - } catch(SpoonException e) { - //should fail - OK - } - - //contract: invalid rename request to variable name which contains character which is not allowed in variable name. Throw SpoonException - try { - refactor.setNewName("x("); - fail(); - } catch(SpoonException e) { - //should fail - OK - } - } - - @Test - public void testRenameLocalVariableToSameName() throws Exception { - CtType varRenameClass = ModelUtils.buildClass(CtRenameLocalVariableRefactoringTestSubject.class); - CtLocalVariable local1Var = varRenameClass.filterChildren((CtLocalVariable var)-> "local1".equals(var.getSimpleName())).first(); - - CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); - refactor.setTarget(local1Var); - refactor.setNewName("local1"); - refactor.refactor(); - assertEquals("local1", local1Var.getSimpleName()); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.refactoring; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.OutputType; +import spoon.SpoonException; +import spoon.SpoonModelBuilder; +import spoon.compiler.SpoonResourceHelper; +import spoon.refactoring.CtRenameLocalVariableRefactoring; +import spoon.reflect.code.CtLocalVariable; +import spoon.reflect.declaration.CtAnnotation; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtVariable; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtTypeReference; +import spoon.test.refactoring.testclasses.CtRenameLocalVariableRefactoringTestSubject; +import spoon.test.refactoring.testclasses.TestTryRename; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class CtRenameLocalVariableRefactoringTest +{ + @Test + public void testModelConsistency() throws Throwable { + //contract: check that all assertions in all methods of the RenameLocalVariableRefactorTestSubject are correct + new CtRenameLocalVariableRefactoringTestSubject().checkModelConsistency(); + } + + /*"nestedClassMethodWithoutRefs", "var3", "var1"*/ + /** + * If you need to debug behavior of refactoring on the exact method and variable in the {@link CtRenameLocalVariableRefactoringTestSubject} model, + * then provide + * 1) name of method of {@link CtRenameLocalVariableRefactoringTestSubject} + * 2) original name variable in the method + * 3) new name of variable in the method + * then put breakpoint on the line `this.getClass();` below and the debugger stops just before + * the to be inspected refactoring starts + */ + private String[] DEBUG = {/*"nestedClassMethodWithoutRefs", "var3", "var1"*/}; + + /** + * The {@link CtRenameLocalVariableRefactoringTestSubject} class is loaded as spoon model. Then: + * - It looks for each CtVariable and it's CtAnnotation and tries to rename that variable to the name defined by annotation. + * - If the annotation name is prefixed with "-", then that refactoring should fail. + * - If the annotation name is not prefixed, then that refactoring should pass. + * If it behaves different then expected, then this test fails + */ + @Test + public void testRenameAllLocalVariablesOfRenameTestSubject() throws Exception { + final Launcher launcher = new Launcher(); + final SpoonModelBuilder comp = launcher.createCompiler(); + comp.addInputSources(SpoonResourceHelper.resources("./src/test/java/" + CtRenameLocalVariableRefactoringTestSubject.class.getName().replace('.', '/') + ".java")); + comp.build(); + final Factory factory = comp.getFactory(); + + CtClass varRenameClass = (CtClass)factory.Type().get(CtRenameLocalVariableRefactoringTestSubject.class); + CtTypeReference tryRename = varRenameClass.getFactory().createCtTypeReference(TestTryRename.class); + + varRenameClass.getMethods().forEach(method->{ + //debugging support + if(DEBUG.length==3 && DEBUG[0].equals(method.getSimpleName())==false) { + return; + } + method.filterChildren((CtVariable var)->true) + .map((CtVariable var)->var.getAnnotation(tryRename)) + .forEach((CtAnnotation annotation)->{ + String[] newNames = annotation.getActualAnnotation().value(); + CtVariable targetVariable = (CtVariable)annotation.getAnnotatedElement(); + for (String newName : newNames) { + boolean renameShouldPass = newName.startsWith("-")==false; + if (!renameShouldPass) { + newName = newName.substring(1); + } + if (targetVariable instanceof CtLocalVariable) { + //debugging support + if(DEBUG.length==3 && DEBUG[1].equals(targetVariable.getSimpleName()) && DEBUG[2].equals(newName)) { + //put breakpoint here and continue debugging of the buggy case + this.getClass(); + } + checkLocalVariableRename(launcher, (CtLocalVariable) targetVariable, newName, renameShouldPass); + } else { + //TODO test rename of other variables, e.g. parameters and catch... later + } + } + }); + }); + } + + private void checkLocalVariableRename(Launcher launcher, CtLocalVariable targetVariable, String newName, boolean renameShouldPass) { + + String originName = targetVariable.getSimpleName(); + CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); + refactor.setTarget(targetVariable); + refactor.setNewName(newName); + if(renameShouldPass) { + try { + refactor.refactor(); + } catch(SpoonException e) { + throw new AssertionError(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" should NOT fail when trying rename to \""+newName+"\"\n"+targetVariable.toString(), e); + } + assertEquals(newName, targetVariable.getSimpleName(), getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\" passed, but the name of variable was not changed"); + assertCorrectModel(launcher, getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\""); + } else { + try { + refactor.refactor(); + fail(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" should fail when trying rename to \""+newName+"\""); + } catch(SpoonException e) { + } + assertEquals(originName, targetVariable.getSimpleName(), getParentMethodName(targetVariable)+" Rename of \""+originName+"\" failed when trying rename to \""+newName+"\" but the name of variable should not be changed"); + } + if(renameShouldPass) { + rollback(targetVariable, originName); + } + assertEquals(originName, targetVariable.getSimpleName()); + } + + private void rollback(CtLocalVariable targetVariable, String originName) { + String newName = targetVariable.getSimpleName(); + CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); + refactor.setTarget(targetVariable); + //rollback changes + refactor.setNewName(originName); + try { + refactor.refactor(); + } catch(SpoonException e) { + throw new AssertionError(getParentMethodName(targetVariable)+" Rename of \""+originName+"\" to \""+newName+"\" passed, but rename back to \""+originName+"\" failed", e); + } + } + + private void assertCorrectModel(Launcher launcher, String refactoringDescription) { + File outputBinDirectory = new File("./target/spooned-refactoring-test"); + if (!outputBinDirectory.exists()) { + outputBinDirectory.mkdirs(); + } + launcher.setBinaryOutputDirectory(outputBinDirectory); + launcher.setSourceOutputDirectory(outputBinDirectory); + +// 1) print modified model, + try { + launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); + } catch (Throwable e) { + new AssertionError("The printing of java sources failed after: "+refactoringDescription, e); + } + +// 2) build it + try { + launcher.getModelBuilder().compile(SpoonModelBuilder.InputType.CTTYPES); + } catch (Throwable e) { + new AssertionError("The compilation of java sources in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e); + } +// 3) create instance using that new model and test consistency + try (TestClassloader classLoader = new TestClassloader(launcher)) { + Class testModelClass = classLoader.loadClass(CtRenameLocalVariableRefactoringTestSubject.class.getName()); + testModelClass.getMethod("checkModelConsistency").invoke(testModelClass.newInstance()); + } catch (InvocationTargetException e) { + throw new AssertionError("The model validation of code in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e.getTargetException()); + } catch (Throwable e) { + throw new AssertionError("The model validation of code in "+launcher.getEnvironment().getBinaryOutputDirectory()+" failed after: "+refactoringDescription, e); + } + } + + private class TestClassloader extends URLClassLoader { + TestClassloader(Launcher launcher) throws MalformedURLException { + super(new URL[] { new File(launcher.getEnvironment().getBinaryOutputDirectory()).toURL()}, CtRenameLocalVariableRefactoringTest.class.getClassLoader()); + } + + @Override + public Class loadClass(String s) throws ClassNotFoundException { + try { + return findClass(s); + } catch (Exception e) { + return super.loadClass(s); + } + } + } + + + private String getParentMethodName(CtElement ele) { + CtMethod parentMethod = ele.getParent(CtMethod.class); + CtMethod m; + while(parentMethod!=null && (m=parentMethod.getParent(CtMethod.class))!=null) { + parentMethod = m; + } + if(parentMethod!=null) { + return parentMethod.getParent(CtType.class).getSimpleName()+"#"+parentMethod.getSimpleName(); + } else { + return ele.getParent(CtType.class).getSimpleName()+"#annonymous block"; + } + } + + + @Test + public void testRefactorWrongUsage() throws Exception { + CtType varRenameClass = ModelUtils.buildClass(CtRenameLocalVariableRefactoringTestSubject.class); + CtLocalVariable local1Var = varRenameClass.filterChildren((CtLocalVariable var)-> "local1".equals(var.getSimpleName())).first(); + + //contract: a target variable is not defined. Throw SpoonException + CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); + refactor.setNewName("local1"); + try { + refactor.refactor(); + fail(); + } catch(SpoonException e) { + //should fail - OK + } + //contract: invalid rename request to empty string. Throw SpoonException + refactor.setTarget(local1Var); + try { + refactor.setNewName(""); + fail(); + } catch(SpoonException e) { + //should fail - OK + } + + //contract: invalid rename request to variable name which contains space. Throw SpoonException + try { + refactor.setNewName("x "); + fail(); + } catch(SpoonException e) { + //should fail - OK + } + + //contract: invalid rename request to variable name which contains space. Throw SpoonException + try { + refactor.setNewName("x y"); + fail(); + } catch(SpoonException e) { + //should fail - OK + } + + //contract: invalid rename request to variable name which contains character which is not allowed in variable name. Throw SpoonException + try { + refactor.setNewName("x("); + fail(); + } catch(SpoonException e) { + //should fail - OK + } + } + + @Test + public void testRenameLocalVariableToSameName() throws Exception { + CtType varRenameClass = ModelUtils.buildClass(CtRenameLocalVariableRefactoringTestSubject.class); + CtLocalVariable local1Var = varRenameClass.filterChildren((CtLocalVariable var)-> "local1".equals(var.getSimpleName())).first(); + + CtRenameLocalVariableRefactoring refactor = new CtRenameLocalVariableRefactoring(); + refactor.setTarget(local1Var); + refactor.setNewName("local1"); + refactor.refactor(); + assertEquals("local1", local1Var.getSimpleName()); + } +} diff --git a/src/test/java/spoon/test/refactoring/MethodsRefactoringTest.java b/src/test/java/spoon/test/refactoring/MethodsRefactoringTest.java index 3171afe8082..33aa7480a60 100644 --- a/src/test/java/spoon/test/refactoring/MethodsRefactoringTest.java +++ b/src/test/java/spoon/test/refactoring/MethodsRefactoringTest.java @@ -1,389 +1,388 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.refactoring; - -import org.junit.jupiter.api.Test; -import spoon.Launcher; -import spoon.OutputType; -import spoon.SpoonModelBuilder; -import spoon.compiler.SpoonResourceHelper; -import spoon.refactoring.CtParameterRemoveRefactoring; -import spoon.refactoring.RefactoringException; -import spoon.reflect.code.CtLambda; -import spoon.reflect.code.CtStatement; -import spoon.reflect.declaration.CtConstructor; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtExecutable; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtType; -import spoon.reflect.factory.Factory; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.visitor.filter.AllMethodsSameSignatureFunction; -import spoon.reflect.visitor.filter.ExecutableReferenceFilter; -import spoon.reflect.visitor.filter.SubInheritanceHierarchyFunction; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.test.refactoring.parameter.testclasses.IFaceB; -import spoon.test.refactoring.parameter.testclasses.IFaceK; -import spoon.test.refactoring.parameter.testclasses.IFaceL; -import spoon.test.refactoring.parameter.testclasses.TestHierarchy; -import spoon.test.refactoring.parameter.testclasses.TypeA; -import spoon.test.refactoring.parameter.testclasses.TypeB; -import spoon.test.refactoring.parameter.testclasses.TypeC; -import spoon.test.refactoring.parameter.testclasses.TypeR; -import spoon.testing.utils.ModelUtils; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNotSame; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -public class MethodsRefactoringTest { - - @Test - public void testSubInheritanceHierarchyFunction() { - Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); - - List allSubtypes = factory.Class().get(TypeA.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - checkContainsOnly(allSubtypes, - "spoon.test.refactoring.parameter.testclasses.TypeB", - "spoon.test.refactoring.parameter.testclasses.TypeB$1", - "spoon.test.refactoring.parameter.testclasses.TypeC"); - - allSubtypes = factory.Class().get(TypeB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - checkContainsOnly(allSubtypes, - "spoon.test.refactoring.parameter.testclasses.TypeB$1", - "spoon.test.refactoring.parameter.testclasses.TypeC"); - - allSubtypes = factory.Class().get(TypeC.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - assertEquals(0, allSubtypes.size()); - - allSubtypes = factory.Interface().get(IFaceB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - checkContainsOnly(allSubtypes, - "spoon.test.refactoring.parameter.testclasses.TypeB", - "spoon.test.refactoring.parameter.testclasses.TypeB$1", - "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", - "spoon.test.refactoring.parameter.testclasses.TypeB$2", - "spoon.test.refactoring.parameter.testclasses.TypeC", - "spoon.test.refactoring.parameter.testclasses.IFaceL", - "spoon.test.refactoring.parameter.testclasses.TypeL", - "spoon.test.refactoring.parameter.testclasses.TypeM" - ); - - allSubtypes = factory.Interface().get(IFaceL.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - checkContainsOnly(allSubtypes, - "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", - "spoon.test.refactoring.parameter.testclasses.TypeL", - "spoon.test.refactoring.parameter.testclasses.TypeM" - ); - - allSubtypes = factory.Interface().get(IFaceK.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); - checkContainsOnly(allSubtypes, - "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", - "spoon.test.refactoring.parameter.testclasses.TypeL", - "spoon.test.refactoring.parameter.testclasses.TypeM", - "spoon.test.refactoring.parameter.testclasses.TypeK", - "spoon.test.refactoring.parameter.testclasses.TypeR", - "spoon.test.refactoring.parameter.testclasses.TypeS" - ); - } - - private void checkContainsOnly(List foundNames, String... expectedNames) { - for (String name : expectedNames) { - assertTrue(foundNames.remove(name), "The "+name+" not found"); - } - assertTrue(foundNames.isEmpty(), "Unexpected names found: "+foundNames); - } - - @Test - public void testAllMethodsSameSignatureFunction() { - Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); - - //each executable in test classes is marked with a annotation TestHierarchy, - //which defines the name of the hierarchy where this executable belongs to. - - //collect all executables which are marked that they belong to hierarchy A_method1 - List> executablesOfHierarchyA = getExecutablesOfHierarchy(factory, "A_method1"); - //check executables of this hierarchy - checkMethodHierarchies(executablesOfHierarchyA); - - //collect all executables which are marked that they belong to hierarchy R_method1 - List> executablesOfHierarchyR = getExecutablesOfHierarchy(factory, "R_method1"); - //check executables of this hierarchy - checkMethodHierarchies(executablesOfHierarchyR); - - //contract: CtConstructor has no other same signature - CtConstructor constructorTypeA = factory.Class().get(TypeA.class).getConstructors().iterator().next(); - CtExecutable exec = constructorTypeA.map(new AllMethodsSameSignatureFunction()).first(); - assertNull(exec, "Unexpected executable found by Constructor of TypeA "+exec); - CtConstructor constructorTypeB = factory.Class().get(TypeB.class).getConstructors().iterator().next(); - exec = constructorTypeA.map(new AllMethodsSameSignatureFunction()).first(); - assertNull(exec, "Unexpected executable found by Constructor of TypeA "+exec); - //contract: constructor is returned if includingSelf == true - assertSame(constructorTypeA, constructorTypeA.map(new AllMethodsSameSignatureFunction().includingSelf(true)).first()); - } - - private void checkMethodHierarchies(List> expectedExecutables) { - //contract: check that found methods does not depend on the starting point. - //The same set of executables has to be found if we start on any of them - int countOfTestedLambdas = 0; - int countOfTestedMethods = 0; - for (CtExecutable ctExecutable : expectedExecutables) { - if (ctExecutable instanceof CtLambda) { - countOfTestedLambdas++; - } else { - assertTrue(ctExecutable instanceof CtMethod); - countOfTestedMethods++; - } - //start checking of method hierarchy from each expected executable. It must always return same results - checkMethodHierarchy(expectedExecutables, ctExecutable); - } - assertTrue(countOfTestedLambdas>0); - assertTrue(countOfTestedMethods>0); - } - - private void checkMethodHierarchy(List> expectedExecutables, CtExecutable startExecutable) { - //contract: check that by default it does not includes self - //contract: check that by default it returns lambdas - { - final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction()).list(); - assertFalse(containsSame(executables, startExecutable), "Unexpected start executable "+startExecutable); - //check that some method was found - assertFalse(executables.isEmpty()); - //check that expected methods were found and remove them - expectedExecutables.forEach(m->{ - boolean found = removeSame(executables, m); - if(startExecutable==m) { - //it is start method. It should not be there - assertFalse(found, "The signature "+getQSignature(m)+" was returned too"); - } else { - assertTrue(found, "The signature "+getQSignature(m)+" not found"); - } - }); - //check that there is no unexpected executable - assertTrue(executables.isEmpty(), "Unexpected executables: "+executables); - } - - //contract: check that includingSelf(true) returns startMethod too - //contract: check that by default it still returns lambdas - { - final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true)).list(); - assertTrue(containsSame(executables, startExecutable), "Missing start executable "+startExecutable); - //check that some method was found - assertFalse(executables.isEmpty()); - //check that expected methods were found and remove them - expectedExecutables.forEach(m->{ - assertTrue(removeSame(executables, m), "The signature "+getQSignature(m)+" not found"); - }); - //check that there is no unexpected executable - assertTrue(executables.isEmpty(), "Unexpected executables: "+executables); - } - - //contract: check that includingLambdas(false) returns no lambda expressions - { - final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true).includingLambdas(false)).list(); - if (startExecutable instanceof CtLambda) { - //lambda must not be returned even if it is first - assertFalse(containsSame(executables, startExecutable), "Unexpected start executable "+startExecutable); - } else { - assertTrue(containsSame(executables, startExecutable), "Missing start executable "+startExecutable); - } - - //check that some method was found - assertFalse(executables.isEmpty()); - //check that expected methods were found and remove them - expectedExecutables.forEach(m->{ - if(m instanceof CtLambda) { - //the lambdas are not expected. Do not ask for them - return; - } - assertTrue(removeSame(executables, m), "The signature "+getQSignature(m)+" not found"); - }); - //check that there is no unexpected executable or lambda - assertTrue(executables.isEmpty(), "Unexepcted executables "+executables); - } - //contract: check early termination - //contract: check that first returned element is the startExecutable itself if includingSelf == true - CtExecutable exec = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true)).first(); - assertSame(startExecutable, exec); - //contract: check that first returned element is not the startExecutable itself if includingSelf == false, but some other executable from the expected - exec = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(false)).first(); - assertNotSame(startExecutable, exec); - assertTrue(containsSame(expectedExecutables, exec)); - } - - private String getQSignature(CtExecutable e) { - if (e instanceof CtMethod) { - CtMethod m = (CtMethod) e; - return m.getDeclaringType().getQualifiedName()+"#"+m.getSignature(); - } - return e.getShortRepresentation(); - } - - private List> getExecutablesOfHierarchy(Factory factory, String hierarchyName) { - return factory.getModel().filterChildren(new TypeFilter(CtExecutable.class)).select((CtExecutable exec)->{ - //detect if found executable belongs to hierarchy 'hierarchyName' - CtElement ele = exec; - if (exec instanceof CtLambda) { - //lambda is marked by annotation on the first statement of the lambda body. - List stats = exec.getBody().getStatements(); - if(!stats.isEmpty()) { - ele = stats.get(0); - } - } - TestHierarchy th = ele.getAnnotation(TestHierarchy.class); - if (th!=null) { - return Arrays.asList(th.value()).contains(hierarchyName); - } - return false; - }).list(); - } - - @Test - public void testExecutableReferenceFilter() { - Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); - - List> executables = factory.getModel().filterChildren((CtExecutable e)->true).list(); - int nrExecRefsTotal = 0; - //contract check that ExecutableReferenceFilter found CtExecutableReferences of each executable individually - for (CtExecutable executable : executables) { - nrExecRefsTotal += checkExecutableReferenceFilter(factory, Collections.singletonList(executable)); - } - //contract check that ExecutableReferenceFilter found CtExecutableReferences of all executables together - int nrExecRefsTotal2 = checkExecutableReferenceFilter(factory, executables); - - assertSame(nrExecRefsTotal, nrExecRefsTotal2); - - //contract check that it found lambdas too - CtLambda lambda = factory.getModel().filterChildren((CtLambda e)->true).first(); - assertNotNull(lambda); - //this test case is quite wild, because there is normally lambda reference in spoon model. So make one lambda reference here: - CtExecutableReference lambdaRef = lambda.getReference(); - List> refs = lambdaRef.filterChildren(null).select(new ExecutableReferenceFilter(lambda)).list(); - assertEquals(1, refs.size()); - assertSame(lambdaRef, refs.get(0)); - } - - private int checkExecutableReferenceFilter(Factory factory, List> executables) { - assertFalse(executables.isEmpty()); - ExecutableReferenceFilter execRefFilter = new ExecutableReferenceFilter(); - executables.forEach((CtExecutable e)->execRefFilter.addExecutable(e)); - final List> refs = new ArrayList<>(factory.getModel().filterChildren(execRefFilter).list()); - int nrExecRefs = refs.size(); - //use different (slower, but straight forward) algorithm to search for all executable references to check if ExecutableReferenceFilter returns correct results - factory.getModel().filterChildren((CtExecutableReference er)->{ - return containsSame(executables, er.getDeclaration()); - }).forEach((CtExecutableReference er)->{ - //check that each expected reference was found by ExecutableReferenceFilter and remove it from that list - assertTrue(refs.remove(er), "Executable reference: "+er+" not found."); - }); - //check that no other reference was found by ExecutableReferenceFilter - assertSame(0, refs.size()); - return nrExecRefs; - } - - private boolean containsSame(Collection list, Object item) { - for (Object object : list) { - if(object==item) { - return true; - } - } - return false; - } - private boolean removeSame(Collection list, Object item) { - for (Iterator iter = list.iterator(); iter.hasNext();) { - Object object = iter.next(); - if(object==item) { - iter.remove(); - return true; - } - } - return false; - } - - @Test - public void testCtParameterRemoveRefactoring() throws FileNotFoundException { - String testPackagePath = "spoon/test/refactoring/parameter/testclasses"; - final Launcher launcher = new Launcher(); - launcher.getEnvironment().setNoClasspath(true); - SpoonModelBuilder comp = launcher.createCompiler(); - comp.addInputSource(SpoonResourceHelper.createResource(new File("./src/test/java/"+testPackagePath))); - comp.build(); - Factory factory = comp.getFactory(); - - CtType typeA = factory.Class().get(TypeA.class); - - CtMethod methodTypeA_method1 = typeA.getMethodsByName("method1").get(0); - CtParameterRemoveRefactoring refactor = new CtParameterRemoveRefactoring(); - refactor.setTarget(methodTypeA_method1.getParameters().get(0)); - //check that expected methods are targets of refactoring - List> execs = refactor.getTargetExecutables(); - execs.forEach(exec->{ - //check that each to be modified method has one parameter - assertEquals(1, exec.getParameters().size()); - }); - refactor.refactor(); - execs.forEach(exec->{ - //check that each to be modified method has no parameter after refactoring - assertEquals(0, exec.getParameters().size()); - }); - launcher.setSourceOutputDirectory(new File("./target/spooned/")); - launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); - ModelUtils.canBeBuilt("./target/spooned/"+testPackagePath, 8); - } - @Test - public void testCtParameterRemoveRefactoringValidationCheck() throws FileNotFoundException { - String testPackagePath = "spoon/test/refactoring/parameter/testclasses"; - final Launcher launcher = new Launcher(); - launcher.getEnvironment().setNoClasspath(true); - SpoonModelBuilder comp = launcher.createCompiler(); - comp.addInputSource(SpoonResourceHelper.createResource(new File("./src/test/java/"+testPackagePath))); - comp.build(); - Factory factory = comp.getFactory(); - - CtType typeR = factory.Class().get(TypeR.class); - - CtMethod methodTypeR_method1 = typeR.getMethodsByName("method1").get(0); - CtParameterRemoveRefactoring refactor = new CtParameterRemoveRefactoring().setTarget(methodTypeR_method1.getParameters().get(0)); - refactor.setTarget(methodTypeR_method1.getParameters().get(0)); - //check that each to be refactored method has one parameter - List> execs = refactor.getTargetExecutables(); - execs.forEach(exec->{ - //check that each to be modified method has one parameter - assertEquals(1, exec.getParameters().size()); - }); - //try refactor - try { - refactor.refactor(); - fail(); - } catch (RefactoringException e) { - this.getClass(); - } - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.refactoring; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.OutputType; +import spoon.SpoonModelBuilder; +import spoon.compiler.SpoonResourceHelper; +import spoon.refactoring.CtParameterRemoveRefactoring; +import spoon.refactoring.RefactoringException; +import spoon.reflect.code.CtLambda; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtConstructor; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtExecutable; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; +import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.visitor.filter.AllMethodsSameSignatureFunction; +import spoon.reflect.visitor.filter.ExecutableReferenceFilter; +import spoon.reflect.visitor.filter.SubInheritanceHierarchyFunction; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.test.refactoring.parameter.testclasses.IFaceB; +import spoon.test.refactoring.parameter.testclasses.IFaceK; +import spoon.test.refactoring.parameter.testclasses.IFaceL; +import spoon.test.refactoring.parameter.testclasses.TestHierarchy; +import spoon.test.refactoring.parameter.testclasses.TypeA; +import spoon.test.refactoring.parameter.testclasses.TypeB; +import spoon.test.refactoring.parameter.testclasses.TypeC; +import spoon.test.refactoring.parameter.testclasses.TypeR; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +public class MethodsRefactoringTest { + + @Test + public void testSubInheritanceHierarchyFunction() { + Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); + + List allSubtypes = factory.Class().get(TypeA.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + checkContainsOnly(allSubtypes, + "spoon.test.refactoring.parameter.testclasses.TypeB", + "spoon.test.refactoring.parameter.testclasses.TypeB$1", + "spoon.test.refactoring.parameter.testclasses.TypeC"); + + allSubtypes = factory.Class().get(TypeB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + checkContainsOnly(allSubtypes, + "spoon.test.refactoring.parameter.testclasses.TypeB$1", + "spoon.test.refactoring.parameter.testclasses.TypeC"); + + allSubtypes = factory.Class().get(TypeC.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + assertEquals(0, allSubtypes.size()); + + allSubtypes = factory.Interface().get(IFaceB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + checkContainsOnly(allSubtypes, + "spoon.test.refactoring.parameter.testclasses.TypeB", + "spoon.test.refactoring.parameter.testclasses.TypeB$1", + "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", + "spoon.test.refactoring.parameter.testclasses.TypeB$2", + "spoon.test.refactoring.parameter.testclasses.TypeC", + "spoon.test.refactoring.parameter.testclasses.IFaceL", + "spoon.test.refactoring.parameter.testclasses.TypeL", + "spoon.test.refactoring.parameter.testclasses.TypeM" + ); + + allSubtypes = factory.Interface().get(IFaceL.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + checkContainsOnly(allSubtypes, + "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", + "spoon.test.refactoring.parameter.testclasses.TypeL", + "spoon.test.refactoring.parameter.testclasses.TypeM" + ); + + allSubtypes = factory.Interface().get(IFaceK.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list(); + checkContainsOnly(allSubtypes, + "spoon.test.refactoring.parameter.testclasses.TypeB$1Local", + "spoon.test.refactoring.parameter.testclasses.TypeL", + "spoon.test.refactoring.parameter.testclasses.TypeM", + "spoon.test.refactoring.parameter.testclasses.TypeK", + "spoon.test.refactoring.parameter.testclasses.TypeR", + "spoon.test.refactoring.parameter.testclasses.TypeS" + ); + } + + private void checkContainsOnly(List foundNames, String... expectedNames) { + for (String name : expectedNames) { + assertTrue(foundNames.remove(name), "The "+name+" not found"); + } + assertTrue(foundNames.isEmpty(), "Unexpected names found: "+foundNames); + } + + @Test + public void testAllMethodsSameSignatureFunction() { + Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); + + //each executable in test classes is marked with a annotation TestHierarchy, + //which defines the name of the hierarchy where this executable belongs to. + + //collect all executables which are marked that they belong to hierarchy A_method1 + List> executablesOfHierarchyA = getExecutablesOfHierarchy(factory, "A_method1"); + //check executables of this hierarchy + checkMethodHierarchies(executablesOfHierarchyA); + + //collect all executables which are marked that they belong to hierarchy R_method1 + List> executablesOfHierarchyR = getExecutablesOfHierarchy(factory, "R_method1"); + //check executables of this hierarchy + checkMethodHierarchies(executablesOfHierarchyR); + + //contract: CtConstructor has no other same signature + CtConstructor constructorTypeA = factory.Class().get(TypeA.class).getConstructors().iterator().next(); + CtExecutable exec = constructorTypeA.map(new AllMethodsSameSignatureFunction()).first(); + assertNull(exec, "Unexpected executable found by Constructor of TypeA "+exec); + CtConstructor constructorTypeB = factory.Class().get(TypeB.class).getConstructors().iterator().next(); + exec = constructorTypeA.map(new AllMethodsSameSignatureFunction()).first(); + assertNull(exec, "Unexpected executable found by Constructor of TypeA "+exec); + //contract: constructor is returned if includingSelf == true + assertSame(constructorTypeA, constructorTypeA.map(new AllMethodsSameSignatureFunction().includingSelf(true)).first()); + } + + private void checkMethodHierarchies(List> expectedExecutables) { + //contract: check that found methods does not depend on the starting point. + //The same set of executables has to be found if we start on any of them + int countOfTestedLambdas = 0; + int countOfTestedMethods = 0; + for (CtExecutable ctExecutable : expectedExecutables) { + if (ctExecutable instanceof CtLambda) { + countOfTestedLambdas++; + } else { + assertTrue(ctExecutable instanceof CtMethod); + countOfTestedMethods++; + } + //start checking of method hierarchy from each expected executable. It must always return same results + checkMethodHierarchy(expectedExecutables, ctExecutable); + } + assertTrue(countOfTestedLambdas>0); + assertTrue(countOfTestedMethods>0); + } + + private void checkMethodHierarchy(List> expectedExecutables, CtExecutable startExecutable) { + //contract: check that by default it does not includes self + //contract: check that by default it returns lambdas + { + final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction()).list(); + assertFalse(containsSame(executables, startExecutable), "Unexpected start executable "+startExecutable); + //check that some method was found + assertFalse(executables.isEmpty()); + //check that expected methods were found and remove them + expectedExecutables.forEach(m->{ + boolean found = removeSame(executables, m); + if(startExecutable==m) { + //it is start method. It should not be there + assertFalse(found, "The signature "+getQSignature(m)+" was returned too"); + } else { + assertTrue(found, "The signature "+getQSignature(m)+" not found"); + } + }); + //check that there is no unexpected executable + assertTrue(executables.isEmpty(), "Unexpected executables: "+executables); + } + + //contract: check that includingSelf(true) returns startMethod too + //contract: check that by default it still returns lambdas + { + final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true)).list(); + assertTrue(containsSame(executables, startExecutable), "Missing start executable "+startExecutable); + //check that some method was found + assertFalse(executables.isEmpty()); + //check that expected methods were found and remove them + expectedExecutables.forEach(m->{ + assertTrue(removeSame(executables, m), "The signature "+getQSignature(m)+" not found"); + }); + //check that there is no unexpected executable + assertTrue(executables.isEmpty(), "Unexpected executables: "+executables); + } + + //contract: check that includingLambdas(false) returns no lambda expressions + { + final List> executables = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true).includingLambdas(false)).list(); + if (startExecutable instanceof CtLambda) { + //lambda must not be returned even if it is first + assertFalse(containsSame(executables, startExecutable), "Unexpected start executable "+startExecutable); + } else { + assertTrue(containsSame(executables, startExecutable), "Missing start executable "+startExecutable); + } + + //check that some method was found + assertFalse(executables.isEmpty()); + //check that expected methods were found and remove them + expectedExecutables.forEach(m->{ + if(m instanceof CtLambda) { + //the lambdas are not expected. Do not ask for them + return; + } + assertTrue(removeSame(executables, m), "The signature "+getQSignature(m)+" not found"); + }); + //check that there is no unexpected executable or lambda + assertTrue(executables.isEmpty(), "Unexepcted executables "+executables); + } + //contract: check early termination + //contract: check that first returned element is the startExecutable itself if includingSelf == true + CtExecutable exec = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(true)).first(); + assertSame(startExecutable, exec); + //contract: check that first returned element is not the startExecutable itself if includingSelf == false, but some other executable from the expected + exec = startExecutable.map(new AllMethodsSameSignatureFunction().includingSelf(false)).first(); + assertNotSame(startExecutable, exec); + assertTrue(containsSame(expectedExecutables, exec)); + } + + private String getQSignature(CtExecutable e) { + if (e instanceof CtMethod) { + CtMethod m = (CtMethod) e; + return m.getDeclaringType().getQualifiedName()+"#"+m.getSignature(); + } + return e.getShortRepresentation(); + } + + private List> getExecutablesOfHierarchy(Factory factory, String hierarchyName) { + return factory.getModel().filterChildren(new TypeFilter(CtExecutable.class)).select((CtExecutable exec)->{ + //detect if found executable belongs to hierarchy 'hierarchyName' + CtElement ele = exec; + if (exec instanceof CtLambda) { + //lambda is marked by annotation on the first statement of the lambda body. + List stats = exec.getBody().getStatements(); + if(!stats.isEmpty()) { + ele = stats.get(0); + } + } + TestHierarchy th = ele.getAnnotation(TestHierarchy.class); + if (th!=null) { + return Arrays.asList(th.value()).contains(hierarchyName); + } + return false; + }).list(); + } + + @Test + public void testExecutableReferenceFilter() { + Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses")); + + List> executables = factory.getModel().filterChildren((CtExecutable e)->true).list(); + int nrExecRefsTotal = 0; + //contract check that ExecutableReferenceFilter found CtExecutableReferences of each executable individually + for (CtExecutable executable : executables) { + nrExecRefsTotal += checkExecutableReferenceFilter(factory, Collections.singletonList(executable)); + } + //contract check that ExecutableReferenceFilter found CtExecutableReferences of all executables together + int nrExecRefsTotal2 = checkExecutableReferenceFilter(factory, executables); + + assertSame(nrExecRefsTotal, nrExecRefsTotal2); + + //contract check that it found lambdas too + CtLambda lambda = factory.getModel().filterChildren((CtLambda e)->true).first(); + assertNotNull(lambda); + //this test case is quite wild, because there is normally lambda reference in spoon model. So make one lambda reference here: + CtExecutableReference lambdaRef = lambda.getReference(); + List> refs = lambdaRef.filterChildren(null).select(new ExecutableReferenceFilter(lambda)).list(); + assertEquals(1, refs.size()); + assertSame(lambdaRef, refs.get(0)); + } + + private int checkExecutableReferenceFilter(Factory factory, List> executables) { + assertFalse(executables.isEmpty()); + ExecutableReferenceFilter execRefFilter = new ExecutableReferenceFilter(); + executables.forEach((CtExecutable e)->execRefFilter.addExecutable(e)); + final List> refs = new ArrayList<>(factory.getModel().filterChildren(execRefFilter).list()); + int nrExecRefs = refs.size(); + //use different (slower, but straight forward) algorithm to search for all executable references to check if ExecutableReferenceFilter returns correct results + factory.getModel().filterChildren((CtExecutableReference er)->{ + return containsSame(executables, er.getDeclaration()); + }).forEach((CtExecutableReference er)->{ + //check that each expected reference was found by ExecutableReferenceFilter and remove it from that list + assertTrue(refs.remove(er), "Executable reference: "+er+" not found."); + }); + //check that no other reference was found by ExecutableReferenceFilter + assertSame(0, refs.size()); + return nrExecRefs; + } + + private boolean containsSame(Collection list, Object item) { + for (Object object : list) { + if(object==item) { + return true; + } + } + return false; + } + private boolean removeSame(Collection list, Object item) { + for (Iterator iter = list.iterator(); iter.hasNext();) { + Object object = iter.next(); + if(object==item) { + iter.remove(); + return true; + } + } + return false; + } + + @Test + public void testCtParameterRemoveRefactoring() throws FileNotFoundException { + String testPackagePath = "spoon/test/refactoring/parameter/testclasses"; + final Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + SpoonModelBuilder comp = launcher.createCompiler(); + comp.addInputSource(SpoonResourceHelper.createResource(new File("./src/test/java/"+testPackagePath))); + comp.build(); + Factory factory = comp.getFactory(); + + CtType typeA = factory.Class().get(TypeA.class); + + CtMethod methodTypeA_method1 = typeA.getMethodsByName("method1").get(0); + CtParameterRemoveRefactoring refactor = new CtParameterRemoveRefactoring(); + refactor.setTarget(methodTypeA_method1.getParameters().get(0)); + //check that expected methods are targets of refactoring + List> execs = refactor.getTargetExecutables(); + execs.forEach(exec->{ + //check that each to be modified method has one parameter + assertEquals(1, exec.getParameters().size()); + }); + refactor.refactor(); + execs.forEach(exec->{ + //check that each to be modified method has no parameter after refactoring + assertEquals(0, exec.getParameters().size()); + }); + launcher.setSourceOutputDirectory(new File("./target/spooned/")); + launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); + ModelUtils.canBeBuilt("./target/spooned/"+testPackagePath, 8); + } + @Test + public void testCtParameterRemoveRefactoringValidationCheck() throws FileNotFoundException { + String testPackagePath = "spoon/test/refactoring/parameter/testclasses"; + final Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + SpoonModelBuilder comp = launcher.createCompiler(); + comp.addInputSource(SpoonResourceHelper.createResource(new File("./src/test/java/"+testPackagePath))); + comp.build(); + Factory factory = comp.getFactory(); + + CtType typeR = factory.Class().get(TypeR.class); + + CtMethod methodTypeR_method1 = typeR.getMethodsByName("method1").get(0); + CtParameterRemoveRefactoring refactor = new CtParameterRemoveRefactoring().setTarget(methodTypeR_method1.getParameters().get(0)); + refactor.setTarget(methodTypeR_method1.getParameters().get(0)); + //check that each to be refactored method has one parameter + List> execs = refactor.getTargetExecutables(); + execs.forEach(exec->{ + //check that each to be modified method has one parameter + assertEquals(1, exec.getParameters().size()); + }); + //try refactor + try { + refactor.refactor(); + fail(); + } catch (RefactoringException e) { + this.getClass(); + } + } +} diff --git a/src/test/java/spoon/test/refactoring/RefactoringTest.java b/src/test/java/spoon/test/refactoring/RefactoringTest.java index 615d839d072..85686e3bdf4 100644 --- a/src/test/java/spoon/test/refactoring/RefactoringTest.java +++ b/src/test/java/spoon/test/refactoring/RefactoringTest.java @@ -16,22 +16,13 @@ */ package spoon.test.refactoring; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Comparator; import java.util.List; - import org.junit.jupiter.api.Test; - import org.junit.jupiter.api.condition.DisabledForJreRange; import org.junit.jupiter.api.condition.JRE; import spoon.Launcher; @@ -51,6 +42,13 @@ import spoon.test.refactoring.processors.ThisTransformationProcessor; import spoon.test.refactoring.testclasses.AClass; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class RefactoringTest { @Test public void testRefactoringClassChangeAllCtTypeReferenceAssociatedWithClassConcerned() { diff --git a/src/test/java/spoon/test/reference/CloneReferenceTest.java b/src/test/java/spoon/test/reference/CloneReferenceTest.java index d0e34ba9d57..e3e219fc3f9 100644 --- a/src/test/java/spoon/test/reference/CloneReferenceTest.java +++ b/src/test/java/spoon/test/reference/CloneReferenceTest.java @@ -20,7 +20,6 @@ import java.util.Arrays; import java.util.List; import java.util.function.Predicate; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.declaration.CtClass; @@ -35,102 +34,102 @@ public class CloneReferenceTest { - @Test - public void testGetDeclarationAfterClone() { - // contract: all variable references of the clone (but fields) should point to the variable of the clone - Launcher spoon = new Launcher(); - - List names = Arrays.asList("f1", "f2", "a", "b", "x", "param", "e"); - spoon.addInputResource("./src/test/resources/noclasspath/A2.java"); - spoon.getEnvironment().setComplianceLevel(8); - spoon.getEnvironment().setNoClasspath(true); - spoon.buildModel(); - - - final CtClass a = spoon.getFactory().Class().get("A2"); - // test before clone - for (String name : names) { - CtVariable var1 = findVariable(a, name); - CtVariable var2 = findReference(a, name).getDeclaration(); - assertSame(var1, var2); - } - - CtClass b = a.clone(); - - // test after clone - for (String name : names) { - CtVariable var1 = findVariable(b, name); - CtVariableReference refVar1 = findReference(b, name); - CtVariable var2 = refVar1.getDeclaration(); - assertSame(var1, var2, "Var1 and var2 are not the same element"); - } - } - - @Test - public void testGetDeclarationOfFieldAfterClone() { - // contract: all field references of the clone point to the old class - // behaviour changed on https://github.com/INRIA/spoon/pull/1215 - Launcher spoon = new Launcher(); - - String name = "field"; - spoon.addInputResource("./src/test/resources/noclasspath/A2.java"); - spoon.getEnvironment().setComplianceLevel(8); - spoon.getEnvironment().setNoClasspath(true); - spoon.buildModel(); - - - final CtClass a = spoon.getFactory().Class().get("A2"); - // test before clone - CtField oldVar1 = (CtField)findVariable(a, name); - CtField oldVar2 = (CtField)findReference(a, name).getDeclaration(); - assertSame(oldVar1, oldVar2); - - CtClass b = a.clone(); - - // test after clone - CtField var1 = (CtField)findVariable(b, name); - CtVariableReference refVar1 = findReference(b, name); - CtField var2 = (CtField)refVar1.getDeclaration(); - assertNotSame(var1, var2); - assertSame(var2, oldVar1); - assertSame(var1.getParent(CtClass.class), b); - } - - class Finder extends CtScanner { - - private final Class c; - private final Predicate filter; - private T result; - - public Finder(Class c, Predicate filter) { - this.c = c; - this.filter = filter; - } - - @Override - public void scan(CtElement element) { - if (element != null && c.isAssignableFrom(element.getClass()) && filter.test((T) element)) { - result = (T) element; - } else { - super.scan(element); - } - } - - public T find(CtElement root) { - scan(root); - return result; - } - } - - public T find(CtElement root, Class c, Predicate filter) { - return new Finder<>(c, filter).find(root); - } - - public CtVariable findVariable(CtElement root, String name) { - return find(root, CtVariable.class, var -> name.equals(var.getSimpleName())); - } - - public CtVariableReference findReference(CtElement root, String name) { - return find(root, CtVariableReference.class, ref -> name.equals(ref.getSimpleName())); - } -} \ No newline at end of file + @Test + public void testGetDeclarationAfterClone() { + // contract: all variable references of the clone (but fields) should point to the variable of the clone + Launcher spoon = new Launcher(); + + List names = Arrays.asList("f1", "f2", "a", "b", "x", "param", "e"); + spoon.addInputResource("./src/test/resources/noclasspath/A2.java"); + spoon.getEnvironment().setComplianceLevel(8); + spoon.getEnvironment().setNoClasspath(true); + spoon.buildModel(); + + + final CtClass a = spoon.getFactory().Class().get("A2"); + // test before clone + for (String name : names) { + CtVariable var1 = findVariable(a, name); + CtVariable var2 = findReference(a, name).getDeclaration(); + assertSame(var1, var2); + } + + CtClass b = a.clone(); + + // test after clone + for (String name : names) { + CtVariable var1 = findVariable(b, name); + CtVariableReference refVar1 = findReference(b, name); + CtVariable var2 = refVar1.getDeclaration(); + assertSame(var1, var2, "Var1 and var2 are not the same element"); + } + } + + @Test + public void testGetDeclarationOfFieldAfterClone() { + // contract: all field references of the clone point to the old class + // behaviour changed on https://github.com/INRIA/spoon/pull/1215 + Launcher spoon = new Launcher(); + + String name = "field"; + spoon.addInputResource("./src/test/resources/noclasspath/A2.java"); + spoon.getEnvironment().setComplianceLevel(8); + spoon.getEnvironment().setNoClasspath(true); + spoon.buildModel(); + + + final CtClass a = spoon.getFactory().Class().get("A2"); + // test before clone + CtField oldVar1 = (CtField)findVariable(a, name); + CtField oldVar2 = (CtField)findReference(a, name).getDeclaration(); + assertSame(oldVar1, oldVar2); + + CtClass b = a.clone(); + + // test after clone + CtField var1 = (CtField)findVariable(b, name); + CtVariableReference refVar1 = findReference(b, name); + CtField var2 = (CtField)refVar1.getDeclaration(); + assertNotSame(var1, var2); + assertSame(var2, oldVar1); + assertSame(var1.getParent(CtClass.class), b); + } + + class Finder extends CtScanner { + + private final Class c; + private final Predicate filter; + private T result; + + public Finder(Class c, Predicate filter) { + this.c = c; + this.filter = filter; + } + + @Override + public void scan(CtElement element) { + if (element != null && c.isAssignableFrom(element.getClass()) && filter.test((T) element)) { + result = (T) element; + } else { + super.scan(element); + } + } + + public T find(CtElement root) { + scan(root); + return result; + } + } + + public T find(CtElement root, Class c, Predicate filter) { + return new Finder<>(c, filter).find(root); + } + + public CtVariable findVariable(CtElement root, String name) { + return find(root, CtVariable.class, var -> name.equals(var.getSimpleName())); + } + + public CtVariableReference findReference(CtElement root, String name) { + return find(root, CtVariableReference.class, ref -> name.equals(ref.getSimpleName())); + } +} diff --git a/src/test/java/spoon/test/reference/ElasticsearchStackoverflowTest.java b/src/test/java/spoon/test/reference/ElasticsearchStackoverflowTest.java index ad07a7120ab..8f14a149bb3 100644 --- a/src/test/java/spoon/test/reference/ElasticsearchStackoverflowTest.java +++ b/src/test/java/spoon/test/reference/ElasticsearchStackoverflowTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; diff --git a/src/test/java/spoon/test/reference/Enum.java b/src/test/java/spoon/test/reference/Enum.java index 3a775ae317f..b681c216dbe 100644 --- a/src/test/java/spoon/test/reference/Enum.java +++ b/src/test/java/spoon/test/reference/Enum.java @@ -1,11 +1,11 @@ package spoon.test.reference; public enum Enum { - A, - B, - C; - - public static Enum getFirst(){ - return valueOf("A"); - } + A, + B, + C; + + public static Enum getFirst(){ + return valueOf("A"); + } } diff --git a/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java b/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java index c8cacb776c5..8c696e9ef43 100644 --- a/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java +++ b/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/reference/ExecutableReferenceTest.java b/src/test/java/spoon/test/reference/ExecutableReferenceTest.java index 2b392fb3f99..66b37531c93 100644 --- a/src/test/java/spoon/test/reference/ExecutableReferenceTest.java +++ b/src/test/java/spoon/test/reference/ExecutableReferenceTest.java @@ -11,7 +11,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.OutputType; @@ -188,7 +187,7 @@ public void testInvokeEnumMethod() { CtInvocation invocation = launcher.getModel().getElements(new TypeFilter(CtInvocation.class) { @Override public boolean matches(CtInvocation element) { - return super.matches(element) + return super.matches(element) && "valueOf".equals(element.getExecutable().getSimpleName()); } }).get(0); diff --git a/src/test/java/spoon/test/reference/Foo.java b/src/test/java/spoon/test/reference/Foo.java index 4d9fba7ced9..163f5b32607 100644 --- a/src/test/java/spoon/test/reference/Foo.java +++ b/src/test/java/spoon/test/reference/Foo.java @@ -6,4 +6,4 @@ public interface Foo extends Sup { interface Sup { void sup(); -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/reference/TypeReferenceTest.java b/src/test/java/spoon/test/reference/TypeReferenceTest.java index 00ba900debe..dc2b8384918 100644 --- a/src/test/java/spoon/test/reference/TypeReferenceTest.java +++ b/src/test/java/spoon/test/reference/TypeReferenceTest.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -68,7 +67,6 @@ import spoon.test.reference.testclasses.SuperAccess; import spoon.testing.utils.ModelUtils; - import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; @@ -671,7 +669,7 @@ public void testTypeReferenceWithGenerics() { assertEquals("spoon.test.imports.testclasses.withgenerics.Target", fieldTypeRef.getQualifiedName()); assertEquals(2, fieldTypeRef.getActualTypeArguments().size()); } - + @Test public void testTypeReferenceImplicitParent() throws Exception { // contract: CtTypeReference#isSimplyQualified can be used read / write implicit value of the parent @@ -679,7 +677,7 @@ public void testTypeReferenceImplicitParent() throws Exception { CtTypeReference typeRef = type.getSuperclass(); assertTrue(typeRef.isSimplyQualified()); assertTrue(typeRef.getPackage().isImplicit()); - + // a type reference can be printed fully qualified typeRef.setSimplyQualified(false); assertFalse(typeRef.isSimplyQualified()); @@ -726,8 +724,8 @@ public void testQualifiedArrayTypeReferenceNoClasspath() { int loopIterations = 0; // for meta assert for (CtArrayTypeReference arrayTypeRef : refs) { - CtTypeReference compType = getDeepestComponentType(arrayTypeRef); - assertFalse(compType.getPackage().isImplicit()); + CtTypeReference compType = getDeepestComponentType(arrayTypeRef); + assertFalse(compType.getPackage().isImplicit()); loopIterations++; } diff --git a/src/test/java/spoon/test/reference/VariableAccessTest.java b/src/test/java/spoon/test/reference/VariableAccessTest.java index e149cc0bc96..74537c857b3 100644 --- a/src/test/java/spoon/test/reference/VariableAccessTest.java +++ b/src/test/java/spoon/test/reference/VariableAccessTest.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtArrayWrite; @@ -204,7 +203,7 @@ public void testReferencesInInitExpression() throws Exception { final CtType aTortillas = buildClass(Tortillas.class); final CtMethod make = aTortillas.getMethod("make", aTortillas.getFactory().Type().stringType()); - + final CtLocalVariable localVarNumber = make.getBody().getStatement(1); List> refs = localVarNumber.map(new LocalVariableReferenceFunction()).list(); assertEquals(1, refs.size()); @@ -270,10 +269,10 @@ public boolean matches(CtLocalVariableReference element) { } }).get(0); } - + @Test public void testSuperAccess() throws Exception { - // contract: the type of "super" variable is set and correct + // contract: the type of "super" variable is set and correct CtClass type = build("spoon.test.reference.testclasses", "SuperAccess"); CtMethod method = type.getMethodsByName("method").get(0); CtInvocation invocation = method.getBody().getStatement(0); diff --git a/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java b/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java index 38649c03103..cd52fc474c3 100644 --- a/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java +++ b/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.reflect.declaration.CtEnum; import spoon.reflect.factory.TypeFactory; diff --git a/src/test/java/spoon/test/replace/ReplaceParametrizedTest.java b/src/test/java/spoon/test/replace/ReplaceParametrizedTest.java index a30bfdf6ae5..05c6473ec57 100644 --- a/src/test/java/spoon/test/replace/ReplaceParametrizedTest.java +++ b/src/test/java/spoon/test/replace/ReplaceParametrizedTest.java @@ -16,6 +16,10 @@ */ package spoon.test.replace; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import spoon.SpoonException; @@ -39,11 +43,6 @@ import spoon.reflect.visitor.CtVisitable; import spoon.reflect.visitor.filter.SameFilter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertSame; @@ -70,7 +69,7 @@ public Collection createTests() { private void testContract(MetamodelConcept typeToTest) { List problems = new ArrayList<>(); - + // contract: all elements are replaceable wherever they are in the model // this test puts them at all possible locations CtType toTest = typeToTest.getMetamodelInterface(); @@ -133,11 +132,11 @@ private void testContract(MetamodelConcept typeToTest) { } } continue; - } + } // we invoke the setter invokeSetter(rh, receiver, argument); - + // contract: a property setter sets properties that are visitable by a scanner CtElement finalArgument = argument; class Scanner extends CtScanner { @@ -157,10 +156,10 @@ public void scan(CtRole role, CtElement e) { Scanner s = new Scanner(); receiver.accept(s); assertTrue(s.found, "Settable field " + mmField.toString() + " should set value.\n" + getReport(problems, typeToTest)); - + // contract: a property getter on the same role can be used to get the value back assertSame(argument, invokeGetter(rh, receiver)); - + final CtElement argument2 = argument.clone(); assertNotSame(argument, argument2); @@ -174,7 +173,7 @@ public void scan(CtRole role, CtElement e) { fail(getReport(problems, typeToTest)); } } - + private String getReport(List problems, MetamodelConcept typeToTest) { if (!problems.isEmpty()) { StringBuilder report = new StringBuilder(); diff --git a/src/test/java/spoon/test/replace/ReplaceTest.java b/src/test/java/spoon/test/replace/ReplaceTest.java index 7fd6278f124..9345a97bc18 100644 --- a/src/test/java/spoon/test/replace/ReplaceTest.java +++ b/src/test/java/spoon/test/replace/ReplaceTest.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; diff --git a/src/test/java/spoon/test/role/TestCtRole.java b/src/test/java/spoon/test/role/TestCtRole.java index 169398c8886..a988037ffaf 100644 --- a/src/test/java/spoon/test/role/TestCtRole.java +++ b/src/test/java/spoon/test/role/TestCtRole.java @@ -17,7 +17,6 @@ package spoon.test.role; import org.junit.jupiter.api.Test; - import spoon.SpoonException; import spoon.reflect.CtModel; import spoon.reflect.path.CtRole; @@ -29,6 +28,7 @@ import spoon.support.reflect.declaration.CtFieldImpl; import spoon.support.reflect.declaration.CtMethodImpl; import spoon.testing.utils.GitHubIssue; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -38,78 +38,78 @@ import static spoon.test.SpoonTestHelpers.createModelFromString; public class TestCtRole { - @Test - public void testGetCtRoleByName() { - // contract: one should be able to get CtRole based on its name (without '_' whatever the case is, or with '_' in uppercase) - - String name = "DECLARING_TYPE"; // exactly the same name: OK - assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); - - name = "declaringType"; // camel case: OK - assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); - - name = "declaringtype"; // lower case: OK - assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); - - name = "declaring_type"; // lower case with underscore: not accepted - assertNull(CtRole.fromName(name)); - - for (CtRole role : CtRole.values()) { - assertEquals(role, CtRole.fromName(role.name().replaceAll("_", "").toLowerCase())); - } - } - - @Test - public void testCtRoleGetSubRolesNotNull() { - // contract: CtRole#getSubRoles() never returns null - - for (CtRole role : CtRole.values()) { - assertNotNull(role.getSubRoles()); - } - } - - @Test - public void testCtRoleSubRoleMatchesWithSuperRole() { - // contract: CtRole#getSubRoles() and CtRole#getSuperRole() are empty or links to each other - int countOfSubRoles = 0; - for (CtRole role : CtRole.values()) { - for (CtRole subRole : role.getSubRoles()) { - countOfSubRoles++; + @Test + public void testGetCtRoleByName() { + // contract: one should be able to get CtRole based on its name (without '_' whatever the case is, or with '_' in uppercase) + + String name = "DECLARING_TYPE"; // exactly the same name: OK + assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); + + name = "declaringType"; // camel case: OK + assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); + + name = "declaringtype"; // lower case: OK + assertEquals(CtRole.DECLARING_TYPE, CtRole.fromName(name)); + + name = "declaring_type"; // lower case with underscore: not accepted + assertNull(CtRole.fromName(name)); + + for (CtRole role : CtRole.values()) { + assertEquals(role, CtRole.fromName(role.name().replaceAll("_", "").toLowerCase())); + } + } + + @Test + public void testCtRoleGetSubRolesNotNull() { + // contract: CtRole#getSubRoles() never returns null + + for (CtRole role : CtRole.values()) { + assertNotNull(role.getSubRoles()); + } + } + + @Test + public void testCtRoleSubRoleMatchesWithSuperRole() { + // contract: CtRole#getSubRoles() and CtRole#getSuperRole() are empty or links to each other + int countOfSubRoles = 0; + for (CtRole role : CtRole.values()) { + for (CtRole subRole : role.getSubRoles()) { + countOfSubRoles++; assertSame(role, subRole.getSuperRole()); } - if (role.getSuperRole() != null) { - assertTrue(role.getSuperRole().getSubRoles().contains(role)); - } - } - assertTrue(countOfSubRoles > 0); - } - @Test - public void testCtRoleGetSubRole() { - // contract: we can match the correct subrole for CtRole.METHOD, CtRole.CONSTRUCTOR, CtRole.FIELD and CtRole.ANNONYMOUS_EXECUTABLE - assertSame(CtRole.METHOD, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtMethodImpl<>())); - assertSame(CtRole.CONSTRUCTOR, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtConstructorImpl())); - assertSame(CtRole.FIELD, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtFieldImpl())); - assertSame(CtRole.ANNONYMOUS_EXECUTABLE, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtAnonymousExecutableImpl())); - } - @Test - public void testCtRoleGetSubRoleFailsOnOthers() { - // contract: an exception is thrown when no possible role can be found for this element - try { - CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtAssertImpl<>()); - fail(); - } catch (SpoonException e) { - //OK - } - } - @Test - public void testCtRoleGetSubRoleFailsOnNull() { - try { - CtRole.TYPE_MEMBER.getMatchingSubRoleFor(null); - fail(); - } catch (SpoonException e) { - //OK - } - } + if (role.getSuperRole() != null) { + assertTrue(role.getSuperRole().getSubRoles().contains(role)); + } + } + assertTrue(countOfSubRoles > 0); + } + @Test + public void testCtRoleGetSubRole() { + // contract: we can match the correct subrole for CtRole.METHOD, CtRole.CONSTRUCTOR, CtRole.FIELD and CtRole.ANNONYMOUS_EXECUTABLE + assertSame(CtRole.METHOD, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtMethodImpl<>())); + assertSame(CtRole.CONSTRUCTOR, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtConstructorImpl())); + assertSame(CtRole.FIELD, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtFieldImpl())); + assertSame(CtRole.ANNONYMOUS_EXECUTABLE, CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtAnonymousExecutableImpl())); + } + @Test + public void testCtRoleGetSubRoleFailsOnOthers() { + // contract: an exception is thrown when no possible role can be found for this element + try { + CtRole.TYPE_MEMBER.getMatchingSubRoleFor(new CtAssertImpl<>()); + fail(); + } catch (SpoonException e) { + //OK + } + } + @Test + public void testCtRoleGetSubRoleFailsOnNull() { + try { + CtRole.TYPE_MEMBER.getMatchingSubRoleFor(null); + fail(); + } catch (SpoonException e) { + //OK + } + } @Test @GitHubIssue(issueNumber = 4698, fixed = true) diff --git a/src/test/java/spoon/test/secondaryclasses/ClassesTest.java b/src/test/java/spoon/test/secondaryclasses/ClassesTest.java index 864e7709272..cbc04c12719 100644 --- a/src/test/java/spoon/test/secondaryclasses/ClassesTest.java +++ b/src/test/java/spoon/test/secondaryclasses/ClassesTest.java @@ -21,9 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.TreeSet; - import org.junit.jupiter.api.Test; - import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtNewClass; import spoon.reflect.code.CtVariableRead; diff --git a/src/test/java/spoon/test/serializable/ModelStreamerTest.java b/src/test/java/spoon/test/serializable/ModelStreamerTest.java index 75a5929c758..d11530b1501 100644 --- a/src/test/java/spoon/test/serializable/ModelStreamerTest.java +++ b/src/test/java/spoon/test/serializable/ModelStreamerTest.java @@ -24,11 +24,9 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.declaration.CtElement; import spoon.reflect.factory.Factory; @@ -46,13 +44,13 @@ public class ModelStreamerTest { private static Factory factory; @BeforeAll - public static void setUp() { + public static void setUp() { Launcher launcher = new Launcher(); launcher.addInputResource(SOURCE_DIRECTORY); launcher.buildModel(); factory = launcher.getFactory(); outputFile = new File(OUTPUT_FILENAME); - } + } @AfterEach public void tearDown() { diff --git a/src/test/java/spoon/test/serializable/SerializableTest.java b/src/test/java/spoon/test/serializable/SerializableTest.java index 7afd377eae1..f8ed0dd605c 100644 --- a/src/test/java/spoon/test/serializable/SerializableTest.java +++ b/src/test/java/spoon/test/serializable/SerializableTest.java @@ -19,7 +19,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; - import org.junit.jupiter.api.Test; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtType; @@ -32,7 +31,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/test/serializable/SourcePositionTest.java b/src/test/java/spoon/test/serializable/SourcePositionTest.java index 88e8c90279f..f3fed2066c1 100644 --- a/src/test/java/spoon/test/serializable/SourcePositionTest.java +++ b/src/test/java/spoon/test/serializable/SourcePositionTest.java @@ -23,9 +23,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.declaration.CtField; diff --git a/src/test/java/spoon/test/signature/SignatureTest.java b/src/test/java/spoon/test/signature/SignatureTest.java index 403e9cc3c17..2febe13f0d1 100644 --- a/src/test/java/spoon/test/signature/SignatureTest.java +++ b/src/test/java/spoon/test/signature/SignatureTest.java @@ -21,9 +21,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonResourceHelper; diff --git a/src/test/java/spoon/test/snippets/SnippetTest.java b/src/test/java/spoon/test/snippets/SnippetTest.java index fe9fc90e955..b6c9e13234c 100644 --- a/src/test/java/spoon/test/snippets/SnippetTest.java +++ b/src/test/java/spoon/test/snippets/SnippetTest.java @@ -38,7 +38,6 @@ import spoon.support.compiler.SnippetCompilationHelper; import spoon.support.compiler.VirtualFile; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -140,13 +139,13 @@ public void testIssue981() { @Test public void testCompileAndReplaceSnippetsIn() { - /* - contract: - We have a method, and we have a CodeSnippetStatement. - In the code snippet, there is a reference to a declared variable, e.g. an object. - After the call to CtType().compileAndReplaceSnippetsIn, - The snippet must be replaced by the reference of the good object. - */ + /* + contract: + We have a method, and we have a CodeSnippetStatement. + In the code snippet, there is a reference to a declared variable, e.g. an object. + After the call to CtType().compileAndReplaceSnippetsIn, + The snippet must be replaced by the reference of the good object. + */ final Launcher launcher = new Launcher(); launcher.addInputResource("src/test/resources/snippet/SnippetResources.java"); @@ -240,7 +239,7 @@ public void testSnippetCompilationInUnnamedPackage() { body.addStatement(0,factory.createCodeSnippetStatement("int x")); snippetClass.compileAndReplaceSnippets(); assertTrue(body.getStatements().get(0) instanceof CtLocalVariable); - assertEquals(1,body.getStatements().size()); + assertEquals(1,body.getStatements().size()); } @Test diff --git a/src/test/java/spoon/test/sourcePosition/SourcePositionTest.java b/src/test/java/spoon/test/sourcePosition/SourcePositionTest.java index 252f3883e21..fb4ed395879 100644 --- a/src/test/java/spoon/test/sourcePosition/SourcePositionTest.java +++ b/src/test/java/spoon/test/sourcePosition/SourcePositionTest.java @@ -18,23 +18,18 @@ import java.util.List; - import org.junit.jupiter.api.Test; -import spoon.Launcher; import spoon.reflect.CtModel; import spoon.reflect.code.CtInvocation; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; -import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtModifiable; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.Filter; import spoon.reflect.visitor.filter.TypeFilter; -import spoon.support.reflect.CtExtendedModifier; import spoon.support.reflect.cu.CompilationUnitImpl; import spoon.support.reflect.cu.position.BodyHolderSourcePositionImpl; import spoon.support.reflect.cu.position.DeclarationSourcePositionImpl; @@ -77,7 +72,7 @@ public void equalPositionsHaveSameHashcode() throws Exception { private Factory factoryFor(String packageName, String className) throws Exception { return build(packageName, className).getFactory(); } - + @Test public void testSourcePositionOfSecondPrimitiveType() throws Exception { /* @@ -107,16 +102,16 @@ public String getOriginalSourceCode() { }; SourcePositionImpl sp = new SourcePositionImpl(cu, 1, 9, null); assertEquals("|1;9|123456789|", sp.getSourceDetails()); - + DeclarationSourcePositionImpl dsp = new DeclarationSourcePositionImpl(cu, 4, 7, 2, 2, 1,9, null); - assertEquals("|1;9|123456789|\n" + - "modifier = |2;2|2|\n" + + assertEquals("|1;9|123456789|\n" + + "modifier = |2;2|2|\n" + "name = |4;7|4567|", dsp.getSourceDetails()); - + BodyHolderSourcePositionImpl bhsp = new BodyHolderSourcePositionImpl(cu, 4, 7, 2, 2, 1,9, 8, 9, null); - assertEquals("|1;9|123456789|\n" + - "modifier = |2;2|2|\n" + - "name = |4;7|4567|\n" + + assertEquals("|1;9|123456789|\n" + + "modifier = |2;2|2|\n" + + "name = |4;7|4567|\n" + "body = |8;9|89|", bhsp.getSourceDetails()); } @@ -129,4 +124,4 @@ public void testSourcePositionWhenCommentInAnnotation(CtModel model) { List list = model.getElements(new TypeFilter<>(CtClassImpl.class)); assertEquals(4,list.get(0).getPosition().getLine()); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/spoonifier/SpoonifierTest.java b/src/test/java/spoon/test/spoonifier/SpoonifierTest.java index 00817028676..6141f689714 100644 --- a/src/test/java/spoon/test/spoonifier/SpoonifierTest.java +++ b/src/test/java/spoon/test/spoonifier/SpoonifierTest.java @@ -20,7 +20,6 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; - import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -41,7 +40,7 @@ public class SpoonifierTest { * This test is too long for CI, but it checks that SpoonifierVisitor does produce equivalent Type for all * files used for testing purposes. */ - + @Test @Disabled public void testOnAllTestClasses() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { @@ -98,7 +97,7 @@ public void testSpoonifier() throws ClassNotFoundException, MalformedURLExceptio * This test is too long for CI, but it checks that SpoonifierVisitor does produce equivalent CtElement for all * CtElement in Rule */ - + @Test @Disabled public void testSpoonifierElement() throws ClassNotFoundException, MalformedURLException, InvocationTargetException, IllegalAccessException, NoSuchMethodException { diff --git a/src/test/java/spoon/test/statementComment/StatementCommentTest.java b/src/test/java/spoon/test/statementComment/StatementCommentTest.java index 64a571d41eb..8b359ba76a5 100644 --- a/src/test/java/spoon/test/statementComment/StatementCommentTest.java +++ b/src/test/java/spoon/test/statementComment/StatementCommentTest.java @@ -39,11 +39,12 @@ import spoon.reflect.factory.Factory; import spoon.support.reflect.code.CtCatchImpl; import spoon.testing.utils.LineSeparatorExtension; + import static org.junit.jupiter.api.Assertions.*; public class StatementCommentTest { String EOL = "\n"; - + private Factory getSpoonFactory() { final Launcher launcher = new Launcher(); launcher.run(new String[]{ @@ -53,7 +54,7 @@ private Factory getSpoonFactory() { }); return launcher.getFactory(); } - + private Launcher setUpTest() { Launcher launcher = new Launcher(); launcher.addInputResource("./src/test/java/spoon/test/statementComment/testclasses/AllStmtExtensions.java"); @@ -61,7 +62,7 @@ private Launcher setUpTest() { launcher.run(); return launcher; } - + @Test public void testAssertStatement(){ // contract: test assert statement can be singly commented out @@ -87,7 +88,7 @@ public void testAssignmentStatement(){ CtComment assignmentAsComment = ((CtComment) m1.getBody().getStatement(2)); assertEquals(assignmentAsComment.getContent(), "r = 20;"); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testBlockStatementWithinBody(){ @@ -100,11 +101,11 @@ public void testBlockStatementWithinBody(){ blockWithinBody.comment(); assertTrue(m1.getBody().getStatement(4) instanceof CtComment); CtComment blockAsComment = (CtComment) m1.getBody().getStatement(4); - assertEquals("{" + EOL + - "int j = 10;" + EOL + + assertEquals("{" + EOL + + "int j = 10;" + EOL + "}", blockAsComment.getContent()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testMethodBodyEmptyStatement(){ @@ -116,7 +117,7 @@ public void testMethodBodyEmptyStatement(){ assertEquals("{" + EOL + "}", m2.getBody().prettyprint()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testMethodBodyNonEmptyStatement(){ @@ -128,18 +129,18 @@ public void testMethodBodyNonEmptyStatement(){ for(CtStatement stmt: m1.getBody().getStatements()) { assertTrue(stmt instanceof CtComment); } - assertEquals("{" + EOL + - " // assert 1 == 5;" + EOL + - " // int r = 10;" + EOL + - " // r = 20;" + EOL + - " // java.lang.String s = \"This is a new String!\";" + EOL + - " /* {" + EOL + - " int j = 10;" + EOL + - " }" + EOL + - " */" + EOL + + assertEquals("{" + EOL + + " // assert 1 == 5;" + EOL + + " // int r = 10;" + EOL + + " // r = 20;" + EOL + + " // java.lang.String s = \"This is a new String!\";" + EOL + + " /* {" + EOL + + " int j = 10;" + EOL + + " }" + EOL + + " */" + EOL + "}", m1.getBody().prettyprint()); } - + public void testCaseStatement(){ // contract: test an isolated case statement commented out leads to UnsupportedOperationException Launcher launcher = setUpTest(); @@ -171,7 +172,7 @@ public void testCommentStatement(){ assertTrue(m6.getBody().getStatement(3) instanceof CtComment); assertEquals(((CtComment) m6.getBody().getStatement(3)).getContent(), initialContent); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testIfStatement(){ @@ -184,10 +185,10 @@ public void testIfStatement(){ ifStmt.comment(); assertTrue(m4.getBody().getStatement(0) instanceof CtComment); CtComment ifAsComment = (CtComment) m4.getBody().getStatement(0); - assertEquals("if (5 > 6) {" + EOL + - "java.lang.System.out.println(\"Impossible!\");" + EOL + - "} else {" + EOL + - "java.lang.System.out.println(\"Seems right...\");" + EOL + + assertEquals("if (5 > 6) {" + EOL + + "java.lang.System.out.println(\"Impossible!\");" + EOL + + "} else {" + EOL + + "java.lang.System.out.println(\"Seems right...\");" + EOL + "}", ifAsComment.getContent()); } @@ -204,7 +205,7 @@ public void testLocalVariableStatement(){ CtComment comm = (CtComment) m3.getBody().getStatement(1); assertEquals("int r = 30;", comm.getContent()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testLoopStatement(){ @@ -216,11 +217,11 @@ public void testLoopStatement(){ CtLoop loopAsStmt = m6.getBody().getStatement(2); loopAsStmt.comment(); assertTrue(m6.getBody().getStatement(2) instanceof CtComment); - assertEquals("for (int i = 0; i < 10; ++i) {" + EOL + - "java.lang.System.out.println(i);" + EOL + + assertEquals("for (int i = 0; i < 10; ++i) {" + EOL + + "java.lang.System.out.println(i);" + EOL + "}", ((CtComment) m6.getBody().getStatement(2)).getContent()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testSwitchStatement(){ @@ -236,12 +237,12 @@ public void testSwitchStatement(){ assertEquals("switch (t) {" + EOL + "case 1 :" + EOL + "java.lang.System.out.println(\"1\");" + EOL + - "break;" + EOL + - "default :" + EOL + - "java.lang.System.out.println(\"None\");" + EOL + + "break;" + EOL + + "default :" + EOL + + "java.lang.System.out.println(\"None\");" + EOL + "}", switchAsComment.getContent()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testSynchronousStatement(){ @@ -253,11 +254,11 @@ public void testSynchronousStatement(){ CtSynchronized synchronizedAsStmt = (CtSynchronized) m6.getBody().getStatement(1); synchronizedAsStmt.comment(); assertTrue(m6.getBody().getStatement(1) instanceof CtComment); - assertEquals("synchronized(obj) {" + EOL + - "java.lang.System.out.println(\"Executing\");" + EOL + + assertEquals("synchronized(obj) {" + EOL + + "java.lang.System.out.println(\"Executing\");" + EOL + "}", ((CtComment) m6.getBody().getStatement(1)).getContent()); } - + @Test @ExtendWith(LineSeparatorExtension.class) public void testTryStatement(){ @@ -270,13 +271,13 @@ public void testTryStatement(){ tryStmt.comment(); assertTrue(m3.getBody().getStatement(0) instanceof CtComment); CtComment tryAsComment = m3.getBody().getStatement(0); - assertEquals("try {" + EOL + - "throw new java.lang.Exception();" + EOL + - "} catch (java.lang.Exception e) {" + EOL + - "java.lang.System.out.println(e);" + EOL + + assertEquals("try {" + EOL + + "throw new java.lang.Exception();" + EOL + + "} catch (java.lang.Exception e) {" + EOL + + "java.lang.System.out.println(e);" + EOL + "}", tryAsComment.getContent()); } - + public void testCatchStatementFail(){ // contract: test commenting of isolated catch leads to UnsupportedOperationException exception @@ -292,7 +293,7 @@ public void testCatchStatementFail(){ } }); } - + @Test public void testUnaryOperatorStatement(){ // contract: test commenting out of UnaryOperator statement diff --git a/src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java b/src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java index 7577517b271..b71fd62fd73 100644 --- a/src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java +++ b/src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java @@ -1,8 +1,7 @@ package spoon.test.staticFieldAccess; -import spoon.test.staticFieldAccess.internal.Extends; - import java.util.concurrent.Callable; +import spoon.test.staticFieldAccess.internal.Extends; /** * Created by nicolas on 05/09/2014. diff --git a/src/test/java/spoon/test/staticFieldAccess/StaticAccessTest.java b/src/test/java/spoon/test/staticFieldAccess/StaticAccessTest.java index 002ac1259e2..983ee13aa90 100644 --- a/src/test/java/spoon/test/staticFieldAccess/StaticAccessTest.java +++ b/src/test/java/spoon/test/staticFieldAccess/StaticAccessTest.java @@ -19,7 +19,6 @@ import java.io.File; import java.util.Arrays; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import spoon.Launcher; @@ -36,50 +35,50 @@ public class StaticAccessTest { - Launcher spoon; - Factory factory; - SpoonModelBuilder compiler; + Launcher spoon; + Factory factory; + SpoonModelBuilder compiler; - @BeforeEach - public void setUp() throws Exception { - spoon = new Launcher(); - factory = spoon.createFactory(); - compiler = spoon.createCompiler( - factory, - SpoonResourceHelper - .resources( - "./src/test/java/spoon/test/staticFieldAccess/internal/", - "./src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java" - )); - compiler.build(); - } + @BeforeEach + public void setUp() throws Exception { + spoon = new Launcher(); + factory = spoon.createFactory(); + compiler = spoon.createCompiler( + factory, + SpoonResourceHelper + .resources( + "./src/test/java/spoon/test/staticFieldAccess/internal/", + "./src/test/java/spoon/test/staticFieldAccess/StaticAccessBug.java" + )); + compiler.build(); + } - @Test - public void testReferences() { - CtType type = factory.Type().get("spoon.test.staticFieldAccess.StaticAccessBug"); - CtBlock block = type.getMethod("references").getBody(); - assertTrue(block.getStatement(0).toString().contains("Extends.MY_STATIC_VALUE")); - assertTrue(block.getStatement(1).toString().contains("Extends.MY_OTHER_STATIC_VALUE")); - } + @Test + public void testReferences() { + CtType type = factory.Type().get("spoon.test.staticFieldAccess.StaticAccessBug"); + CtBlock block = type.getMethod("references").getBody(); + assertTrue(block.getStatement(0).toString().contains("Extends.MY_STATIC_VALUE")); + assertTrue(block.getStatement(1).toString().contains("Extends.MY_OTHER_STATIC_VALUE")); + } - @Test - public void testProcessAndCompile() throws Exception{ - compiler.instantiateAndProcess(Arrays.asList(InsertBlockProcessor.class.getName())); + @Test + public void testProcessAndCompile() throws Exception{ + compiler.instantiateAndProcess(Arrays.asList(InsertBlockProcessor.class.getName())); - // generate files - File tmpdir = new File("target/spooned/staticFieldAccess"); - tmpdir.mkdirs(); - // tmpdir.deleteOnExit(); - factory.getEnvironment().setSourceOutputDirectory(tmpdir); - compiler.generateProcessedSourceFiles(OutputType.COMPILATION_UNITS); + // generate files + File tmpdir = new File("target/spooned/staticFieldAccess"); + tmpdir.mkdirs(); + // tmpdir.deleteOnExit(); + factory.getEnvironment().setSourceOutputDirectory(tmpdir); + compiler.generateProcessedSourceFiles(OutputType.COMPILATION_UNITS); - // try to reload generated datas - spoon = new Launcher(); - compiler = spoon.createCompiler( - SpoonResourceHelper - .resources(tmpdir.getAbsolutePath())); - assertTrue(compiler.build()); - } + // try to reload generated datas + spoon = new Launcher(); + compiler = spoon.createCompiler( + SpoonResourceHelper + .resources(tmpdir.getAbsolutePath())); + assertTrue(compiler.build()); + } } diff --git a/src/test/java/spoon/test/staticFieldAccess/processors/InsertBlockProcessor.java b/src/test/java/spoon/test/staticFieldAccess/processors/InsertBlockProcessor.java index 78f5c6d5a8f..c56a5fded78 100644 --- a/src/test/java/spoon/test/staticFieldAccess/processors/InsertBlockProcessor.java +++ b/src/test/java/spoon/test/staticFieldAccess/processors/InsertBlockProcessor.java @@ -34,7 +34,7 @@ public boolean isToBeProcessed(CtMethod candidate) { @Override public void process(CtMethod element) { CtBlock block = new CtBlockImpl(); - // we clone the body so that there is no two elements with the same parent + // we clone the body so that there is no two elements with the same parent block.addStatement(element.getBody().clone()); element.setBody(block); } diff --git a/src/test/java/spoon/test/staticFieldAccess2/ImplicitStaticFieldReferenceTest.java b/src/test/java/spoon/test/staticFieldAccess2/ImplicitStaticFieldReferenceTest.java index 11ad07131db..e1d68a9af2a 100644 --- a/src/test/java/spoon/test/staticFieldAccess2/ImplicitStaticFieldReferenceTest.java +++ b/src/test/java/spoon/test/staticFieldAccess2/ImplicitStaticFieldReferenceTest.java @@ -1,178 +1,177 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.staticFieldAccess2; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.reflect.declaration.CtClass; -import spoon.test.staticFieldAccess2.testclasses.AmbiguousImplicitFieldReference; -import spoon.test.staticFieldAccess2.testclasses.ChildOfGenericsWithAmbiguousStaticField; -import spoon.test.staticFieldAccess2.testclasses.ImplicitFieldReference; -import spoon.test.staticFieldAccess2.testclasses.ImplicitStaticFieldReference; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static spoon.testing.utils.ModelUtils.canBeBuilt; - -public class ImplicitStaticFieldReferenceTest -{ - private static final boolean expectImplicit = false; - - @Test - public void testImplicitStaticFieldReference() { - Launcher launcher = checkFile(false, "ImplicitStaticFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(ImplicitStaticFieldReference.class); - assertEquals("return ImplicitStaticFieldReference", cls.getMethod("reader").getBody().getStatements().get(0).toString()); - assertEquals("ImplicitStaticFieldReference = value", cls.getMethodsByName("writer").get(0).getBody().getStatements().get(0).toString()); - assertEquals("reader()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - assertEquals("longWriter(7)", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(1).toString()); - } - } - - @Test - public void testImplicitStaticFieldReferenceAutoImport() { - Launcher launcher = checkFile(true, "ImplicitStaticFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(ImplicitStaticFieldReference.class); - assertEquals("return ImplicitStaticFieldReference", cls.getMethod("reader").getBody().getStatements().get(0).toString()); - assertEquals("ImplicitStaticFieldReference = value", cls.getMethodsByName("writer").get(0).getBody().getStatements().get(0).toString()); - assertEquals("reader()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - assertEquals("longWriter(7)", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(1).toString()); - } - } - - @Test - public void testImplicitFieldReference() { - Launcher launcher = checkFile(false, "ImplicitFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(ImplicitFieldReference.class); - assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); - assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); -// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); - assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - } - } - @Test - public void testImplicitFieldReferenceAutoImport() { - Launcher launcher = checkFile(true, "ImplicitFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(ImplicitFieldReference.class); - assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); - assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); -// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); - assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - } - } - - @Test - public void testAmbiguousImplicitFieldReference() { - Launcher launcher = checkFile(false, "AmbiguousImplicitFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(AmbiguousImplicitFieldReference.class); - assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); - assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); -// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); - assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - } - } - @Test - public void testAmbiguousImplicitFieldReferenceAutoImport() { - Launcher launcher = checkFile(true, "AmbiguousImplicitFieldReference.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(AmbiguousImplicitFieldReference.class); - assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); - assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); -// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); - assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); - } - } - - @Test - public void testImplicitStaticClassAccess() { - Launcher launcher = checkFile(false, "ImplicitStaticClassAccess.java"); - } - @Test - public void testImplicitStaticClassAccessAutoImport() { - Launcher launcher = checkFile(true, "ImplicitStaticClassAccess.java"); - } - @Test - public void testGenericsWithAmbiguousStaticField() { - Launcher launcher = checkFile(false, "GenericsWithAmbiguousStaticField.java"); - } - @Test - public void testGenericsWithAmbiguousStaticFieldAutoImport() { - Launcher launcher = checkFile(true, "GenericsWithAmbiguousStaticField.java"); - } - - @Test - public void testChildOfGenericsWithAmbiguousStaticField() { - Launcher launcher = checkFile(false, "ChildOfGenericsWithAmbiguousStaticField.java"); - } - - @Test - public void testChildOfGenericsWithAmbiguousStaticFieldAutoImport() { - Launcher launcher = checkFile(true, "ChildOfGenericsWithAmbiguousStaticField.java"); - if(expectImplicit) { - CtClass cls = launcher.getFactory().Class().get(ChildOfGenericsWithAmbiguousStaticField.class); - //The toString of the method does not have a context of class, so it different result -// assertEquals("spoon.test.staticFieldAccess2.testclasses.GenericsWithAmbiguousStaticField.genericMethod()", cls.getMethod("m1").getBody().getStatements().get(0).toString()); - assertTrue(cls.toString().contains("spoon.test.staticFieldAccess2.testclasses.GenericsWithAmbiguousStaticField.genericMethod()")); - assertEquals("genericMethod()", cls.getMethod("m1").getBody().getStatements().get(1).toString()); - } - } - - @Test - public void testGenericsWithAmbiguousMemberField() { - Launcher launcher = checkFile(false, "GenericsWithAmbiguousMemberField.java"); - } - @Test - public void testGenericsWithAmbiguousMemberFieldAutoImport() { - Launcher launcher = checkFile(true, "GenericsWithAmbiguousMemberField.java"); - } - - @Test - public void testAnnotationInChildWithConstants() { - Launcher launcher = checkFile(false, "ChildOfConstants.java", "Constants.java"); - } - - @Test - public void testAnnotationInChildWithConstantsAutoImport() { - Launcher launcher = checkFile(true, "ChildOfConstants.java", "Constants.java"); - } - - private static Launcher checkFile(boolean autoImports, String... fileName) { - Launcher launcher = new Launcher(); - launcher.getEnvironment().setAutoImports(autoImports); - - String pckg = "spoon/test/staticFieldAccess2/testclasses/"; - for (String fn : fileName) - { - launcher.addInputResource("src/test/java/"+pckg+fn); - } - String targetDir = "./target/spooned"+(autoImports?"-autoImports":""); - launcher.setSourceOutputDirectory(targetDir); - launcher.buildModel(); - launcher.prettyprint(); - for (String fn : fileName) - { - canBeBuilt(targetDir+"/"+pckg+fn, 8); - } - return launcher; - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.staticFieldAccess2; + +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.declaration.CtClass; +import spoon.test.staticFieldAccess2.testclasses.AmbiguousImplicitFieldReference; +import spoon.test.staticFieldAccess2.testclasses.ChildOfGenericsWithAmbiguousStaticField; +import spoon.test.staticFieldAccess2.testclasses.ImplicitFieldReference; +import spoon.test.staticFieldAccess2.testclasses.ImplicitStaticFieldReference; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static spoon.testing.utils.ModelUtils.canBeBuilt; + +public class ImplicitStaticFieldReferenceTest +{ + private static final boolean expectImplicit = false; + + @Test + public void testImplicitStaticFieldReference() { + Launcher launcher = checkFile(false, "ImplicitStaticFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(ImplicitStaticFieldReference.class); + assertEquals("return ImplicitStaticFieldReference", cls.getMethod("reader").getBody().getStatements().get(0).toString()); + assertEquals("ImplicitStaticFieldReference = value", cls.getMethodsByName("writer").get(0).getBody().getStatements().get(0).toString()); + assertEquals("reader()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + assertEquals("longWriter(7)", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(1).toString()); + } + } + + @Test + public void testImplicitStaticFieldReferenceAutoImport() { + Launcher launcher = checkFile(true, "ImplicitStaticFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(ImplicitStaticFieldReference.class); + assertEquals("return ImplicitStaticFieldReference", cls.getMethod("reader").getBody().getStatements().get(0).toString()); + assertEquals("ImplicitStaticFieldReference = value", cls.getMethodsByName("writer").get(0).getBody().getStatements().get(0).toString()); + assertEquals("reader()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + assertEquals("longWriter(7)", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(1).toString()); + } + } + + @Test + public void testImplicitFieldReference() { + Launcher launcher = checkFile(false, "ImplicitFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(ImplicitFieldReference.class); + assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); + assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); +// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); + assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + } + } + @Test + public void testImplicitFieldReferenceAutoImport() { + Launcher launcher = checkFile(true, "ImplicitFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(ImplicitFieldReference.class); + assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); + assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); +// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); + assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + } + } + + @Test + public void testAmbiguousImplicitFieldReference() { + Launcher launcher = checkFile(false, "AmbiguousImplicitFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(AmbiguousImplicitFieldReference.class); + assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); + assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); +// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); + assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + } + } + @Test + public void testAmbiguousImplicitFieldReferenceAutoImport() { + Launcher launcher = checkFile(true, "AmbiguousImplicitFieldReference.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(AmbiguousImplicitFieldReference.class); + assertEquals("return memberField", cls.getMethod("getMemberField").getBody().getStatements().get(0).toString()); + assertEquals("memberField = p_memberField", cls.getMethodsByName("setMemberField").get(0).getBody().getStatements().get(0).toString()); +// assertEquals("this.memberField = memberField", cls.getMethodsByName("setMemberField2").get(0).getBody().getStatements().get(0).toString()); + assertEquals("getMemberField()", cls.getMethodsByName("testLocalMethodInvocations").get(0).getBody().getStatements().get(0).toString()); + } + } + + @Test + public void testImplicitStaticClassAccess() { + Launcher launcher = checkFile(false, "ImplicitStaticClassAccess.java"); + } + @Test + public void testImplicitStaticClassAccessAutoImport() { + Launcher launcher = checkFile(true, "ImplicitStaticClassAccess.java"); + } + @Test + public void testGenericsWithAmbiguousStaticField() { + Launcher launcher = checkFile(false, "GenericsWithAmbiguousStaticField.java"); + } + @Test + public void testGenericsWithAmbiguousStaticFieldAutoImport() { + Launcher launcher = checkFile(true, "GenericsWithAmbiguousStaticField.java"); + } + + @Test + public void testChildOfGenericsWithAmbiguousStaticField() { + Launcher launcher = checkFile(false, "ChildOfGenericsWithAmbiguousStaticField.java"); + } + + @Test + public void testChildOfGenericsWithAmbiguousStaticFieldAutoImport() { + Launcher launcher = checkFile(true, "ChildOfGenericsWithAmbiguousStaticField.java"); + if(expectImplicit) { + CtClass cls = launcher.getFactory().Class().get(ChildOfGenericsWithAmbiguousStaticField.class); + //The toString of the method does not have a context of class, so it different result +// assertEquals("spoon.test.staticFieldAccess2.testclasses.GenericsWithAmbiguousStaticField.genericMethod()", cls.getMethod("m1").getBody().getStatements().get(0).toString()); + assertTrue(cls.toString().contains("spoon.test.staticFieldAccess2.testclasses.GenericsWithAmbiguousStaticField.genericMethod()")); + assertEquals("genericMethod()", cls.getMethod("m1").getBody().getStatements().get(1).toString()); + } + } + + @Test + public void testGenericsWithAmbiguousMemberField() { + Launcher launcher = checkFile(false, "GenericsWithAmbiguousMemberField.java"); + } + @Test + public void testGenericsWithAmbiguousMemberFieldAutoImport() { + Launcher launcher = checkFile(true, "GenericsWithAmbiguousMemberField.java"); + } + + @Test + public void testAnnotationInChildWithConstants() { + Launcher launcher = checkFile(false, "ChildOfConstants.java", "Constants.java"); + } + + @Test + public void testAnnotationInChildWithConstantsAutoImport() { + Launcher launcher = checkFile(true, "ChildOfConstants.java", "Constants.java"); + } + + private static Launcher checkFile(boolean autoImports, String... fileName) { + Launcher launcher = new Launcher(); + launcher.getEnvironment().setAutoImports(autoImports); + + String pckg = "spoon/test/staticFieldAccess2/testclasses/"; + for (String fn : fileName) + { + launcher.addInputResource("src/test/java/"+pckg+fn); + } + String targetDir = "./target/spooned"+(autoImports?"-autoImports":""); + launcher.setSourceOutputDirectory(targetDir); + launcher.buildModel(); + launcher.prettyprint(); + for (String fn : fileName) + { + canBeBuilt(targetDir+"/"+pckg+fn, 8); + } + return launcher; + } +} diff --git a/src/test/java/spoon/test/support/ResourceTest.java b/src/test/java/spoon/test/support/ResourceTest.java index 67553e57151..6991f59862c 100644 --- a/src/test/java/spoon/test/support/ResourceTest.java +++ b/src/test/java/spoon/test/support/ResourceTest.java @@ -18,9 +18,7 @@ import java.io.File; - import org.junit.jupiter.api.Test; - import spoon.Launcher; import spoon.SpoonModelBuilder; import spoon.compiler.SpoonFolder; diff --git a/src/test/java/spoon/test/targeted/TargetedExpressionTest.java b/src/test/java/spoon/test/targeted/TargetedExpressionTest.java index d1eb9349eff..ea2ba075da9 100644 --- a/src/test/java/spoon/test/targeted/TargetedExpressionTest.java +++ b/src/test/java/spoon/test/targeted/TargetedExpressionTest.java @@ -17,6 +17,7 @@ package spoon.test.targeted; +import java.util.List; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; @@ -54,8 +55,6 @@ import spoon.test.targeted.testclasses.Tapas; import spoon.testing.utils.ModelTest; -import java.util.List; - import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/spoon/test/template/ArrayResizeTemplate.java b/src/test/java/spoon/test/template/ArrayResizeTemplate.java index 74945524357..f6299a5b799 100644 --- a/src/test/java/spoon/test/template/ArrayResizeTemplate.java +++ b/src/test/java/spoon/test/template/ArrayResizeTemplate.java @@ -67,4 +67,4 @@ interface _Type_ { } interface _TargetType_ { -} \ No newline at end of file +} diff --git a/src/test/java/spoon/test/template/PatternTest.java b/src/test/java/spoon/test/template/PatternTest.java index 3aa493a8a1a..193d2cdb384 100644 --- a/src/test/java/spoon/test/template/PatternTest.java +++ b/src/test/java/spoon/test/template/PatternTest.java @@ -1,1668 +1,1667 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import spoon.Launcher; -import spoon.pattern.ConflictResolutionMode; -import spoon.pattern.Match; -import spoon.pattern.PatternParameterConfigurator; -import spoon.pattern.Pattern; -import spoon.pattern.PatternBuilder; -import spoon.pattern.PatternBuilderHelper; -import spoon.pattern.Quantifier; -import spoon.pattern.internal.parameter.ParameterInfo; -import spoon.reflect.code.CtBlock; -import spoon.reflect.code.CtInvocation; -import spoon.reflect.code.CtLiteral; -import spoon.reflect.code.CtStatement; -import spoon.reflect.code.CtTry; -import spoon.reflect.code.CtVariableRead; -import spoon.reflect.declaration.CtAnnotation; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.declaration.CtElement; -import spoon.reflect.declaration.CtMethod; -import spoon.reflect.declaration.CtType; -import spoon.reflect.declaration.CtTypeMember; -import spoon.reflect.declaration.ModifierKind; -import spoon.reflect.factory.Factory; -import spoon.reflect.meta.ContainerKind; -import spoon.reflect.path.CtRole; -import spoon.reflect.reference.CtExecutableReference; -import spoon.reflect.reference.CtTypeReference; -import spoon.reflect.visitor.filter.TypeFilter; -import spoon.support.compiler.FileSystemFile; -import spoon.support.util.ImmutableMap; -import spoon.support.util.ImmutableMapImpl; -import spoon.test.template.testclasses.LoggerModel; -import spoon.test.template.testclasses.ToBeMatched; -import spoon.test.template.testclasses.logger.Logger; -import spoon.test.template.testclasses.match.GenerateIfElse; -import spoon.test.template.testclasses.match.MatchForEach; -import spoon.test.template.testclasses.match.MatchForEach2; -import spoon.test.template.testclasses.match.MatchIfElse; -import spoon.test.template.testclasses.match.MatchMap; -import spoon.test.template.testclasses.match.MatchModifiers; -import spoon.test.template.testclasses.match.MatchMultiple; -import spoon.test.template.testclasses.match.MatchMultiple2; -import spoon.test.template.testclasses.match.MatchMultiple3; -import spoon.test.template.testclasses.match.MatchThrowables; -import spoon.test.template.testclasses.match.MatchWithParameterCondition; -import spoon.test.template.testclasses.match.MatchWithParameterType; -import spoon.test.template.testclasses.replace.DPPSample1; -import spoon.test.template.testclasses.replace.OldPattern; -import spoon.test.template.testclasses.types.AClassWithMethodsAndRefs; -import spoon.testing.utils.LineSeparatorExtension; -import spoon.testing.utils.ModelUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - - -// main test of Spoon's patterns -public class PatternTest { - - @Test - public void testMatchForeach() throws Exception { - //contract: a foreach template can also match inlined lists of statements - CtType ctClass = ModelUtils.buildClass(MatchForEach.class); - - CtType type = ctClass.getFactory().Type().get(MatchForEach.class); - - // create one pattern from matcher1, with one parameter "values" -// public void matcher1(List values) { -// for (String value : values) { -// System.out.println(value); -// } -// } - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("values").byVariable("values").setContainerKind(ContainerKind.LIST).matchInlinedStatements(); - }) - .build(); - - List matches = pattern.getMatches(ctClass); - - assertEquals(2, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(value)"), toListOfStrings(match.getMatchingElements())); - //FIX IT -// assertEquals(Arrays.asList(""), listToListOfStrings((List) match.getParameters().getValue("values"))); - } - { - Match match = matches.get(1); - assertEquals(Arrays.asList( - "java.lang.System.out.println(\"a\")", - "java.lang.System.out.println(\"Xxxx\")", - "java.lang.System.out.println(((java.lang.String) (null)))", - "java.lang.System.out.println(java.lang.Long.class.toString())"), toListOfStrings(match.getMatchingElements())); - assertEquals(Arrays.asList( - "\"a\"", - "\"Xxxx\"", - "((java.lang.String) (null))", - "java.lang.Long.class.toString()"), toListOfStrings((List) match.getParameters().getValue("values"))); - } - } - - @Test - public void testMatchForeachWithOuterSubstitution() throws Exception { - //contract: inline foreach templates can also match outer parameters - CtType ctClass = ModelUtils.buildClass(MatchForEach2.class); - - CtType type = ctClass.getFactory().Type().get(MatchForEach2.class); - - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("values").byVariable("values").setContainerKind(ContainerKind.LIST).matchInlinedStatements(); - // the variable "var" of the template is a parameter - pb.parameter("varName").byString("var"); - }) - .build(); - - List matches = pattern.getMatches(ctClass); - - assertEquals(3, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("int var = 0"), toListOfStrings(match.getMatchingElements())); - //FIX IT -// assertEquals(Arrays.asList(""), listToListOfStrings((List) match.getParameters().getValue("values"))); - } - { - Match match = matches.get(1); - assertEquals(Arrays.asList( - "int cc = 0", - "java.lang.System.out.println(\"Xxxx\")", - "cc++", - "java.lang.System.out.println(((java.lang.String) (null)))", - "cc++"), toListOfStrings(match.getMatchingElements())); - - // correctly matching the outer parameter - assertEquals("cc", match.getParameters().getValue("varName")); - } - { - Match match = matches.get(2); - assertEquals(Arrays.asList( - "int dd = 0", - "java.lang.System.out.println(java.lang.Long.class.toString())", - "dd++"), toListOfStrings(match.getMatchingElements())); - - // correctly matching the outer parameter - assertEquals("dd", match.getParameters().getValue("varName")); - } - } - - @Test - public void testMatchIfElse() throws Exception { - //contract: if statements can be inlined - // meaning, either the if branch or the else branch can be matched independently - - // in this example the main if statement starting with "if (option) {" - // is inlined, and any of the branch can be matched - CtType ctClass = ModelUtils.buildClass(MatchIfElse.class); - - CtType type = ctClass.getFactory().Type().get(MatchIfElse.class); - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("option").byVariable("option"); - pb.parameter("value").byFilter(new TypeFilter(CtLiteral.class)); - }) - //we have to configure inline statements after all expressions - //of combined if statement are marked as pattern parameters - .configureInlineStatements(lsb -> lsb.inlineIfOrForeachReferringTo("option")) - .build(); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - // we only match the calls having a string literal as parameter or a float - assertEquals(5, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); - assertEquals(true, match.getParameters().getValue("option")); - assertEquals("\"a\"", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(1); - assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - assertEquals(true, match.getParameters().getValue("option")); - assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(2); - assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); - assertEquals(true, match.getParameters().getValue("option")); - assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(4); - assertEquals(Arrays.asList("java.lang.System.out.println(3.14)"), toListOfStrings(match.getMatchingElements())); - assertEquals(false, match.getParameters().getValue("option")); - assertEquals("3.14", match.getParameters().getValue("value").toString()); - } - } - - @Test - public void testGenerateIfElse() throws Exception { - //contract: it is possible to generate code using optional targets - CtType type = ModelUtils.buildClass(GenerateIfElse.class); - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("generator").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("option").byVariable("option"); - }) - //we have to configure inline statements after all expressions - //of combined if statement are marked as pattern parameters - .configureInlineStatements(lsb -> lsb.inlineIfOrForeachReferringTo("option")) - //contract: it is possible to configure pattern parameters after their parent is inlined - .configurePatternParameters(pb -> { - pb.parameter("value").byFilter(new TypeFilter(CtLiteral.class)); - }) - .build(); - - { - List statements = pattern.generator().generate( - new ImmutableMapImpl().putValue("option", true).putValue("value", "spoon")); - assertEquals(1, statements.size()); - assertEquals("java.lang.System.out.print(\"spoon\")", statements.get(0).toString()); - } - { - List statements = pattern.generator().generate( - new ImmutableMapImpl().putValue("option", false).putValue("value", 2.1)); - assertEquals(1, statements.size()); - assertEquals("java.lang.System.out.println(2.1)", statements.get(0).toString()); - } - } - - @Test - public void testGenerateMultiValues() throws Exception { - // contract: the pattern parameter (in this case 'statements') - // can have type List and can be replaced by list of elements - //(in this case by list of statements) - - // here, in particular, we test method "substitute" - - - // setup of the test - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - Factory factory = ctClass.getFactory(); - - Pattern pattern = MatchMultiple.createPattern(null, null, null); - ImmutableMap params = new ImmutableMapImpl(); - - // created in "MatchMultiple.createPattern", matching a literal "something" - // so "something" is replaced by "does it work?" - params = params.putValue("printedValue", "does it work?"); - - List statementsToBeAdded = Arrays.asList(new CtStatement[] {factory.createCodeSnippetStatement("int foo = 0"), factory.createCodeSnippetStatement("foo++")}); - //statementsToBeAdded = ctClass.getMethodsByName("testMatch1").get(0).getBody().getStatements().subList(0, 3); // we don't use this in order not to mix the matching and the transformation - - // created in "MatchMultiple.createPattern", matching a method "statements" - params = params.putValue("statements", statementsToBeAdded); - - List generated = pattern.generator().generate(params); - assertEquals(Arrays.asList( - //these statements comes from `statements` parameter value - "int foo = 0", - "foo++", - //this statement comes from pattern model, just the string literal comes from parameter `printedValue` - "java.lang.System.out.println(\"does it work?\")"), generated.stream().map(Object::toString).collect(Collectors.toList())); - } - - @Test - public void testMatchGreedyMultiValueUnlimited() throws Exception { - //contract: there is a way to match absolutely any kind of statement, in an unlimited list - - //explanation: multivalue parameter (setContainerKind(ContainerKind.LIST) can match multiple nodes in a row. - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - - Pattern pattern = MatchMultiple.createPattern(null, null, null); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - assertEquals(1, matches.size()); - Match match = matches.get(0); - //check that absolutely all statements from "testMatch1" are matched - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", - "java.lang.System.out.println(\"Xxxx\")", - "java.lang.System.out.println(((java.lang.String) (null)))", - "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", - "java.lang.System.out.println(\"Xxxx\")", - "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); - - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); - } - - @Test - public void testMatchGreedyMultiValueMaxCountLimit() throws Exception { - //contract: it is possible to stop matching after a specific number of times - // This is done with method parameterBuilder.setMaxOccurrence(maxCount) - - // explanation: greedy matching eats everything until max count = 3 - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - Pattern pattern = MatchMultiple.createPattern(null, null, 3); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - assertEquals(2, matches.size()); - { - Match match = matches.get(0); - //check 3 + 1 statements are matched - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", - "java.lang.System.out.println(\"Xxxx\")" - ), toListOfStrings(match.getMatchingElements())); - - //check 3 statements are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //4th statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); - } - { - Match match = matches.get(1); - //check remaining next 2 statements are matched - assertEquals(Arrays.asList( - "java.lang.System.out.println(((java.lang.String) (null)))", - "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); - } - } - - @Test - public void testMatchReluctantMultivalue() throws Exception { - //contract: reluctant matching (Quantifier.RELUCTANT) matches only the minimal amount of time - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - - Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, null, null); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - assertEquals(3, matches.size()); - { - Match match = matches.get(0); - //check all statements are matched - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... - "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); - } - { - Match match = matches.get(1); - //check all statements are matched - assertEquals(Arrays.asList( - "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList(), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("((java.lang.String) (null))", match.getParameters().getValue("printedValue").toString()); - } - { - Match match = matches.get(2); - //check all statements are matched - assertEquals(Arrays.asList( - "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList(), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); - } - } - - @Test - public void testMatchReluctantMultivalueMinCount1() throws Exception { - //contract: one can do reluctant matches with a minCount of 1 node - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - - Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, 1, null); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - assertEquals(2, matches.size()); - { - Match match = matches.get(0); - //check all statements are matched - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... - "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); - } - { - Match match = matches.get(1); - //check all statements are matched - assertEquals(Arrays.asList( - "java.lang.System.out.println(((java.lang.String) (null)))", - "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); - - //check all statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); - } - } - - @Test - public void testMatchReluctantMultivalueExactly2() throws Exception { - //contract: one can do reluctant matches min 2 nodes and max 2 nodes - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - - Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, 2, 2); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - assertEquals(1, matches.size()); - { - Match match = matches.get(0); - //check only 2 statements are matched + next one - assertEquals(Arrays.asList( - "i++", - "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... - "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - - //check 2 statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "i++", - "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); - } - } - - @Test - public void testMatchPossesiveMultiValueUnlimited() throws Exception { - //contract: possessive matching eats everything - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - Pattern pattern = MatchMultiple.createPattern(Quantifier.POSSESSIVE, null, null); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); - - // template: -// public void matcher1() { -// statements(); -// System.out.println("something"); -// } - - // Quantifier.POSSESSIVE matches all elements by statements() and there remains no element for mandatory single match of System.out.println("something");, - // consequently, no match of the full template - assertEquals(0, matches.size()); - } - - @Test - public void testMatchPossesiveMultiValueMaxCount4() throws Exception { - //contract: maxCount (#setMaxOccurrence) can be used to stop Quantifier.POSSESSIVE for matching too much - CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); - - // note that if we set maxCount = 3, it fails because there is one dangling statement before System.out.println("something") - Pattern pattern = MatchMultiple.createPattern(Quantifier.POSSESSIVE, null, 4); - - List matches = pattern.getMatches(ctClass); - - // only testMatch1 is matched - // method matcher1, from which the template has been built, is not matched - // because the possessive quantifier eats its two statements, here remains nothing for the second template statement, which cannot match then. - assertEquals(1, matches.size()); - Match match = matches.get(0); - - //check 4 statements are matched + last template - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", - "java.lang.System.out.println(\"Xxxx\")", - "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); - - //check 4 statements excluding last are stored as value of "statements" parameter - assertEquals(Arrays.asList( - "int i = 0", - "i++", - "java.lang.System.out.println(i)", - "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings((List) match.getParameters().getValue("statements"))); - //last statement is matched by last template, which saves printed value - assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); - assertEquals("((java.lang.String) (null))", match.getParameters().getValue("printedValue").toString()); - } - - @Test - public void testMatchPossesiveMultiValueMinCount() throws Exception { - //contract: there is a correct interplay between for possessive matching with min count limit and with GREEDY matching - - // pattern -// public void matcher1() { -// statements1.S(); // Quantifier.GREEDY -// statements2.S(); // Quantifier.POSSESSIVE with setMinOccurrence and setMaxOccurrence set -// System.out.println("something"); // "something" -> anything -// } - - CtType ctClass = ModelUtils.buildClass(MatchMultiple3.class); - - // trying with all values of "count" - for (int count = 0; count < 6; count++) { - final int countFinal = count; - CtType type = ctClass.getFactory().Type().get(MatchMultiple3.class); - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters() - .configurePatternParameters(pb -> { - pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY); - pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.POSSESSIVE).setMinOccurrence(countFinal).setMaxOccurrence(countFinal); - pb.parameter("printedValue").byFilter((CtLiteral literal) -> "something".equals(literal.getValue())); - }) - .build(); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); - - // Quantifier.POSSESSIVE matches exactly the right number of times - assertEquals(countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count="+countFinal); - - // Quantifier.GREEDY gets the rest - assertEquals(5-countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count="+countFinal); - } - } - - @Test - public void testMatchPossesiveMultiValueMinCount2() throws Exception { - //contract: there is a correct interplay between for possessive matching with min count limit and with GREEDY matching - - // pattern: -// public void matcher1(List something) { -// statements1.S(); // Quantifier.GREEDY -// statements2.S(); // Quantifier.POSSESSIVE with setMinOccurrence and setMaxOccurrence set -// for (String v : something) { -// System.out.println(v); // can be inlined -// } -// } -// - - CtType ctClass = ModelUtils.buildClass(MatchMultiple2.class); - - // trying with all values of "count" - for (int count = 0; count < 5; count++) { - final int countFinal = count; - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.byTemplateParameter(); - pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY); - pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.POSSESSIVE).setMinOccurrence(countFinal).setMaxOccurrence(countFinal); - pb.parameter("inlinedSysOut").byVariable("something").setMatchingStrategy(Quantifier.POSSESSIVE).setContainerKind(ContainerKind.LIST).setMinOccurrence(2).matchInlinedStatements(); - }) - .build(); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); - //the last template has nothing to match -> no match - assertEquals(1, matches.size(), "count="+countFinal); - assertEquals(4-countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count="+countFinal); - assertEquals(countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count="+countFinal); - assertEquals(2, getCollectionSize(matches.get(0).getParameters().getValue("inlinedSysOut")), "count="+countFinal); - } - - for (int count = 5; count < 7; count++) { - final int countFinal = count; - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters().build(); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); - //the possessive matcher eats too much. There is no target element for last `printedValue` variable - assertEquals(0, matches.size(), "count="+countFinal); - } - } - - @Test - public void testMatchGreedyMultiValueMinCount2() throws Exception { - //contract: check possessive matching with min count limit and GREEDY back off - CtType ctClass = ModelUtils.buildClass(MatchMultiple2.class); - for (int i = 0; i < 7; i++) { - final int count = i; - CtType type = ctClass.getFactory().Type().get(MatchMultiple2.class); - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.byTemplateParameter(); - pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.RELUCTANT); - pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY).setMaxOccurrence(count); - pb.parameter("printedValue").byVariable("something").matchInlinedStatements(); - pb.parameter("printedValue").setMatchingStrategy(Quantifier.GREEDY).setContainerKind(ContainerKind.LIST).setMinOccurrence(2); - }) - .build(); - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); - - - if (count < 7) { - //the last template has nothing to match -> no match - assertEquals(1, matches.size(), "count=" + count); - assertEquals(Math.max(0, 3 - count), getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count=" + count); - assertEquals(count - Math.max(0, count - 4), getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count=" + count); - assertEquals(Math.max(2, 3 - Math.max(0, count - 3)), getCollectionSize(matches.get(0).getParameters().getValue("printedValue")), "count=" + count); - } else { - //the possessive matcher eats too much. There is no target element for last `printedValue` variable - assertEquals(0, matches.size(), "count=" + count); - } - } - } - - /** returns the size of the list of 0 is list is null */ - private int getCollectionSize(Object list) { - if (list instanceof Collection) { - return ((Collection) list).size(); - } - if (list == null) { - return 0; - } - fail("Unexpected object of type " + list.getClass()); - return -1; - } - - @Test - public void testMatchParameterValue() throws Exception { - //contract: if matching on the pattern itself, the matched parameter value is the original AST node from the pattern - // see last assertSame of this test - CtType ctClass = ModelUtils.buildClass(MatchWithParameterType.class); - - // pattern is System.out.println(value); - - // pattern: a call to System.out.println with anything as parameter - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - // anything in place of the variable reference value can be matched - pb.parameter("value").byVariable("value"); - }) - .build(); - - List matches = pattern.getMatches(ctClass); - - // specifying Match#toString - assertEquals("{\n" + - "value=value\n" + - "}\n" + - "----------\n" + - "1) java.lang.System.out.println(value)", matches.get(0).toString()); - - // we match in the whole class, which means the original matcher statements and the ones from testMatcher1 - - assertEquals(5, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(value)"), toListOfStrings(match.getMatchingElements())); - Object value = match.getParameters().getValue("value"); - assertTrue(value instanceof CtVariableRead); - assertEquals("value", value.toString()); - //contract: the value is reference to found node (not a clone) - assertTrue(((CtElement)value).isParentInitialized()); - assertSame(CtRole.ARGUMENT, ((CtElement)value).getRoleInParent()); - } - } - - @Test - public void testMatchParameterValueType() throws Exception { - // contract: pattern parameters can be restricted to only certain types - // in this test case, we only match CtLiteral - CtType ctClass = ModelUtils.buildClass(MatchWithParameterType.class); - { - // now we match only the ones with a literal as parameter - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("value").byVariable("value"); - pb.setValueType(CtLiteral.class); - }) - .build(); - - List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); - - // there are 3 System.out.println with a literal as parameter - assertEquals(3, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("\"a\"", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(1); - assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); - } - { - // in Java, null is considered as a literal - Match match = matches.get(2); - assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); - } - } - { - // now we match a System.out.println with an invocation as paramter - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("value").byVariable("value"); - pb.setValueType(CtInvocation.class); - }) - .build(); - - List matches = pattern.getMatches(ctClass); - - assertEquals(1, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(java.lang.Long.class.toString())"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtInvocation); - assertEquals("java.lang.Long.class.toString()", match.getParameters().getValue("value").toString()); - } - - } - } - - @Test - public void testMatchParameterCondition() throws Exception { - //contract: pattern parameters support conditions passed as lambda - //if the value isn't matching then node is not matched - CtType ctClass = ModelUtils.buildClass(MatchWithParameterCondition.class); - { - // matching a System.out.println with a literal - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("value").byVariable("value"); - pb.byCondition(null, (Object value) -> value instanceof CtLiteral); - }) - .build(); - - List matches = pattern.getMatches(ctClass); - - assertEquals(3, matches.size()); - { - Match match = matches.get(0); - assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("\"a\"", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(1); - assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); - } - { - Match match = matches.get(2); - assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); - assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); - assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); - } - } - } - - @Test - public void testMatchOfAttribute() throws Exception { - // contract: it is possible to match nodes based on their roles - // tested methods: ParameterBuilder#byRole and ParameterBuilder#byString - CtType ctClass = ModelUtils.buildClass(MatchModifiers.class); - { - //match all methods with arbitrary name, modifiers, parameters, but with empty body and return type void - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); - pb.parameter("methodName").byString("matcher1"); - pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); - }) - .build(); - List matches = pattern.getMatches(ctClass); - - // three methods are matched - assertEquals(3, matches.size()); - { - Match match = matches.get(0); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(3, match.getParametersMap().size()); - assertEquals("matcher1", match.getParametersMap().get("methodName")); - assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PUBLIC)), match.getParametersMap().get("modifiers")); - assertEquals(Arrays.asList(), match.getParametersMap().get("parameters")); - } - { - Match match = matches.get(1); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("publicStaticMethod", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(3, match.getParametersMap().size()); - assertEquals("publicStaticMethod", match.getParametersMap().get("methodName")); - assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PUBLIC, ModifierKind.STATIC)), match.getParametersMap().get("modifiers")); - assertEquals(Arrays.asList(), match.getParametersMap().get("parameters")); - } - { - Match match = matches.get(2); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("packageProtectedMethodWithParam", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(3, match.getParametersMap().size()); - assertEquals("packageProtectedMethodWithParam", match.getParametersMap().get("methodName")); - assertEquals(new HashSet<>(), match.getParametersMap().get("modifiers")); - assertEquals(2, ((List) match.getParametersMap().get("parameters")).size()); - } - } - { - //match all methods with arbitrary name, modifiers, parameters and body, but with return type void - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); - pb.parameter("methodName").byString("matcher1"); - pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); - pb.parameter("statements").byRole(CtRole.STATEMENT, new TypeFilter(CtBlock.class)); - }) - .build(); - List matches = pattern.getMatches(ctClass); - // same as before + one more method: withBody - assertEquals(4, matches.size()); - { - Match match = matches.get(3); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("withBody", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(4, match.getParametersMap().size()); - assertEquals("withBody", match.getParametersMap().get("methodName")); - assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PRIVATE)), match.getParametersMap().get("modifiers")); - assertEquals(0, ((List) match.getParametersMap().get("parameters")).size()); - assertEquals(2, ((List) match.getParametersMap().get("statements")).size()); - assertEquals("this.getClass()", ((List) match.getParametersMap().get("statements")).get(0).toString()); - assertEquals("java.lang.System.out.println()", ((List) match.getParametersMap().get("statements")).get(1).toString()); - } - } - } - - @Test - public void testMatchOfMapAttribute() throws Exception { - //contract: there is support for matching annotations with different annotation values - CtType matchMapClass = ModelUtils.buildClass(MatchMap.class); - { - CtType type = matchMapClass.getFactory().Type().get(MatchMap.class); - // create a pattern from method matcher1 - // match all methods with arbitrary name, and annotation @Check, parameters, but with empty body and return type void -// @Check() -// void matcher1() { -// } - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - //match any value of @Check annotation to parameter `testAnnotations` - pb.parameter("__pattern_param_annot").byRole(CtRole.VALUE, new TypeFilter(CtAnnotation.class)).setContainerKind(ContainerKind.MAP); - //match any method name - pb.parameter("__pattern_param_method_name").byString("matcher1"); - }) - .build(); - - // we apply the pattern on MatchMap - List matches = pattern.getMatches(matchMapClass); - assertEquals(3, matches.size()); - { - // first match: matcher1 itself (normal) - Match match = matches.get(0); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(2, match.getParametersMap().size()); - assertEquals("matcher1", match.getParametersMap().get("__pattern_param_method_name")); - Map values = getMap(match, "__pattern_param_annot"); - assertEquals(0, values.size()); - } - { - // first match: m1 itself (normal) -// @Check(value = "xyz") -// void m1() { -// } - Match match = matches.get(1); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("m1", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(2, match.getParametersMap().size()); - assertEquals("m1", match.getParametersMap().get("__pattern_param_method_name")); - Map values = getMap(match, "__pattern_param_annot"); - assertEquals(1, values.size()); - assertEquals("\"xyz\"", values.get("value").toString()); - } - { - // second match: m2, it also contains a timeout value - Match match = matches.get(2); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("m2", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(2, match.getParametersMap().size()); - assertEquals("m2", match.getParametersMap().get("__pattern_param_method_name")); - Map values = getMap(match, "__pattern_param_annot"); - assertEquals(2, values.size()); - assertEquals("\"abc\"", values.get("value").toString()); - assertEquals("123", values.get("timeout").toString()); - } - } - } - - @Test - public void testMatchOfMapAttributeAndOtherAnnotations() throws Exception { - //contract: match a pattern with an "open" annotation (different annotations can be matched) - // same test but with one more pattern parameter: allAnnotations - CtType ctClass = ModelUtils.buildClass(MatchMap.class); - { - CtType type = ctClass.getFactory().Type().get(MatchMap.class); - // create a pattern from method matcher1 - // match all methods with arbitrary name, with any annotation set, Test modifiers, parameters, but with empty body and return type void - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - //match any value of @Check annotation to parameter `testAnnotations` - //match any method name - pb.parameter("methodName").byString("matcher1"); - // match on any annotation - pb.parameter("allAnnotations") - .setConflictResolutionMode(ConflictResolutionMode.APPEND) - .byRole(CtRole.ANNOTATION, new TypeFilter<>(CtMethod.class)) - ; - pb.parameter("CheckAnnotationValues").byRole(CtRole.VALUE, new TypeFilter(CtAnnotation.class)).setContainerKind(ContainerKind.MAP); - }) - .build(); - List matches = pattern.getMatches(ctClass); - - // we match the same methods in MatchMap as testMatchOfMapAttribute - assertEquals(4, matches.size()); - // the new one is the one with deprecated - { - Match match = matches.get(3); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("deprecatedTestAnnotation2", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(3, match.getParametersMap().size()); - assertEquals("deprecatedTestAnnotation2", match.getParametersMap().get("methodName")); - assertEquals("{timeout=4567}", getMap(match, "CheckAnnotationValues").toString()); - assertEquals("@java.lang.Deprecated", match.getParameters().getValue("allAnnotations").toString()); - } - - } - } - - @Test - public void testMatchOfMapKeySubstring() throws Exception { - //contract: one can capture in parameters a key in an annotation key -> value map - CtType ctClass = ModelUtils.buildClass(MatchMap.class); - { - // match all methods with arbitrary name, and Annotation Test modifiers, parameters, but with empty body and return type void - CtType type = ctClass.getFactory().Type().get(MatchMap.class); - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("m1").getPatternElements()) - .configurePatternParameters(pb -> { - //match any value of @Check annotation to parameter `testAnnotations` - pb.parameter("CheckKey").bySubstring("value"); - pb.parameter("CheckValue").byFilter((CtLiteral lit) -> true); - //match any method name - pb.parameter("methodName").byString("m1"); - //match on all annotations of method - pb.parameter("allAnnotations") - .setConflictResolutionMode(ConflictResolutionMode.APPEND) - .byRole(CtRole.ANNOTATION, new TypeFilter<>(CtMethod.class)); - }) - .build(); - List matches = pattern.getMatches(ctClass); - assertEquals(2, matches.size()); - { - Match match = matches.get(0); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("m1", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(3, match.getParametersMap().size()); - assertEquals("m1", match.getParametersMap().get("methodName")); - assertEquals("value", match.getParameters().getValue("CheckKey").toString()); - assertEquals("\"xyz\"", match.getParameters().getValue("CheckValue").toString()); - } - { - Match match = matches.get(1); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("deprecatedTestAnnotation2", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(4, match.getParametersMap().size()); - assertEquals("deprecatedTestAnnotation2", match.getParametersMap().get("methodName")); - assertEquals("timeout", match.getParameters().getValue("CheckKey").toString()); - assertEquals("4567", match.getParameters().getValue("CheckValue").toString()); - assertEquals("@java.lang.Deprecated", match.getParameters().getValue("allAnnotations").toString()); - } - } - } - - @Test - public void testMatchInSet() throws Exception { - // contract: the container type "Set" is supported to match set-related AST nodes (e.g. the throws clause) - // tested method: setContainerKind(ContainerKind.SET) - CtType ctClass = ModelUtils.buildClass(MatchThrowables.class); - Factory f = ctClass.getFactory(); - - // we match a method with any "throws" clause - // and the match "throws" are captured in the parameter - Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) - .configurePatternParameters(pb -> { - pb.parameter("otherThrowables") - //add matcher for other arbitrary throwables - .setConflictResolutionMode(ConflictResolutionMode.APPEND) - .setContainerKind(ContainerKind.SET) - .setMinOccurrence(0) - .byRole(CtRole.THROWN, new TypeFilter(CtMethod.class)); - }) - .configurePatternParameters(pb -> { - //define other parameters too to match all kinds of methods - pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); - pb.parameter("methodName").byString("matcher1"); - pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); - pb.parameter("statements").byRole(CtRole.STATEMENT, new TypeFilter(CtBlock.class)); - }) - .build(); - String str = pattern.toString(); - List matches = pattern.getMatches(ctClass); - assertEquals(4, matches.size()); - { - Match match = matches.get(0); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); - } - { - Match match = matches.get(1); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("sample2", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(new HashSet(Arrays.asList( - "java.lang.UnsupportedOperationException", - "java.lang.IllegalArgumentException")), - ((Set>) match.getParameters().getValue("otherThrowables")) - .stream().map(e->e.toString()).collect(Collectors.toSet())); - } - { - Match match = matches.get(2); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("sample3", match.getMatchingElement(CtMethod.class).getSimpleName()); - assertEquals(new HashSet(Arrays.asList( - "java.lang.IllegalArgumentException")), - ((Set>) match.getParameters().getValue("otherThrowables")) - .stream().map(e->e.toString()).collect(Collectors.toSet())); - } - { - // now looking at sample4 - Match match = matches.get(3); - assertEquals(1, match.getMatchingElements().size()); - assertEquals("sample4", match.getMatchingElement(CtMethod.class).getSimpleName()); - - // sample4 has exactly the expected exceptions. But there are no other exceptions, so match.getParameters().getValue("otherThrowables") is null - assertNull(match.getParameters().getValue("otherThrowables")); - } - } - - private List toListOfStrings(List list) { - if (list == null) { - return Collections.emptyList(); - } - List strings = new ArrayList<>(list.size()); - for (Object obj : list) { - strings.add(obj == null ? "null" : obj.toString()); - } - return strings; - } - - private MapBuilder map() { - return new MapBuilder(); - } - - class MapBuilder extends LinkedHashMap { - public MapBuilder put(String key, Object value) { - super.put(key, value); - return this; - } - } - - @Test - public void testPatternParameters() { - //contract: all the parameters of Pattern are available through getParameterInfos - Factory f = ModelUtils.build( - new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), - new File("./src/test/java/spoon/test/template/testclasses/replace") - ); - Pattern p = OldPattern.createPatternFromMethodPatternModel(f); - Map parameterInfos = p.getParameterInfos(); - // the pattern has all usages of variable "params" and "item" - assertEquals(15, parameterInfos.size()); - // .. which are - assertEquals(new HashSet<>(Arrays.asList("next","item","startPrefixSpace","printer","start", - "statements","nextPrefixSpace","startSuffixSpace","elementPrinterHelper", - "endPrefixSpace","startKeyword","useStartKeyword","end","nextSuffixSpace","getIterable" - )), parameterInfos.keySet()); - - // the map from getParameterInfos is consistent - for (Map.Entry e : parameterInfos.entrySet()) { - assertEquals(e.getKey(), e.getValue().getName()); - } - } - - @Test - @ExtendWith(LineSeparatorExtension.class) - public void testPatternToString() { - //contract: Pattern can be printed to String and each parameter is defined there - String nl = System.getProperty("line.separator"); - Factory f = ModelUtils.build( - new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), - new File("./src/test/java/spoon/test/template/testclasses/replace") - ); - Pattern p = OldPattern.createPatternFromMethodPatternModel(f); - assertEquals("if (/* CtInvocation"+nl+"" + - "/ <= ${useStartKeyword}"+nl+"" + - " */"+nl+"" + - "useStartKeyword()) {"+nl+"" + - " /* CtInvocation"+nl+"" + - " /argument/ <= ${startKeyword}"+nl+"" + - " */"+nl+"" + - " /* CtInvocation"+nl+"" + - " /target/ <= ${printer}"+nl+"" + - " */"+nl+"" + - " /* CtInvocation"+nl+"" + - " / <= ${printer}"+nl+"" + - " */"+nl+"" + - " printer().writeSpace().writeKeyword(/* CtInvocation"+nl+"" + - " / <= ${startKeyword}"+nl+"" + - " */"+nl+"" + - " startKeyword()).writeSpace();"+nl+"" + - "}"+nl+"" + - "try (final spoon.reflect.visitor.ListPrinter lp = /* CtInvocation"+nl+"" + - "/argument/ <= ${end}"+nl+"" + - "/target/ <= ${elementPrinterHelper}"+nl+"" + - " */"+nl+"" + - "/* CtInvocation"+nl+"" + - "/ <= ${elementPrinterHelper}"+nl+"" + - " */"+nl+"" + - "elementPrinterHelper().createListPrinter(/* CtInvocation"+nl+"" + - "/ <= ${startPrefixSpace}"+nl+"" + - " */"+nl+"" + - "startPrefixSpace(), /* CtInvocation"+nl+"" + - "/ <= ${start}"+nl+"" + - " */"+nl+"" + - "start(), /* CtInvocation"+nl+"" + - "/ <= ${startSuffixSpace}"+nl+"" + - " */"+nl+"" + - "startSuffixSpace(), /* CtInvocation"+nl+"" + - "/ <= ${nextPrefixSpace}"+nl+"" + - " */"+nl+"" + - "nextPrefixSpace(), /* CtInvocation"+nl+"" + - "/ <= ${next}"+nl+"" + - " */"+nl+"" + - "next(), /* CtInvocation"+nl+"" + - "/ <= ${nextSuffixSpace}"+nl+"" + - " */"+nl+"" + - "nextSuffixSpace(), /* CtInvocation"+nl+"" + - "/ <= ${endPrefixSpace}"+nl+"" + - " */"+nl+"" + - "endPrefixSpace(), /* CtInvocation"+nl+"" + - "/ <= ${end}"+nl+"" + - " */"+nl+"" + - "end())) {"+nl+"" + - " /* CtForEach"+nl+"" + - " /expression/ <= ${getIterable}"+nl+"" + - " /foreachVariable/ <= ${item}"+nl+"" + - " */"+nl+"" + - " for (/* CtLocalVariable"+nl+"" + - " / <= ${item}"+nl+"" + - " */"+nl+"" + - " java.lang.Object item : /* CtInvocation"+nl+"" + - " / <= ${getIterable}"+nl+"" + - " */"+nl+"" + - " getIterable()) /* CtBlock"+nl+"" + - " /statement/ <= ${statements}"+nl+"" + - " */"+nl+"" + - " {"+nl+"" + - " lp.printSeparatorIfAppropriate();"+nl+"" + - " /* CtInvocation"+nl+"" + - " / <= ${statements}"+nl+"" + - " */"+nl+"" + - " statements();"+nl+"" + - " }"+nl+"" + - "}"+nl, p.print(true)); - } - - @Test - public void testPatternToStringNoComments() { - //contract: Pattern can be printed to String without parameters - String nl = System.getProperty("line.separator"); - Factory f = ModelUtils.build( - new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), - new File("./src/test/java/spoon/test/template/testclasses/replace") - ); - Pattern p = OldPattern.createPatternFromMethodPatternModel(f); - assertEquals("if (useStartKeyword()) {" + nl + - " printer().writeSpace().writeKeyword(startKeyword()).writeSpace();" + nl + - "}" + nl + - "try (final spoon.reflect.visitor.ListPrinter lp = elementPrinterHelper().createListPrinter(startPrefixSpace(), start(), startSuffixSpace(), nextPrefixSpace(), next(), nextSuffixSpace(), endPrefixSpace(), end())) {" + nl + - " for (java.lang.Object item : getIterable()) {" + nl + - " lp.printSeparatorIfAppropriate();" + nl + - " statements();" + nl + - " }" + nl + - "}" + nl, p.print(false)); - } - - @Test - public void testMatchSample1() { - // contract: a super complex pattern is well matched - Factory f = ModelUtils.build( - new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), - new File("./src/test/java/spoon/test/template/testclasses/replace") - ); - CtClass classDJPP = f.Class().get(DPPSample1.class); - assertNotNull(classDJPP); - assertFalse(classDJPP.isShadow()); - - CtType type = f.Type().get(OldPattern.class); - // Create a pattern from all statements of OldPattern#patternModel - Pattern p = PatternBuilder - .create(new PatternBuilderHelper(type).setBodyOfMethod("patternModel").getPatternElements()) - .configurePatternParameters((PatternParameterConfigurator pb) -> pb - // creating patterns parameters for all references to "params" and "items" - .byFieldAccessOnVariable("params").byFieldAccessOnVariable("item") - .parameter("statements").setContainerKind(ContainerKind.LIST) - ) - .configurePatternParameters() - .configureInlineStatements(ls -> ls.inlineIfOrForeachReferringTo("useStartKeyword")) - .build(); - - // so let's try to match this complex pattern on DJPP - List matches = p.getMatches(classDJPP); - - // there are two results (the try-with-resource in each method) - assertEquals(2, matches.size()); - ImmutableMap params = matches.get(0).getParameters(); - assertEquals("\"extends\"", params.getValue("startKeyword").toString()); - assertEquals(Boolean.TRUE, params.getValue("useStartKeyword")); - assertEquals("false", params.getValue("startPrefixSpace").toString()); - assertEquals("null", params.getValue("start").toString()); - assertEquals("false", params.getValue("startSuffixSpace").toString()); - assertEquals("false", params.getValue("nextPrefixSpace").toString()); - assertEquals("\",\"", params.getValue("next").toString()); - assertEquals("true", params.getValue("nextSuffixSpace").toString()); - assertEquals("false", params.getValue("endPrefixSpace").toString()); - assertEquals("\";\"", params.getValue("end").toString()); - assertEquals("ctEnum.getEnumValues()", params.getValue("getIterable").toString()); - assertEquals("[scan(enumValue)]", params.getValue("statements").toString()); - - params = matches.get(1).getParameters(); - // all method arguments to createListPrinter have been matched - assertNull(params.getValue("startKeyword")); - assertEquals(Boolean.FALSE, params.getValue("useStartKeyword")); - assertEquals("false", params.getValue("startPrefixSpace").toString()); - assertEquals("null", params.getValue("start").toString()); - assertEquals("false", params.getValue("startSuffixSpace").toString()); - assertEquals("false", params.getValue("nextPrefixSpace").toString()); - assertEquals("\",\"", params.getValue("next").toString()); - assertEquals("true", params.getValue("nextSuffixSpace").toString()); - assertEquals("false", params.getValue("endPrefixSpace").toString()); - assertEquals("\";\"", params.getValue("end").toString()); - assertEquals("ctEnum.getEnumValues()", params.getValue("getIterable").toString()); - assertEquals("[scan(enumValue)]", params.getValue("statements").toString()); - - // additional test for ImmutableMap - assertEquals(params.asMap(), params.checkpoint().asMap()); - } - - @Test - public void testAddGeneratedBy() throws Exception { - //contract: by default "generated by" comments are not generated - //contract: generated by comments can be switched ON/OFF later - - // creating a pattern from AClassWithMethodsAndRefs - CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); - Factory factory = templateModel.getFactory(); - Pattern pattern = PatternBuilder.create(templateModel).setAddGeneratedBy(true).build(); - } - - @Test - public void testGenerateClassWithSelfReferences() throws Exception { - // main contract: a class with methods and fields can be generated with method #createType - // in particular, all the references to the origin class are replace by reference to the new class cloned class - - // creating a pattern from AClassWithMethodsAndRefs - CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); - Factory factory = templateModel.getFactory(); - Pattern pattern = PatternBuilder.create(templateModel).setAddGeneratedBy(true).build(); - - final String newQName = "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs"; - CtClass generatedType = pattern.generator().generate(newQName, Collections.emptyMap()); - assertNotNull(generatedType); - - // sanity check that the new type contains all the expected methods - assertEquals(Arrays.asList("","local","sameType","sameTypeStatic","anotherMethod","someMethod","Local","foo"), - generatedType.getTypeMembers().stream().map(CtTypeMember::getSimpleName).collect(Collectors.toList())); - - // contract: one can generated the type in a new package, with a fully-qualified name - assertEquals(newQName, generatedType.getQualifiedName()); - - //contract: all the type references points to new type - Set usedTypeRefs = new HashSet<>(); - generatedType.filterChildren(new TypeFilter<>(CtTypeReference.class)) - .forEach((CtTypeReference ref) -> usedTypeRefs.add(ref.getQualifiedName())); - assertEquals(new HashSet<>(Arrays.asList( - "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs","void","boolean", - "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$1Bar", - "java.lang.Object","int","spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$Local")), - usedTypeRefs); - - //contract: all executable references points to the executables in cloned type - generatedType.filterChildren(new TypeFilter<>(CtExecutableReference.class)).forEach((CtExecutableReference execRef) -> { - CtTypeReference declTypeRef = execRef.getDeclaringType(); - if(declTypeRef.getQualifiedName().startsWith("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs")) { - //OK - return; - } - if(declTypeRef.getQualifiedName().equals(Object.class.getName())) { - return; - } - fail("Unexpected declaring type " + declTypeRef.getQualifiedName()); - }); - } - - @Test - public void testGenerateMethodWithSelfReferences() throws Exception { - //contract: a method with self references can be used as a template to generate a clone - - CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); - Factory factory = templateModel.getFactory(); - - // create a template from method foo - Pattern pattern = PatternBuilder.create( - (CtMethod) templateModel.getMethodsByName("foo").get(0) - ) - .setAddGeneratedBy(true) //switch ON: generate by comments - .build(); - - CtClass generatedType = factory.createClass("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs"); - - Map params = new HashMap<>(); - params.put("targetType", generatedType.getReference()); - CtMethod m = (CtMethod) pattern.generator().generate(params).get(0); - generatedType.addMethod(m); - - //contract: the foo method has been added - assertEquals(Arrays.asList("foo"), - generatedType.getTypeMembers().stream().map(CtTypeMember::getSimpleName).collect(Collectors.toList())); - assertEquals(1, generatedType.getMethodsByName("foo").size()); - - //contract: generate by comments are appended - assertEquals("Generated by spoon.test.template.testclasses.types.AClassWithMethodsAndRefs#foo(AClassWithMethodsAndRefs.java:30)", - generatedType.getMethodsByName("foo").get(0).getDocComment().trim()); - - //contract: all the type references points to new type - Set usedTypeRefs = new HashSet<>(); - generatedType.filterChildren(new TypeFilter<>(CtTypeReference.class)) - .forEach((CtTypeReference ref) -> usedTypeRefs.add(ref.getQualifiedName())); - assertEquals(new HashSet<>(Arrays.asList( - "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs","void", - "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$1Bar", - "java.lang.Object","spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$Local")), - usedTypeRefs); - //contract: all executable references points to executables in cloned type - generatedType.filterChildren(new TypeFilter<>(CtExecutableReference.class)).forEach((CtExecutableReference execRef) -> { - CtTypeReference declTypeRef = execRef.getDeclaringType(); - if(declTypeRef.getQualifiedName().startsWith("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs")) { - //OK - return; - } - if(declTypeRef.getQualifiedName().equals(Object.class.getName())) { - return; - } - fail("Unexpected declaring type " + declTypeRef.getQualifiedName()); - }); - } - - @Test - public void testPatternMatchOfMultipleElements() throws Exception { - // contract: one can match list of elements in hard-coded arrays (CtNewArray) - CtType toBeMatchedtype = ModelUtils.buildClass(ToBeMatched.class); - - // getting the list of literals defined in method match1 - List> literals1 = getFirstStmt(toBeMatchedtype, "match1", CtInvocation.class).getArguments(); - List> literals2 = getFirstStmt(toBeMatchedtype, "match2", CtInvocation.class).getArguments(); - assertEquals("a", literals1.get(0).getValue()); - - Factory f = toBeMatchedtype.getFactory(); - - { //contract: matches one exact literal - List found = new ArrayList<>(); - - // creating a Pattern from a Literal, with zero pattern parameters - // The pattern model consists of one CtLIteral only - // there is not needed any type reference, because CtLiteral has no reference to a type where it is defined - spoon.pattern.Pattern p = PatternBuilder.create(f.createLiteral("a")).build(); - - //The pattern has no parameters. There is just one constant CtLiteral - assertEquals (0, p.getParameterInfos().size()); - - // when we match the pattern agains AST of toBeMatchedtype, we find three instances of "a", - //because there are 3 instances of CtLiteral "a" in toBeMatchedtype - p.forEachMatch(toBeMatchedtype, (match) -> { - found.add(match.getMatchingElement()); - }); - - assertEquals(3, found.size()); - assertSame(literals1.get(0)/* first "a" in match1 */, found.get(0)); - assertSame(literals1.get(6)/* 2nd "a" in match1 */, found.get(1)); - assertSame(literals2.get(0)/* 1st "a" in match 2 */, found.get(2)); - } - { //contract: matches sequence of elements - List> found = new ArrayList<>(); - // now we match a sequence of "a", "b", "c" - spoon.pattern.Pattern pattern = patternOfStringLiterals(toBeMatchedtype.getFactory(), "a", "b", "c"); - pattern.forEachMatch(toBeMatchedtype, (match) -> { - found.add(match.getMatchingElements()); - }); - assertEquals(2, found.size()); - - assertEquals(3, found.get(1).size()); - // it starts with the first "a" in the match1 - assertEquals("\"a\"", found.get(0).get(0).toString()); - assertEquals(17, found.get(0).get(0).getPosition().getColumn()); - assertEquals("\"b\"", found.get(0).get(1).toString()); - assertEquals(22, found.get(0).get(1).getPosition().getColumn()); - assertEquals("\"c\"", found.get(0).get(2).toString()); - assertEquals(27, found.get(0).get(2).getPosition().getColumn()); - - // more generic asserts - assertSequenceOn(literals1, 0, 3, found.get(0)); - assertSequenceOn(literals1, 6, 3, found.get(1)); - } - { //contract: matches sequence of elements not starting at the beginning - List> found = new ArrayList<>(); - patternOfStringLiterals(toBeMatchedtype.getFactory(), "b", "c").forEachMatch(toBeMatchedtype, (match) -> { - found.add(match.getMatchingElements()); - }); - // we have three times a sequence ["b", "c"] - assertEquals(3, found.size()); - assertSequenceOn(literals1, 1, 2, found.get(0)); - assertSequenceOn(literals1, 7, 2, found.get(1)); - assertSequenceOn(literals2, 3, 2, found.get(2)); - } - { //contract: matches sequence of repeated elements, but match each element only once - List> found = new ArrayList<>(); - // we search for ["d", "d"] - patternOfStringLiterals(toBeMatchedtype.getFactory(), "d", "d").forEachMatch(toBeMatchedtype, (match) -> { - found.add(match.getMatchingElements()); - }); - // in ToBeMatched there is ["d", "d", "d", "d", "d] - // so there are only two sequences, starting at first and third "d" - assertEquals(2, found.size()); - assertSequenceOn(literals2, 6, 2, found.get(0)); - assertSequenceOn(literals2, 8, 2, found.get(1)); - } - } - - private static spoon.pattern.Pattern patternOfStringLiterals(Factory f, String... strs) { - return PatternBuilder.create(Arrays.asList(strs).stream().map(s -> f.createLiteral(s)).collect(Collectors.toList()) - ).build(); - } - - private void assertSequenceOn(List source, int expectedOffset, int expectedSize, List matches) { - //check the number of matches - assertEquals(expectedSize, matches.size()); - //check that each match fits to source collection on the expected offset - for (int i = 0; i < expectedSize; i++) { - assertSame(source.get(expectedOffset + i), matches.get(i)); - } - } - - private T getFirstStmt(CtType type, String methodName, Class stmtType) { - return (T) type.filterChildren((CtMethod m) -> m.getSimpleName().equals(methodName)).first(CtMethod.class).getBody().getStatement(0); - } - - private int indexOf(List list, Object o) { - for(int i=0; i aTargetType = launcher.getFactory().Class().get(Logger.class); - final CtMethod toBeLoggedMethod = aTargetType.getMethodsByName("enter").get(0); - - - Map params = new HashMap<>(); - params.put("_classname_", factory.Code().createLiteral(aTargetType.getSimpleName())); - params.put("_methodName_", factory.Code().createLiteral(toBeLoggedMethod.getSimpleName())); - params.put("_block_", toBeLoggedMethod.getBody()); - //create a patter from the LoggerModel#block - CtType type = factory.Templates().Type().get(LoggerModel.class); - - - // creating a pattern from method "block" - spoon.pattern.Pattern pattern = PatternBuilder.create(type.getMethodsByName("block").get(0)) - //all the variable references which are declared out of type member "block" are automatically considered - //as pattern parameters - .configurePatternParameters() - .build(); - - final List aMethods = pattern.generator().generate(params); - assertEquals(1, aMethods.size()); - final CtMethod aMethod = aMethods.get(0); - assertTrue(aMethod.getBody().getStatement(0) instanceof CtTry); - final CtTry aTry = (CtTry) aMethod.getBody().getStatement(0); - assertTrue(aTry.getFinalizer().getStatement(0) instanceof CtInvocation); - assertEquals("spoon.test.template.testclasses.logger.Logger.exit(\"enter\")", aTry.getFinalizer().getStatement(0).toString()); - assertTrue(aTry.getBody().getStatement(0) instanceof CtInvocation); - assertEquals("spoon.test.template.testclasses.logger.Logger.enter(\"Logger\", \"enter\")", aTry.getBody().getStatement(0).toString()); - assertTrue(aTry.getBody().getStatements().size() > 1); - } - - @Test - public void testMatchType() { - //contract: one can match a type - final Launcher launcher = new Launcher(); - launcher.setArgs(new String[] {"--output-type", "nooutput" }); - launcher.addInputResource("./src/test/java/spoon/test/template/testclasses/logger/Logger.java"); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - //create a template class - final CtClass aTemplateType = launcher.getFactory().Class().create("a.template.Clazz"); - //create a pattern which should match that class - Pattern pattern = PatternBuilder.create(aTemplateType) - .configurePatternParameters(pb -> { - pb.parameter("members").byRole(CtRole.TYPE_MEMBER, e -> e == aTemplateType); - pb.parameter("modifiers").byRole(CtRole.MODIFIER, e -> e == aTemplateType); - }).build(); - - final CtClass aTargetType = launcher.getFactory().Class().get(Logger.class); - List matches = pattern.getMatches(aTargetType); - assertEquals(1, matches.size()); - Match match = matches.get(0); - assertSame(aTargetType, match.getMatchingElement()); - List expectedTypeMembers = aTargetType.getTypeMembers(); - List typeMembers = (List) match.getParameters().getValue("members"); - assertEquals(expectedTypeMembers.size(), typeMembers.size()); - for (int i = 0; i < expectedTypeMembers.size(); i++) { - assertSame(expectedTypeMembers.get(i), typeMembers.get(i)); - } - } - - @Test - public void testSubstituteExactElements() { - //contract: one can substitute exactly defined element - final Launcher launcher = new Launcher(); - launcher.setArgs(new String[] {"--output-type", "nooutput" }); - launcher.addInputResource("./src/test/java/spoon/test/template/testclasses/logger/Logger.java"); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - final CtClass aTargetType = launcher.getFactory().Class().get(Logger.class); - CtMethod tobeSubstititedMethod = aTargetType.getMethodsByName("enter").get(0); - Pattern pattern = PatternBuilder.create(aTargetType) - .configurePatternParameters(pb -> { - //substitute NAME of method - pb.parameter("methodName").byRole(CtRole.NAME, tobeSubstititedMethod); - //substitute Body of method - pb.parameter("methodBody").byElement(tobeSubstititedMethod.getBody()); - }).build(); - - List matches = pattern.getMatches(aTargetType); - assertEquals(1, matches.size()); - Match match = matches.get(0); - assertSame(aTargetType, match.getMatchingElement()); - assertEquals("enter", match.getParameters().getValue("methodName")); - assertSame(tobeSubstititedMethod.getBody(), match.getParameters().getValue("methodBody")); - } - - private Map getMap(Match match, String name) { - Object v = match.getParametersMap().get(name); - assertNotNull(v); - return ((ImmutableMap) v).asMap(); - } - - @Test - void testGeneratorCopiesMetadataOfTemplateElement() { - // contract: metadata should be cloned for all elements generated via template - - String c1 = "public class A { int getOne() { return 1; } }"; - CtType type = Launcher.parseClass(c1); - String key = "foo"; - String val = "bar"; - - // attach metadata - type.descendantIterator().forEachRemaining(ctElement -> ctElement.putMetadata(key, val)); - - // create clone using the above type as template - CtType cloneType = PatternBuilder.create(type).build().generator().generate("B", new HashMap<>()); - - cloneType.descendantIterator().forEachRemaining(ctElement -> assertEquals(val, ctElement.getMetadata(key), "Metadata does not match for: " + ctElement)); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import spoon.Launcher; +import spoon.pattern.ConflictResolutionMode; +import spoon.pattern.Match; +import spoon.pattern.Pattern; +import spoon.pattern.PatternBuilder; +import spoon.pattern.PatternBuilderHelper; +import spoon.pattern.PatternParameterConfigurator; +import spoon.pattern.Quantifier; +import spoon.pattern.internal.parameter.ParameterInfo; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtInvocation; +import spoon.reflect.code.CtLiteral; +import spoon.reflect.code.CtStatement; +import spoon.reflect.code.CtTry; +import spoon.reflect.code.CtVariableRead; +import spoon.reflect.declaration.CtAnnotation; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtTypeMember; +import spoon.reflect.declaration.ModifierKind; +import spoon.reflect.factory.Factory; +import spoon.reflect.meta.ContainerKind; +import spoon.reflect.path.CtRole; +import spoon.reflect.reference.CtExecutableReference; +import spoon.reflect.reference.CtTypeReference; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.support.compiler.FileSystemFile; +import spoon.support.util.ImmutableMap; +import spoon.support.util.ImmutableMapImpl; +import spoon.test.template.testclasses.LoggerModel; +import spoon.test.template.testclasses.ToBeMatched; +import spoon.test.template.testclasses.logger.Logger; +import spoon.test.template.testclasses.match.GenerateIfElse; +import spoon.test.template.testclasses.match.MatchForEach; +import spoon.test.template.testclasses.match.MatchForEach2; +import spoon.test.template.testclasses.match.MatchIfElse; +import spoon.test.template.testclasses.match.MatchMap; +import spoon.test.template.testclasses.match.MatchModifiers; +import spoon.test.template.testclasses.match.MatchMultiple; +import spoon.test.template.testclasses.match.MatchMultiple2; +import spoon.test.template.testclasses.match.MatchMultiple3; +import spoon.test.template.testclasses.match.MatchThrowables; +import spoon.test.template.testclasses.match.MatchWithParameterCondition; +import spoon.test.template.testclasses.match.MatchWithParameterType; +import spoon.test.template.testclasses.replace.DPPSample1; +import spoon.test.template.testclasses.replace.OldPattern; +import spoon.test.template.testclasses.types.AClassWithMethodsAndRefs; +import spoon.testing.utils.LineSeparatorExtension; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + + +// main test of Spoon's patterns +public class PatternTest { + + @Test + public void testMatchForeach() throws Exception { + //contract: a foreach template can also match inlined lists of statements + CtType ctClass = ModelUtils.buildClass(MatchForEach.class); + + CtType type = ctClass.getFactory().Type().get(MatchForEach.class); + + // create one pattern from matcher1, with one parameter "values" +// public void matcher1(List values) { +// for (String value : values) { +// System.out.println(value); +// } +// } + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("values").byVariable("values").setContainerKind(ContainerKind.LIST).matchInlinedStatements(); + }) + .build(); + + List matches = pattern.getMatches(ctClass); + + assertEquals(2, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(value)"), toListOfStrings(match.getMatchingElements())); + //FIX IT +// assertEquals(Arrays.asList(""), listToListOfStrings((List) match.getParameters().getValue("values"))); + } + { + Match match = matches.get(1); + assertEquals(Arrays.asList( + "java.lang.System.out.println(\"a\")", + "java.lang.System.out.println(\"Xxxx\")", + "java.lang.System.out.println(((java.lang.String) (null)))", + "java.lang.System.out.println(java.lang.Long.class.toString())"), toListOfStrings(match.getMatchingElements())); + assertEquals(Arrays.asList( + "\"a\"", + "\"Xxxx\"", + "((java.lang.String) (null))", + "java.lang.Long.class.toString()"), toListOfStrings((List) match.getParameters().getValue("values"))); + } + } + + @Test + public void testMatchForeachWithOuterSubstitution() throws Exception { + //contract: inline foreach templates can also match outer parameters + CtType ctClass = ModelUtils.buildClass(MatchForEach2.class); + + CtType type = ctClass.getFactory().Type().get(MatchForEach2.class); + + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("values").byVariable("values").setContainerKind(ContainerKind.LIST).matchInlinedStatements(); + // the variable "var" of the template is a parameter + pb.parameter("varName").byString("var"); + }) + .build(); + + List matches = pattern.getMatches(ctClass); + + assertEquals(3, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("int var = 0"), toListOfStrings(match.getMatchingElements())); + //FIX IT +// assertEquals(Arrays.asList(""), listToListOfStrings((List) match.getParameters().getValue("values"))); + } + { + Match match = matches.get(1); + assertEquals(Arrays.asList( + "int cc = 0", + "java.lang.System.out.println(\"Xxxx\")", + "cc++", + "java.lang.System.out.println(((java.lang.String) (null)))", + "cc++"), toListOfStrings(match.getMatchingElements())); + + // correctly matching the outer parameter + assertEquals("cc", match.getParameters().getValue("varName")); + } + { + Match match = matches.get(2); + assertEquals(Arrays.asList( + "int dd = 0", + "java.lang.System.out.println(java.lang.Long.class.toString())", + "dd++"), toListOfStrings(match.getMatchingElements())); + + // correctly matching the outer parameter + assertEquals("dd", match.getParameters().getValue("varName")); + } + } + + @Test + public void testMatchIfElse() throws Exception { + //contract: if statements can be inlined + // meaning, either the if branch or the else branch can be matched independently + + // in this example the main if statement starting with "if (option) {" + // is inlined, and any of the branch can be matched + CtType ctClass = ModelUtils.buildClass(MatchIfElse.class); + + CtType type = ctClass.getFactory().Type().get(MatchIfElse.class); + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("option").byVariable("option"); + pb.parameter("value").byFilter(new TypeFilter(CtLiteral.class)); + }) + //we have to configure inline statements after all expressions + //of combined if statement are marked as pattern parameters + .configureInlineStatements(lsb -> lsb.inlineIfOrForeachReferringTo("option")) + .build(); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + // we only match the calls having a string literal as parameter or a float + assertEquals(5, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); + assertEquals(true, match.getParameters().getValue("option")); + assertEquals("\"a\"", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(1); + assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + assertEquals(true, match.getParameters().getValue("option")); + assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(2); + assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); + assertEquals(true, match.getParameters().getValue("option")); + assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(4); + assertEquals(Arrays.asList("java.lang.System.out.println(3.14)"), toListOfStrings(match.getMatchingElements())); + assertEquals(false, match.getParameters().getValue("option")); + assertEquals("3.14", match.getParameters().getValue("value").toString()); + } + } + + @Test + public void testGenerateIfElse() throws Exception { + //contract: it is possible to generate code using optional targets + CtType type = ModelUtils.buildClass(GenerateIfElse.class); + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("generator").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("option").byVariable("option"); + }) + //we have to configure inline statements after all expressions + //of combined if statement are marked as pattern parameters + .configureInlineStatements(lsb -> lsb.inlineIfOrForeachReferringTo("option")) + //contract: it is possible to configure pattern parameters after their parent is inlined + .configurePatternParameters(pb -> { + pb.parameter("value").byFilter(new TypeFilter(CtLiteral.class)); + }) + .build(); + + { + List statements = pattern.generator().generate( + new ImmutableMapImpl().putValue("option", true).putValue("value", "spoon")); + assertEquals(1, statements.size()); + assertEquals("java.lang.System.out.print(\"spoon\")", statements.get(0).toString()); + } + { + List statements = pattern.generator().generate( + new ImmutableMapImpl().putValue("option", false).putValue("value", 2.1)); + assertEquals(1, statements.size()); + assertEquals("java.lang.System.out.println(2.1)", statements.get(0).toString()); + } + } + + @Test + public void testGenerateMultiValues() throws Exception { + // contract: the pattern parameter (in this case 'statements') + // can have type List and can be replaced by list of elements + //(in this case by list of statements) + + // here, in particular, we test method "substitute" + + + // setup of the test + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + Factory factory = ctClass.getFactory(); + + Pattern pattern = MatchMultiple.createPattern(null, null, null); + ImmutableMap params = new ImmutableMapImpl(); + + // created in "MatchMultiple.createPattern", matching a literal "something" + // so "something" is replaced by "does it work?" + params = params.putValue("printedValue", "does it work?"); + + List statementsToBeAdded = Arrays.asList(new CtStatement[] {factory.createCodeSnippetStatement("int foo = 0"), factory.createCodeSnippetStatement("foo++")}); + //statementsToBeAdded = ctClass.getMethodsByName("testMatch1").get(0).getBody().getStatements().subList(0, 3); // we don't use this in order not to mix the matching and the transformation + + // created in "MatchMultiple.createPattern", matching a method "statements" + params = params.putValue("statements", statementsToBeAdded); + + List generated = pattern.generator().generate(params); + assertEquals(Arrays.asList( + //these statements comes from `statements` parameter value + "int foo = 0", + "foo++", + //this statement comes from pattern model, just the string literal comes from parameter `printedValue` + "java.lang.System.out.println(\"does it work?\")"), generated.stream().map(Object::toString).collect(Collectors.toList())); + } + + @Test + public void testMatchGreedyMultiValueUnlimited() throws Exception { + //contract: there is a way to match absolutely any kind of statement, in an unlimited list + + //explanation: multivalue parameter (setContainerKind(ContainerKind.LIST) can match multiple nodes in a row. + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + + Pattern pattern = MatchMultiple.createPattern(null, null, null); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + assertEquals(1, matches.size()); + Match match = matches.get(0); + //check that absolutely all statements from "testMatch1" are matched + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", + "java.lang.System.out.println(\"Xxxx\")", + "java.lang.System.out.println(((java.lang.String) (null)))", + "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", + "java.lang.System.out.println(\"Xxxx\")", + "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); + + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); + } + + @Test + public void testMatchGreedyMultiValueMaxCountLimit() throws Exception { + //contract: it is possible to stop matching after a specific number of times + // This is done with method parameterBuilder.setMaxOccurrence(maxCount) + + // explanation: greedy matching eats everything until max count = 3 + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + Pattern pattern = MatchMultiple.createPattern(null, null, 3); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + assertEquals(2, matches.size()); + { + Match match = matches.get(0); + //check 3 + 1 statements are matched + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", + "java.lang.System.out.println(\"Xxxx\")" + ), toListOfStrings(match.getMatchingElements())); + + //check 3 statements are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //4th statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); + } + { + Match match = matches.get(1); + //check remaining next 2 statements are matched + assertEquals(Arrays.asList( + "java.lang.System.out.println(((java.lang.String) (null)))", + "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); + } + } + + @Test + public void testMatchReluctantMultivalue() throws Exception { + //contract: reluctant matching (Quantifier.RELUCTANT) matches only the minimal amount of time + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + + Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, null, null); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + assertEquals(3, matches.size()); + { + Match match = matches.get(0); + //check all statements are matched + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... + "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); + } + { + Match match = matches.get(1); + //check all statements are matched + assertEquals(Arrays.asList( + "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList(), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("((java.lang.String) (null))", match.getParameters().getValue("printedValue").toString()); + } + { + Match match = matches.get(2); + //check all statements are matched + assertEquals(Arrays.asList( + "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList(), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); + } + } + + @Test + public void testMatchReluctantMultivalueMinCount1() throws Exception { + //contract: one can do reluctant matches with a minCount of 1 node + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + + Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, 1, null); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + assertEquals(2, matches.size()); + { + Match match = matches.get(0); + //check all statements are matched + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... + "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); + } + { + Match match = matches.get(1); + //check all statements are matched + assertEquals(Arrays.asList( + "java.lang.System.out.println(((java.lang.String) (null)))", + "java.lang.System.out.println(\"last one\")"), toListOfStrings(match.getMatchingElements())); + + //check all statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"last one\"", match.getParameters().getValue("printedValue").toString()); + } + } + + @Test + public void testMatchReluctantMultivalueExactly2() throws Exception { + //contract: one can do reluctant matches min 2 nodes and max 2 nodes + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + + Pattern pattern = MatchMultiple.createPattern(Quantifier.RELUCTANT, 2, 2); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + assertEquals(1, matches.size()); + { + Match match = matches.get(0); + //check only 2 statements are matched + next one + assertEquals(Arrays.asList( + "i++", + "java.lang.System.out.println(i)", //this is println(int), but last temple matches println(String) - it is question if it is wanted or not ... + "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + + //check 2 statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "i++", + "java.lang.System.out.println(i)"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("printedValue").toString()); + } + } + + @Test + public void testMatchPossesiveMultiValueUnlimited() throws Exception { + //contract: possessive matching eats everything + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + Pattern pattern = MatchMultiple.createPattern(Quantifier.POSSESSIVE, null, null); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); + + // template: +// public void matcher1() { +// statements(); +// System.out.println("something"); +// } + + // Quantifier.POSSESSIVE matches all elements by statements() and there remains no element for mandatory single match of System.out.println("something");, + // consequently, no match of the full template + assertEquals(0, matches.size()); + } + + @Test + public void testMatchPossesiveMultiValueMaxCount4() throws Exception { + //contract: maxCount (#setMaxOccurrence) can be used to stop Quantifier.POSSESSIVE for matching too much + CtType ctClass = ModelUtils.buildClass(MatchMultiple.class); + + // note that if we set maxCount = 3, it fails because there is one dangling statement before System.out.println("something") + Pattern pattern = MatchMultiple.createPattern(Quantifier.POSSESSIVE, null, 4); + + List matches = pattern.getMatches(ctClass); + + // only testMatch1 is matched + // method matcher1, from which the template has been built, is not matched + // because the possessive quantifier eats its two statements, here remains nothing for the second template statement, which cannot match then. + assertEquals(1, matches.size()); + Match match = matches.get(0); + + //check 4 statements are matched + last template + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", + "java.lang.System.out.println(\"Xxxx\")", + "java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); + + //check 4 statements excluding last are stored as value of "statements" parameter + assertEquals(Arrays.asList( + "int i = 0", + "i++", + "java.lang.System.out.println(i)", + "java.lang.System.out.println(\"Xxxx\")"), toListOfStrings((List) match.getParameters().getValue("statements"))); + //last statement is matched by last template, which saves printed value + assertTrue(match.getParameters().getValue("printedValue") instanceof CtLiteral); + assertEquals("((java.lang.String) (null))", match.getParameters().getValue("printedValue").toString()); + } + + @Test + public void testMatchPossesiveMultiValueMinCount() throws Exception { + //contract: there is a correct interplay between for possessive matching with min count limit and with GREEDY matching + + // pattern +// public void matcher1() { +// statements1.S(); // Quantifier.GREEDY +// statements2.S(); // Quantifier.POSSESSIVE with setMinOccurrence and setMaxOccurrence set +// System.out.println("something"); // "something" -> anything +// } + + CtType ctClass = ModelUtils.buildClass(MatchMultiple3.class); + + // trying with all values of "count" + for (int count = 0; count < 6; count++) { + final int countFinal = count; + CtType type = ctClass.getFactory().Type().get(MatchMultiple3.class); + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters() + .configurePatternParameters(pb -> { + pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY); + pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.POSSESSIVE).setMinOccurrence(countFinal).setMaxOccurrence(countFinal); + pb.parameter("printedValue").byFilter((CtLiteral literal) -> "something".equals(literal.getValue())); + }) + .build(); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); + + // Quantifier.POSSESSIVE matches exactly the right number of times + assertEquals(countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count="+countFinal); + + // Quantifier.GREEDY gets the rest + assertEquals(5-countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count="+countFinal); + } + } + + @Test + public void testMatchPossesiveMultiValueMinCount2() throws Exception { + //contract: there is a correct interplay between for possessive matching with min count limit and with GREEDY matching + + // pattern: +// public void matcher1(List something) { +// statements1.S(); // Quantifier.GREEDY +// statements2.S(); // Quantifier.POSSESSIVE with setMinOccurrence and setMaxOccurrence set +// for (String v : something) { +// System.out.println(v); // can be inlined +// } +// } +// + + CtType ctClass = ModelUtils.buildClass(MatchMultiple2.class); + + // trying with all values of "count" + for (int count = 0; count < 5; count++) { + final int countFinal = count; + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.byTemplateParameter(); + pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY); + pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.POSSESSIVE).setMinOccurrence(countFinal).setMaxOccurrence(countFinal); + pb.parameter("inlinedSysOut").byVariable("something").setMatchingStrategy(Quantifier.POSSESSIVE).setContainerKind(ContainerKind.LIST).setMinOccurrence(2).matchInlinedStatements(); + }) + .build(); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); + //the last template has nothing to match -> no match + assertEquals(1, matches.size(), "count="+countFinal); + assertEquals(4-countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count="+countFinal); + assertEquals(countFinal, getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count="+countFinal); + assertEquals(2, getCollectionSize(matches.get(0).getParameters().getValue("inlinedSysOut")), "count="+countFinal); + } + + for (int count = 5; count < 7; count++) { + final int countFinal = count; + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters().build(); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); + //the possessive matcher eats too much. There is no target element for last `printedValue` variable + assertEquals(0, matches.size(), "count="+countFinal); + } + } + + @Test + public void testMatchGreedyMultiValueMinCount2() throws Exception { + //contract: check possessive matching with min count limit and GREEDY back off + CtType ctClass = ModelUtils.buildClass(MatchMultiple2.class); + for (int i = 0; i < 7; i++) { + final int count = i; + CtType type = ctClass.getFactory().Type().get(MatchMultiple2.class); + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.byTemplateParameter(); + pb.parameter("statements1").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.RELUCTANT); + pb.parameter("statements2").setContainerKind(ContainerKind.LIST).setMatchingStrategy(Quantifier.GREEDY).setMaxOccurrence(count); + pb.parameter("printedValue").byVariable("something").matchInlinedStatements(); + pb.parameter("printedValue").setMatchingStrategy(Quantifier.GREEDY).setContainerKind(ContainerKind.LIST).setMinOccurrence(2); + }) + .build(); + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0).getBody()); + + + if (count < 7) { + //the last template has nothing to match -> no match + assertEquals(1, matches.size(), "count=" + count); + assertEquals(Math.max(0, 3 - count), getCollectionSize(matches.get(0).getParameters().getValue("statements1")), "count=" + count); + assertEquals(count - Math.max(0, count - 4), getCollectionSize(matches.get(0).getParameters().getValue("statements2")), "count=" + count); + assertEquals(Math.max(2, 3 - Math.max(0, count - 3)), getCollectionSize(matches.get(0).getParameters().getValue("printedValue")), "count=" + count); + } else { + //the possessive matcher eats too much. There is no target element for last `printedValue` variable + assertEquals(0, matches.size(), "count=" + count); + } + } + } + + /** returns the size of the list of 0 is list is null */ + private int getCollectionSize(Object list) { + if (list instanceof Collection) { + return ((Collection) list).size(); + } + if (list == null) { + return 0; + } + fail("Unexpected object of type " + list.getClass()); + return -1; + } + + @Test + public void testMatchParameterValue() throws Exception { + //contract: if matching on the pattern itself, the matched parameter value is the original AST node from the pattern + // see last assertSame of this test + CtType ctClass = ModelUtils.buildClass(MatchWithParameterType.class); + + // pattern is System.out.println(value); + + // pattern: a call to System.out.println with anything as parameter + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + // anything in place of the variable reference value can be matched + pb.parameter("value").byVariable("value"); + }) + .build(); + + List matches = pattern.getMatches(ctClass); + + // specifying Match#toString + assertEquals("{\n" + + "value=value\n" + + "}\n" + + "----------\n" + + "1) java.lang.System.out.println(value)", matches.get(0).toString()); + + // we match in the whole class, which means the original matcher statements and the ones from testMatcher1 + + assertEquals(5, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(value)"), toListOfStrings(match.getMatchingElements())); + Object value = match.getParameters().getValue("value"); + assertTrue(value instanceof CtVariableRead); + assertEquals("value", value.toString()); + //contract: the value is reference to found node (not a clone) + assertTrue(((CtElement)value).isParentInitialized()); + assertSame(CtRole.ARGUMENT, ((CtElement)value).getRoleInParent()); + } + } + + @Test + public void testMatchParameterValueType() throws Exception { + // contract: pattern parameters can be restricted to only certain types + // in this test case, we only match CtLiteral + CtType ctClass = ModelUtils.buildClass(MatchWithParameterType.class); + { + // now we match only the ones with a literal as parameter + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("value").byVariable("value"); + pb.setValueType(CtLiteral.class); + }) + .build(); + + List matches = pattern.getMatches(ctClass.getMethodsByName("testMatch1").get(0)); + + // there are 3 System.out.println with a literal as parameter + assertEquals(3, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("\"a\"", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(1); + assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); + } + { + // in Java, null is considered as a literal + Match match = matches.get(2); + assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); + } + } + { + // now we match a System.out.println with an invocation as paramter + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("value").byVariable("value"); + pb.setValueType(CtInvocation.class); + }) + .build(); + + List matches = pattern.getMatches(ctClass); + + assertEquals(1, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(java.lang.Long.class.toString())"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtInvocation); + assertEquals("java.lang.Long.class.toString()", match.getParameters().getValue("value").toString()); + } + + } + } + + @Test + public void testMatchParameterCondition() throws Exception { + //contract: pattern parameters support conditions passed as lambda + //if the value isn't matching then node is not matched + CtType ctClass = ModelUtils.buildClass(MatchWithParameterCondition.class); + { + // matching a System.out.println with a literal + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setBodyOfMethod("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("value").byVariable("value"); + pb.byCondition(null, (Object value) -> value instanceof CtLiteral); + }) + .build(); + + List matches = pattern.getMatches(ctClass); + + assertEquals(3, matches.size()); + { + Match match = matches.get(0); + assertEquals(Arrays.asList("java.lang.System.out.println(\"a\")"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("\"a\"", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(1); + assertEquals(Arrays.asList("java.lang.System.out.println(\"Xxxx\")"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("\"Xxxx\"", match.getParameters().getValue("value").toString()); + } + { + Match match = matches.get(2); + assertEquals(Arrays.asList("java.lang.System.out.println(((java.lang.String) (null)))"), toListOfStrings(match.getMatchingElements())); + assertTrue(match.getParameters().getValue("value") instanceof CtLiteral); + assertEquals("((java.lang.String) (null))", match.getParameters().getValue("value").toString()); + } + } + } + + @Test + public void testMatchOfAttribute() throws Exception { + // contract: it is possible to match nodes based on their roles + // tested methods: ParameterBuilder#byRole and ParameterBuilder#byString + CtType ctClass = ModelUtils.buildClass(MatchModifiers.class); + { + //match all methods with arbitrary name, modifiers, parameters, but with empty body and return type void + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); + pb.parameter("methodName").byString("matcher1"); + pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); + }) + .build(); + List matches = pattern.getMatches(ctClass); + + // three methods are matched + assertEquals(3, matches.size()); + { + Match match = matches.get(0); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(3, match.getParametersMap().size()); + assertEquals("matcher1", match.getParametersMap().get("methodName")); + assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PUBLIC)), match.getParametersMap().get("modifiers")); + assertEquals(Arrays.asList(), match.getParametersMap().get("parameters")); + } + { + Match match = matches.get(1); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("publicStaticMethod", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(3, match.getParametersMap().size()); + assertEquals("publicStaticMethod", match.getParametersMap().get("methodName")); + assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PUBLIC, ModifierKind.STATIC)), match.getParametersMap().get("modifiers")); + assertEquals(Arrays.asList(), match.getParametersMap().get("parameters")); + } + { + Match match = matches.get(2); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("packageProtectedMethodWithParam", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(3, match.getParametersMap().size()); + assertEquals("packageProtectedMethodWithParam", match.getParametersMap().get("methodName")); + assertEquals(new HashSet<>(), match.getParametersMap().get("modifiers")); + assertEquals(2, ((List) match.getParametersMap().get("parameters")).size()); + } + } + { + //match all methods with arbitrary name, modifiers, parameters and body, but with return type void + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); + pb.parameter("methodName").byString("matcher1"); + pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); + pb.parameter("statements").byRole(CtRole.STATEMENT, new TypeFilter(CtBlock.class)); + }) + .build(); + List matches = pattern.getMatches(ctClass); + // same as before + one more method: withBody + assertEquals(4, matches.size()); + { + Match match = matches.get(3); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("withBody", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(4, match.getParametersMap().size()); + assertEquals("withBody", match.getParametersMap().get("methodName")); + assertEquals(new HashSet<>(Arrays.asList(ModifierKind.PRIVATE)), match.getParametersMap().get("modifiers")); + assertEquals(0, ((List) match.getParametersMap().get("parameters")).size()); + assertEquals(2, ((List) match.getParametersMap().get("statements")).size()); + assertEquals("this.getClass()", ((List) match.getParametersMap().get("statements")).get(0).toString()); + assertEquals("java.lang.System.out.println()", ((List) match.getParametersMap().get("statements")).get(1).toString()); + } + } + } + + @Test + public void testMatchOfMapAttribute() throws Exception { + //contract: there is support for matching annotations with different annotation values + CtType matchMapClass = ModelUtils.buildClass(MatchMap.class); + { + CtType type = matchMapClass.getFactory().Type().get(MatchMap.class); + // create a pattern from method matcher1 + // match all methods with arbitrary name, and annotation @Check, parameters, but with empty body and return type void +// @Check() +// void matcher1() { +// } + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + //match any value of @Check annotation to parameter `testAnnotations` + pb.parameter("__pattern_param_annot").byRole(CtRole.VALUE, new TypeFilter(CtAnnotation.class)).setContainerKind(ContainerKind.MAP); + //match any method name + pb.parameter("__pattern_param_method_name").byString("matcher1"); + }) + .build(); + + // we apply the pattern on MatchMap + List matches = pattern.getMatches(matchMapClass); + assertEquals(3, matches.size()); + { + // first match: matcher1 itself (normal) + Match match = matches.get(0); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(2, match.getParametersMap().size()); + assertEquals("matcher1", match.getParametersMap().get("__pattern_param_method_name")); + Map values = getMap(match, "__pattern_param_annot"); + assertEquals(0, values.size()); + } + { + // first match: m1 itself (normal) +// @Check(value = "xyz") +// void m1() { +// } + Match match = matches.get(1); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("m1", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(2, match.getParametersMap().size()); + assertEquals("m1", match.getParametersMap().get("__pattern_param_method_name")); + Map values = getMap(match, "__pattern_param_annot"); + assertEquals(1, values.size()); + assertEquals("\"xyz\"", values.get("value").toString()); + } + { + // second match: m2, it also contains a timeout value + Match match = matches.get(2); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("m2", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(2, match.getParametersMap().size()); + assertEquals("m2", match.getParametersMap().get("__pattern_param_method_name")); + Map values = getMap(match, "__pattern_param_annot"); + assertEquals(2, values.size()); + assertEquals("\"abc\"", values.get("value").toString()); + assertEquals("123", values.get("timeout").toString()); + } + } + } + + @Test + public void testMatchOfMapAttributeAndOtherAnnotations() throws Exception { + //contract: match a pattern with an "open" annotation (different annotations can be matched) + // same test but with one more pattern parameter: allAnnotations + CtType ctClass = ModelUtils.buildClass(MatchMap.class); + { + CtType type = ctClass.getFactory().Type().get(MatchMap.class); + // create a pattern from method matcher1 + // match all methods with arbitrary name, with any annotation set, Test modifiers, parameters, but with empty body and return type void + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + //match any value of @Check annotation to parameter `testAnnotations` + //match any method name + pb.parameter("methodName").byString("matcher1"); + // match on any annotation + pb.parameter("allAnnotations") + .setConflictResolutionMode(ConflictResolutionMode.APPEND) + .byRole(CtRole.ANNOTATION, new TypeFilter<>(CtMethod.class)) + ; + pb.parameter("CheckAnnotationValues").byRole(CtRole.VALUE, new TypeFilter(CtAnnotation.class)).setContainerKind(ContainerKind.MAP); + }) + .build(); + List matches = pattern.getMatches(ctClass); + + // we match the same methods in MatchMap as testMatchOfMapAttribute + assertEquals(4, matches.size()); + // the new one is the one with deprecated + { + Match match = matches.get(3); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("deprecatedTestAnnotation2", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(3, match.getParametersMap().size()); + assertEquals("deprecatedTestAnnotation2", match.getParametersMap().get("methodName")); + assertEquals("{timeout=4567}", getMap(match, "CheckAnnotationValues").toString()); + assertEquals("@java.lang.Deprecated", match.getParameters().getValue("allAnnotations").toString()); + } + + } + } + + @Test + public void testMatchOfMapKeySubstring() throws Exception { + //contract: one can capture in parameters a key in an annotation key -> value map + CtType ctClass = ModelUtils.buildClass(MatchMap.class); + { + // match all methods with arbitrary name, and Annotation Test modifiers, parameters, but with empty body and return type void + CtType type = ctClass.getFactory().Type().get(MatchMap.class); + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(type).setTypeMember("m1").getPatternElements()) + .configurePatternParameters(pb -> { + //match any value of @Check annotation to parameter `testAnnotations` + pb.parameter("CheckKey").bySubstring("value"); + pb.parameter("CheckValue").byFilter((CtLiteral lit) -> true); + //match any method name + pb.parameter("methodName").byString("m1"); + //match on all annotations of method + pb.parameter("allAnnotations") + .setConflictResolutionMode(ConflictResolutionMode.APPEND) + .byRole(CtRole.ANNOTATION, new TypeFilter<>(CtMethod.class)); + }) + .build(); + List matches = pattern.getMatches(ctClass); + assertEquals(2, matches.size()); + { + Match match = matches.get(0); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("m1", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(3, match.getParametersMap().size()); + assertEquals("m1", match.getParametersMap().get("methodName")); + assertEquals("value", match.getParameters().getValue("CheckKey").toString()); + assertEquals("\"xyz\"", match.getParameters().getValue("CheckValue").toString()); + } + { + Match match = matches.get(1); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("deprecatedTestAnnotation2", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(4, match.getParametersMap().size()); + assertEquals("deprecatedTestAnnotation2", match.getParametersMap().get("methodName")); + assertEquals("timeout", match.getParameters().getValue("CheckKey").toString()); + assertEquals("4567", match.getParameters().getValue("CheckValue").toString()); + assertEquals("@java.lang.Deprecated", match.getParameters().getValue("allAnnotations").toString()); + } + } + } + + @Test + public void testMatchInSet() throws Exception { + // contract: the container type "Set" is supported to match set-related AST nodes (e.g. the throws clause) + // tested method: setContainerKind(ContainerKind.SET) + CtType ctClass = ModelUtils.buildClass(MatchThrowables.class); + Factory f = ctClass.getFactory(); + + // we match a method with any "throws" clause + // and the match "throws" are captured in the parameter + Pattern pattern = PatternBuilder.create(new PatternBuilderHelper(ctClass).setTypeMember("matcher1").getPatternElements()) + .configurePatternParameters(pb -> { + pb.parameter("otherThrowables") + //add matcher for other arbitrary throwables + .setConflictResolutionMode(ConflictResolutionMode.APPEND) + .setContainerKind(ContainerKind.SET) + .setMinOccurrence(0) + .byRole(CtRole.THROWN, new TypeFilter(CtMethod.class)); + }) + .configurePatternParameters(pb -> { + //define other parameters too to match all kinds of methods + pb.parameter("modifiers").byRole(CtRole.MODIFIER, new TypeFilter(CtMethod.class)); + pb.parameter("methodName").byString("matcher1"); + pb.parameter("parameters").byRole(CtRole.PARAMETER, new TypeFilter(CtMethod.class)); + pb.parameter("statements").byRole(CtRole.STATEMENT, new TypeFilter(CtBlock.class)); + }) + .build(); + String str = pattern.toString(); + List matches = pattern.getMatches(ctClass); + assertEquals(4, matches.size()); + { + Match match = matches.get(0); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("matcher1", match.getMatchingElement(CtMethod.class).getSimpleName()); + } + { + Match match = matches.get(1); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("sample2", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(new HashSet(Arrays.asList( + "java.lang.UnsupportedOperationException", + "java.lang.IllegalArgumentException")), + ((Set>) match.getParameters().getValue("otherThrowables")) + .stream().map(e->e.toString()).collect(Collectors.toSet())); + } + { + Match match = matches.get(2); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("sample3", match.getMatchingElement(CtMethod.class).getSimpleName()); + assertEquals(new HashSet(Arrays.asList( + "java.lang.IllegalArgumentException")), + ((Set>) match.getParameters().getValue("otherThrowables")) + .stream().map(e->e.toString()).collect(Collectors.toSet())); + } + { + // now looking at sample4 + Match match = matches.get(3); + assertEquals(1, match.getMatchingElements().size()); + assertEquals("sample4", match.getMatchingElement(CtMethod.class).getSimpleName()); + + // sample4 has exactly the expected exceptions. But there are no other exceptions, so match.getParameters().getValue("otherThrowables") is null + assertNull(match.getParameters().getValue("otherThrowables")); + } + } + + private List toListOfStrings(List list) { + if (list == null) { + return Collections.emptyList(); + } + List strings = new ArrayList<>(list.size()); + for (Object obj : list) { + strings.add(obj == null ? "null" : obj.toString()); + } + return strings; + } + + private MapBuilder map() { + return new MapBuilder(); + } + + class MapBuilder extends LinkedHashMap { + public MapBuilder put(String key, Object value) { + super.put(key, value); + return this; + } + } + + @Test + public void testPatternParameters() { + //contract: all the parameters of Pattern are available through getParameterInfos + Factory f = ModelUtils.build( + new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), + new File("./src/test/java/spoon/test/template/testclasses/replace") + ); + Pattern p = OldPattern.createPatternFromMethodPatternModel(f); + Map parameterInfos = p.getParameterInfos(); + // the pattern has all usages of variable "params" and "item" + assertEquals(15, parameterInfos.size()); + // .. which are + assertEquals(new HashSet<>(Arrays.asList("next","item","startPrefixSpace","printer","start", + "statements","nextPrefixSpace","startSuffixSpace","elementPrinterHelper", + "endPrefixSpace","startKeyword","useStartKeyword","end","nextSuffixSpace","getIterable" + )), parameterInfos.keySet()); + + // the map from getParameterInfos is consistent + for (Map.Entry e : parameterInfos.entrySet()) { + assertEquals(e.getKey(), e.getValue().getName()); + } + } + + @Test + @ExtendWith(LineSeparatorExtension.class) + public void testPatternToString() { + //contract: Pattern can be printed to String and each parameter is defined there + String nl = System.getProperty("line.separator"); + Factory f = ModelUtils.build( + new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), + new File("./src/test/java/spoon/test/template/testclasses/replace") + ); + Pattern p = OldPattern.createPatternFromMethodPatternModel(f); + assertEquals("if (/* CtInvocation"+nl+"" + + "/ <= ${useStartKeyword}"+nl+"" + + " */"+nl+"" + + "useStartKeyword()) {"+nl+"" + + " /* CtInvocation"+nl+"" + + " /argument/ <= ${startKeyword}"+nl+"" + + " */"+nl+"" + + " /* CtInvocation"+nl+"" + + " /target/ <= ${printer}"+nl+"" + + " */"+nl+"" + + " /* CtInvocation"+nl+"" + + " / <= ${printer}"+nl+"" + + " */"+nl+"" + + " printer().writeSpace().writeKeyword(/* CtInvocation"+nl+"" + + " / <= ${startKeyword}"+nl+"" + + " */"+nl+"" + + " startKeyword()).writeSpace();"+nl+"" + + "}"+nl+"" + + "try (final spoon.reflect.visitor.ListPrinter lp = /* CtInvocation"+nl+"" + + "/argument/ <= ${end}"+nl+"" + + "/target/ <= ${elementPrinterHelper}"+nl+"" + + " */"+nl+"" + + "/* CtInvocation"+nl+"" + + "/ <= ${elementPrinterHelper}"+nl+"" + + " */"+nl+"" + + "elementPrinterHelper().createListPrinter(/* CtInvocation"+nl+"" + + "/ <= ${startPrefixSpace}"+nl+"" + + " */"+nl+"" + + "startPrefixSpace(), /* CtInvocation"+nl+"" + + "/ <= ${start}"+nl+"" + + " */"+nl+"" + + "start(), /* CtInvocation"+nl+"" + + "/ <= ${startSuffixSpace}"+nl+"" + + " */"+nl+"" + + "startSuffixSpace(), /* CtInvocation"+nl+"" + + "/ <= ${nextPrefixSpace}"+nl+"" + + " */"+nl+"" + + "nextPrefixSpace(), /* CtInvocation"+nl+"" + + "/ <= ${next}"+nl+"" + + " */"+nl+"" + + "next(), /* CtInvocation"+nl+"" + + "/ <= ${nextSuffixSpace}"+nl+"" + + " */"+nl+"" + + "nextSuffixSpace(), /* CtInvocation"+nl+"" + + "/ <= ${endPrefixSpace}"+nl+"" + + " */"+nl+"" + + "endPrefixSpace(), /* CtInvocation"+nl+"" + + "/ <= ${end}"+nl+"" + + " */"+nl+"" + + "end())) {"+nl+"" + + " /* CtForEach"+nl+"" + + " /expression/ <= ${getIterable}"+nl+"" + + " /foreachVariable/ <= ${item}"+nl+"" + + " */"+nl+"" + + " for (/* CtLocalVariable"+nl+"" + + " / <= ${item}"+nl+"" + + " */"+nl+"" + + " java.lang.Object item : /* CtInvocation"+nl+"" + + " / <= ${getIterable}"+nl+"" + + " */"+nl+"" + + " getIterable()) /* CtBlock"+nl+"" + + " /statement/ <= ${statements}"+nl+"" + + " */"+nl+"" + + " {"+nl+"" + + " lp.printSeparatorIfAppropriate();"+nl+"" + + " /* CtInvocation"+nl+"" + + " / <= ${statements}"+nl+"" + + " */"+nl+"" + + " statements();"+nl+"" + + " }"+nl+"" + + "}"+nl, p.print(true)); + } + + @Test + public void testPatternToStringNoComments() { + //contract: Pattern can be printed to String without parameters + String nl = System.getProperty("line.separator"); + Factory f = ModelUtils.build( + new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), + new File("./src/test/java/spoon/test/template/testclasses/replace") + ); + Pattern p = OldPattern.createPatternFromMethodPatternModel(f); + assertEquals("if (useStartKeyword()) {" + nl + + " printer().writeSpace().writeKeyword(startKeyword()).writeSpace();" + nl + + "}" + nl + + "try (final spoon.reflect.visitor.ListPrinter lp = elementPrinterHelper().createListPrinter(startPrefixSpace(), start(), startSuffixSpace(), nextPrefixSpace(), next(), nextSuffixSpace(), endPrefixSpace(), end())) {" + nl + + " for (java.lang.Object item : getIterable()) {" + nl + + " lp.printSeparatorIfAppropriate();" + nl + + " statements();" + nl + + " }" + nl + + "}" + nl, p.print(false)); + } + + @Test + public void testMatchSample1() { + // contract: a super complex pattern is well matched + Factory f = ModelUtils.build( + new File("./src/test/java/spoon/test/template/testclasses/replace/DPPSample1.java"), + new File("./src/test/java/spoon/test/template/testclasses/replace") + ); + CtClass classDJPP = f.Class().get(DPPSample1.class); + assertNotNull(classDJPP); + assertFalse(classDJPP.isShadow()); + + CtType type = f.Type().get(OldPattern.class); + // Create a pattern from all statements of OldPattern#patternModel + Pattern p = PatternBuilder + .create(new PatternBuilderHelper(type).setBodyOfMethod("patternModel").getPatternElements()) + .configurePatternParameters((PatternParameterConfigurator pb) -> pb + // creating patterns parameters for all references to "params" and "items" + .byFieldAccessOnVariable("params").byFieldAccessOnVariable("item") + .parameter("statements").setContainerKind(ContainerKind.LIST) + ) + .configurePatternParameters() + .configureInlineStatements(ls -> ls.inlineIfOrForeachReferringTo("useStartKeyword")) + .build(); + + // so let's try to match this complex pattern on DJPP + List matches = p.getMatches(classDJPP); + + // there are two results (the try-with-resource in each method) + assertEquals(2, matches.size()); + ImmutableMap params = matches.get(0).getParameters(); + assertEquals("\"extends\"", params.getValue("startKeyword").toString()); + assertEquals(Boolean.TRUE, params.getValue("useStartKeyword")); + assertEquals("false", params.getValue("startPrefixSpace").toString()); + assertEquals("null", params.getValue("start").toString()); + assertEquals("false", params.getValue("startSuffixSpace").toString()); + assertEquals("false", params.getValue("nextPrefixSpace").toString()); + assertEquals("\",\"", params.getValue("next").toString()); + assertEquals("true", params.getValue("nextSuffixSpace").toString()); + assertEquals("false", params.getValue("endPrefixSpace").toString()); + assertEquals("\";\"", params.getValue("end").toString()); + assertEquals("ctEnum.getEnumValues()", params.getValue("getIterable").toString()); + assertEquals("[scan(enumValue)]", params.getValue("statements").toString()); + + params = matches.get(1).getParameters(); + // all method arguments to createListPrinter have been matched + assertNull(params.getValue("startKeyword")); + assertEquals(Boolean.FALSE, params.getValue("useStartKeyword")); + assertEquals("false", params.getValue("startPrefixSpace").toString()); + assertEquals("null", params.getValue("start").toString()); + assertEquals("false", params.getValue("startSuffixSpace").toString()); + assertEquals("false", params.getValue("nextPrefixSpace").toString()); + assertEquals("\",\"", params.getValue("next").toString()); + assertEquals("true", params.getValue("nextSuffixSpace").toString()); + assertEquals("false", params.getValue("endPrefixSpace").toString()); + assertEquals("\";\"", params.getValue("end").toString()); + assertEquals("ctEnum.getEnumValues()", params.getValue("getIterable").toString()); + assertEquals("[scan(enumValue)]", params.getValue("statements").toString()); + + // additional test for ImmutableMap + assertEquals(params.asMap(), params.checkpoint().asMap()); + } + + @Test + public void testAddGeneratedBy() throws Exception { + //contract: by default "generated by" comments are not generated + //contract: generated by comments can be switched ON/OFF later + + // creating a pattern from AClassWithMethodsAndRefs + CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); + Factory factory = templateModel.getFactory(); + Pattern pattern = PatternBuilder.create(templateModel).setAddGeneratedBy(true).build(); + } + + @Test + public void testGenerateClassWithSelfReferences() throws Exception { + // main contract: a class with methods and fields can be generated with method #createType + // in particular, all the references to the origin class are replace by reference to the new class cloned class + + // creating a pattern from AClassWithMethodsAndRefs + CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); + Factory factory = templateModel.getFactory(); + Pattern pattern = PatternBuilder.create(templateModel).setAddGeneratedBy(true).build(); + + final String newQName = "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs"; + CtClass generatedType = pattern.generator().generate(newQName, Collections.emptyMap()); + assertNotNull(generatedType); + + // sanity check that the new type contains all the expected methods + assertEquals(Arrays.asList("","local","sameType","sameTypeStatic","anotherMethod","someMethod","Local","foo"), + generatedType.getTypeMembers().stream().map(CtTypeMember::getSimpleName).collect(Collectors.toList())); + + // contract: one can generated the type in a new package, with a fully-qualified name + assertEquals(newQName, generatedType.getQualifiedName()); + + //contract: all the type references points to new type + Set usedTypeRefs = new HashSet<>(); + generatedType.filterChildren(new TypeFilter<>(CtTypeReference.class)) + .forEach((CtTypeReference ref) -> usedTypeRefs.add(ref.getQualifiedName())); + assertEquals(new HashSet<>(Arrays.asList( + "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs","void","boolean", + "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$1Bar", + "java.lang.Object","int","spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$Local")), + usedTypeRefs); + + //contract: all executable references points to the executables in cloned type + generatedType.filterChildren(new TypeFilter<>(CtExecutableReference.class)).forEach((CtExecutableReference execRef) -> { + CtTypeReference declTypeRef = execRef.getDeclaringType(); + if(declTypeRef.getQualifiedName().startsWith("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs")) { + //OK + return; + } + if(declTypeRef.getQualifiedName().equals(Object.class.getName())) { + return; + } + fail("Unexpected declaring type " + declTypeRef.getQualifiedName()); + }); + } + + @Test + public void testGenerateMethodWithSelfReferences() throws Exception { + //contract: a method with self references can be used as a template to generate a clone + + CtType templateModel = ModelUtils.buildClass(AClassWithMethodsAndRefs.class); + Factory factory = templateModel.getFactory(); + + // create a template from method foo + Pattern pattern = PatternBuilder.create( + (CtMethod) templateModel.getMethodsByName("foo").get(0) + ) + .setAddGeneratedBy(true) //switch ON: generate by comments + .build(); + + CtClass generatedType = factory.createClass("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs"); + + Map params = new HashMap<>(); + params.put("targetType", generatedType.getReference()); + CtMethod m = (CtMethod) pattern.generator().generate(params).get(0); + generatedType.addMethod(m); + + //contract: the foo method has been added + assertEquals(Arrays.asList("foo"), + generatedType.getTypeMembers().stream().map(CtTypeMember::getSimpleName).collect(Collectors.toList())); + assertEquals(1, generatedType.getMethodsByName("foo").size()); + + //contract: generate by comments are appended + assertEquals("Generated by spoon.test.template.testclasses.types.AClassWithMethodsAndRefs#foo(AClassWithMethodsAndRefs.java:30)", + generatedType.getMethodsByName("foo").get(0).getDocComment().trim()); + + //contract: all the type references points to new type + Set usedTypeRefs = new HashSet<>(); + generatedType.filterChildren(new TypeFilter<>(CtTypeReference.class)) + .forEach((CtTypeReference ref) -> usedTypeRefs.add(ref.getQualifiedName())); + assertEquals(new HashSet<>(Arrays.asList( + "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs","void", + "spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$1Bar", + "java.lang.Object","spoon.test.generated.ACloneOfAClassWithMethodsAndRefs$Local")), + usedTypeRefs); + //contract: all executable references points to executables in cloned type + generatedType.filterChildren(new TypeFilter<>(CtExecutableReference.class)).forEach((CtExecutableReference execRef) -> { + CtTypeReference declTypeRef = execRef.getDeclaringType(); + if(declTypeRef.getQualifiedName().startsWith("spoon.test.generated.ACloneOfAClassWithMethodsAndRefs")) { + //OK + return; + } + if(declTypeRef.getQualifiedName().equals(Object.class.getName())) { + return; + } + fail("Unexpected declaring type " + declTypeRef.getQualifiedName()); + }); + } + + @Test + public void testPatternMatchOfMultipleElements() throws Exception { + // contract: one can match list of elements in hard-coded arrays (CtNewArray) + CtType toBeMatchedtype = ModelUtils.buildClass(ToBeMatched.class); + + // getting the list of literals defined in method match1 + List> literals1 = getFirstStmt(toBeMatchedtype, "match1", CtInvocation.class).getArguments(); + List> literals2 = getFirstStmt(toBeMatchedtype, "match2", CtInvocation.class).getArguments(); + assertEquals("a", literals1.get(0).getValue()); + + Factory f = toBeMatchedtype.getFactory(); + + { //contract: matches one exact literal + List found = new ArrayList<>(); + + // creating a Pattern from a Literal, with zero pattern parameters + // The pattern model consists of one CtLIteral only + // there is not needed any type reference, because CtLiteral has no reference to a type where it is defined + spoon.pattern.Pattern p = PatternBuilder.create(f.createLiteral("a")).build(); + + //The pattern has no parameters. There is just one constant CtLiteral + assertEquals (0, p.getParameterInfos().size()); + + // when we match the pattern agains AST of toBeMatchedtype, we find three instances of "a", + //because there are 3 instances of CtLiteral "a" in toBeMatchedtype + p.forEachMatch(toBeMatchedtype, (match) -> { + found.add(match.getMatchingElement()); + }); + + assertEquals(3, found.size()); + assertSame(literals1.get(0)/* first "a" in match1 */, found.get(0)); + assertSame(literals1.get(6)/* 2nd "a" in match1 */, found.get(1)); + assertSame(literals2.get(0)/* 1st "a" in match 2 */, found.get(2)); + } + { //contract: matches sequence of elements + List> found = new ArrayList<>(); + // now we match a sequence of "a", "b", "c" + spoon.pattern.Pattern pattern = patternOfStringLiterals(toBeMatchedtype.getFactory(), "a", "b", "c"); + pattern.forEachMatch(toBeMatchedtype, (match) -> { + found.add(match.getMatchingElements()); + }); + assertEquals(2, found.size()); + + assertEquals(3, found.get(1).size()); + // it starts with the first "a" in the match1 + assertEquals("\"a\"", found.get(0).get(0).toString()); + assertEquals(17, found.get(0).get(0).getPosition().getColumn()); + assertEquals("\"b\"", found.get(0).get(1).toString()); + assertEquals(22, found.get(0).get(1).getPosition().getColumn()); + assertEquals("\"c\"", found.get(0).get(2).toString()); + assertEquals(27, found.get(0).get(2).getPosition().getColumn()); + + // more generic asserts + assertSequenceOn(literals1, 0, 3, found.get(0)); + assertSequenceOn(literals1, 6, 3, found.get(1)); + } + { //contract: matches sequence of elements not starting at the beginning + List> found = new ArrayList<>(); + patternOfStringLiterals(toBeMatchedtype.getFactory(), "b", "c").forEachMatch(toBeMatchedtype, (match) -> { + found.add(match.getMatchingElements()); + }); + // we have three times a sequence ["b", "c"] + assertEquals(3, found.size()); + assertSequenceOn(literals1, 1, 2, found.get(0)); + assertSequenceOn(literals1, 7, 2, found.get(1)); + assertSequenceOn(literals2, 3, 2, found.get(2)); + } + { //contract: matches sequence of repeated elements, but match each element only once + List> found = new ArrayList<>(); + // we search for ["d", "d"] + patternOfStringLiterals(toBeMatchedtype.getFactory(), "d", "d").forEachMatch(toBeMatchedtype, (match) -> { + found.add(match.getMatchingElements()); + }); + // in ToBeMatched there is ["d", "d", "d", "d", "d] + // so there are only two sequences, starting at first and third "d" + assertEquals(2, found.size()); + assertSequenceOn(literals2, 6, 2, found.get(0)); + assertSequenceOn(literals2, 8, 2, found.get(1)); + } + } + + private static spoon.pattern.Pattern patternOfStringLiterals(Factory f, String... strs) { + return PatternBuilder.create(Arrays.asList(strs).stream().map(s -> f.createLiteral(s)).collect(Collectors.toList()) + ).build(); + } + + private void assertSequenceOn(List source, int expectedOffset, int expectedSize, List matches) { + //check the number of matches + assertEquals(expectedSize, matches.size()); + //check that each match fits to source collection on the expected offset + for (int i = 0; i < expectedSize; i++) { + assertSame(source.get(expectedOffset + i), matches.get(i)); + } + } + + private T getFirstStmt(CtType type, String methodName, Class stmtType) { + return (T) type.filterChildren((CtMethod m) -> m.getSimpleName().equals(methodName)).first(CtMethod.class).getBody().getStatement(0); + } + + private int indexOf(List list, Object o) { + for(int i=0; i aTargetType = launcher.getFactory().Class().get(Logger.class); + final CtMethod toBeLoggedMethod = aTargetType.getMethodsByName("enter").get(0); + + + Map params = new HashMap<>(); + params.put("_classname_", factory.Code().createLiteral(aTargetType.getSimpleName())); + params.put("_methodName_", factory.Code().createLiteral(toBeLoggedMethod.getSimpleName())); + params.put("_block_", toBeLoggedMethod.getBody()); + //create a patter from the LoggerModel#block + CtType type = factory.Templates().Type().get(LoggerModel.class); + + + // creating a pattern from method "block" + spoon.pattern.Pattern pattern = PatternBuilder.create(type.getMethodsByName("block").get(0)) + //all the variable references which are declared out of type member "block" are automatically considered + //as pattern parameters + .configurePatternParameters() + .build(); + + final List aMethods = pattern.generator().generate(params); + assertEquals(1, aMethods.size()); + final CtMethod aMethod = aMethods.get(0); + assertTrue(aMethod.getBody().getStatement(0) instanceof CtTry); + final CtTry aTry = (CtTry) aMethod.getBody().getStatement(0); + assertTrue(aTry.getFinalizer().getStatement(0) instanceof CtInvocation); + assertEquals("spoon.test.template.testclasses.logger.Logger.exit(\"enter\")", aTry.getFinalizer().getStatement(0).toString()); + assertTrue(aTry.getBody().getStatement(0) instanceof CtInvocation); + assertEquals("spoon.test.template.testclasses.logger.Logger.enter(\"Logger\", \"enter\")", aTry.getBody().getStatement(0).toString()); + assertTrue(aTry.getBody().getStatements().size() > 1); + } + + @Test + public void testMatchType() { + //contract: one can match a type + final Launcher launcher = new Launcher(); + launcher.setArgs(new String[] {"--output-type", "nooutput" }); + launcher.addInputResource("./src/test/java/spoon/test/template/testclasses/logger/Logger.java"); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + //create a template class + final CtClass aTemplateType = launcher.getFactory().Class().create("a.template.Clazz"); + //create a pattern which should match that class + Pattern pattern = PatternBuilder.create(aTemplateType) + .configurePatternParameters(pb -> { + pb.parameter("members").byRole(CtRole.TYPE_MEMBER, e -> e == aTemplateType); + pb.parameter("modifiers").byRole(CtRole.MODIFIER, e -> e == aTemplateType); + }).build(); + + final CtClass aTargetType = launcher.getFactory().Class().get(Logger.class); + List matches = pattern.getMatches(aTargetType); + assertEquals(1, matches.size()); + Match match = matches.get(0); + assertSame(aTargetType, match.getMatchingElement()); + List expectedTypeMembers = aTargetType.getTypeMembers(); + List typeMembers = (List) match.getParameters().getValue("members"); + assertEquals(expectedTypeMembers.size(), typeMembers.size()); + for (int i = 0; i < expectedTypeMembers.size(); i++) { + assertSame(expectedTypeMembers.get(i), typeMembers.get(i)); + } + } + + @Test + public void testSubstituteExactElements() { + //contract: one can substitute exactly defined element + final Launcher launcher = new Launcher(); + launcher.setArgs(new String[] {"--output-type", "nooutput" }); + launcher.addInputResource("./src/test/java/spoon/test/template/testclasses/logger/Logger.java"); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + final CtClass aTargetType = launcher.getFactory().Class().get(Logger.class); + CtMethod tobeSubstititedMethod = aTargetType.getMethodsByName("enter").get(0); + Pattern pattern = PatternBuilder.create(aTargetType) + .configurePatternParameters(pb -> { + //substitute NAME of method + pb.parameter("methodName").byRole(CtRole.NAME, tobeSubstititedMethod); + //substitute Body of method + pb.parameter("methodBody").byElement(tobeSubstititedMethod.getBody()); + }).build(); + + List matches = pattern.getMatches(aTargetType); + assertEquals(1, matches.size()); + Match match = matches.get(0); + assertSame(aTargetType, match.getMatchingElement()); + assertEquals("enter", match.getParameters().getValue("methodName")); + assertSame(tobeSubstititedMethod.getBody(), match.getParameters().getValue("methodBody")); + } + + private Map getMap(Match match, String name) { + Object v = match.getParametersMap().get(name); + assertNotNull(v); + return ((ImmutableMap) v).asMap(); + } + + @Test + void testGeneratorCopiesMetadataOfTemplateElement() { + // contract: metadata should be cloned for all elements generated via template + + String c1 = "public class A { int getOne() { return 1; } }"; + CtType type = Launcher.parseClass(c1); + String key = "foo"; + String val = "bar"; + + // attach metadata + type.descendantIterator().forEachRemaining(ctElement -> ctElement.putMetadata(key, val)); + + // create clone using the above type as template + CtType cloneType = PatternBuilder.create(type).build().generator().generate("B", new HashMap<>()); + + cloneType.descendantIterator().forEachRemaining(ctElement -> assertEquals(val, ctElement.getMetadata(key), "Metadata does not match for: " + ctElement)); + } +} diff --git a/src/test/java/spoon/test/template/SubstitutionTest.java b/src/test/java/spoon/test/template/SubstitutionTest.java index 6cc606b6104..2293fe69e32 100644 --- a/src/test/java/spoon/test/template/SubstitutionTest.java +++ b/src/test/java/spoon/test/template/SubstitutionTest.java @@ -1,5 +1,6 @@ package spoon.test.template; +import java.util.*; import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.code.CtBlock; @@ -16,271 +17,269 @@ import spoon.test.template.testclasses.types.AnEnumModel; import spoon.test.template.testclasses.types.AnIfaceModel; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.*; public class SubstitutionTest { - @Test - public void testSubstitutionInsertAllFields() { - // contract: Substitution.insertAllFields inserts the only field from a single-field template into the target class + @Test + public void testSubstitutionInsertAllFields() { + // contract: Substitution.insertAllFields inserts the only field from a single-field template into the target class - // arrange - Factory factory = createFactoryWithTemplates(); + // arrange + Factory factory = createFactoryWithTemplates(); - CtField expectedField = factory.createField(); - expectedField.setSimpleName("testString"); - expectedField.setAssignment(factory.createLiteral("goodName")); - expectedField.setType(factory.Type().stringType()); + CtField expectedField = factory.createField(); + expectedField.setSimpleName("testString"); + expectedField.setAssignment(factory.createLiteral("goodName")); + expectedField.setType(factory.Type().stringType()); - CtType targetType = factory.Class().create("someClass"); - StatementTemplate template = new SingleFieldTemplate(); + CtType targetType = factory.Class().create("someClass"); + StatementTemplate template = new SingleFieldTemplate(); - // act - Substitution.insertAllFields(targetType, template); + // act + Substitution.insertAllFields(targetType, template); - // assert - assertEquals(Collections.singletonList(expectedField), targetType.getFields()); - } + // assert + assertEquals(Collections.singletonList(expectedField), targetType.getFields()); + } - private static class SingleFieldTemplate extends StatementTemplate { - String testString = "goodName"; + private static class SingleFieldTemplate extends StatementTemplate { + String testString = "goodName"; - @Override - public void statement() { } - } + @Override + public void statement() { } + } - @Test - public void testInsertAllNestedTypes() { - // contract: Substitution.insertAllNestedTypes inserts the only nested class from a singly nested template into the target class + @Test + public void testInsertAllNestedTypes() { + // contract: Substitution.insertAllNestedTypes inserts the only nested class from a singly nested template into the target class - // arrange - Factory factory = createFactoryWithTemplates(); - CtType targetType = factory.Class().create("goodClass"); - StatementTemplate template = new SinglyNestedTemplate(); + // arrange + Factory factory = createFactoryWithTemplates(); + CtType targetType = factory.Class().create("goodClass"); + StatementTemplate template = new SinglyNestedTemplate(); - // act - Substitution.insertAllNestedTypes(targetType, template); - - // assert - assertEquals(1, targetType.getNestedTypes().size()); - assertEquals("nestedClass", targetType.getNestedType("nestedClass").getSimpleName()); - } - - private static class SinglyNestedTemplate extends StatementTemplate { - - class nestedClass { - } - - @Override - public void statement() { - } - } - - @Test - public void testInsertAllConstructor() { - // contract: Substitution.insertAllConstructor inserts the only constructor from a single constructor template into the target class - - // arrange - Factory factory = createFactoryWithTemplates(); - CtType targetType = factory.Class().create("goodClass"); - StatementTemplate template = new SingleConstructorTemplate(); - - // act - Substitution.insertAllConstructors(targetType, template); - List typeMembers = targetType.getTypeMembers(); - - // assert - assertEquals(1, typeMembers.size()); - assertTrue(typeMembers.get(0) instanceof CtConstructor); - } - - private static class SingleConstructorTemplate extends StatementTemplate { - - public SingleConstructorTemplate() { } - - @Override - public void statement() { - } - } - - @Test - public void testInsertAllSuperInterfaces() { - // contract: Substitution.insertAllSuperInterfaces inserts the only superInterface from a single interface implementing template into the target class - - // arrange - Factory factory = createFactoryWithTemplates(); - CtType targetType = factory.Class().create("goodClass"); - StatementTemplate template = new SingleInterfaceImplementingTemplate(); - - // act - Substitution.insertAllSuperInterfaces(targetType, template); - List superInterfaces = new ArrayList<>(targetType.getSuperInterfaces()); - - // assert - assertEquals(1, superInterfaces.size()); - assertTrue(superInterfaces.get(0).isInterface()); - assertEquals("A", superInterfaces.get(0).getSimpleName()); - } - - private static class SingleInterfaceImplementingTemplate extends StatementTemplate implements A { - - @Override - public void statement() { } - } - - private interface A { } - - @Test - public void testCreateTypeFromTemplate() { - //contract: the Substitution API provides a method createTypeFromTemplate - final Launcher launcher = new Launcher(); - launcher.setArgs(new String[] {"--output-type", "nooutput" }); - launcher.addTemplateResource(new FileSystemFolder("./src/test/java/spoon/test/template/testclasses/types")); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - Map parameters = new HashMap<>(); - //replace someMethod with genMethod - parameters.put("someMethod", "genMethod"); - - //contract: we can generate interface with createTypeFromTemplate - final CtType aIfaceModel = launcher.getFactory().Templates().Interface().get(AnIfaceModel.class); - CtType genIface = Substitution.createTypeFromTemplate("generated.GenIface", aIfaceModel, parameters); - assertNotNull(genIface); - CtMethod generatedIfaceMethod = genIface.getMethod("genMethod"); - assertNotNull(generatedIfaceMethod); - assertNull(genIface.getMethod("someMethod")); - - //add new substitution request - replace AnIfaceModel by GenIface - parameters.put("AnIfaceModel", genIface.getReference()); - //contract: we can generate class - final CtType aClassModel = launcher.getFactory().Class().get(AClassModel.class); - CtType genClass = Substitution.createTypeFromTemplate("generated.GenClass", aClassModel, parameters); - assertNotNull(genClass); - assertSame(genClass, factory.Type().get("generated.GenClass")); - CtMethod generatedClassMethod = genClass.getMethod("genMethod"); - assertNotNull(generatedClassMethod); - assertNull(genClass.getMethod("someMethod")); - assertNotSame(generatedIfaceMethod, generatedClassMethod); - assertTrue(generatedClassMethod.isOverriding(generatedIfaceMethod)); - - //contract: we can generate enum - parameters.put("case1", "GOOD"); - parameters.put("case2", "BETTER"); - final CtType aEnumModel = launcher.getFactory().Type().get(AnEnumModel.class); - CtEnum genEnum = (CtEnum) Substitution.createTypeFromTemplate("generated.GenEnum", aEnumModel, parameters); - assertNotNull(genEnum); - assertSame(genEnum, factory.Type().get("generated.GenEnum")); - assertEquals(2, genEnum.getEnumValues().size()); - assertEquals("GOOD", genEnum.getEnumValues().get(0).getSimpleName()); - assertEquals("BETTER", genEnum.getEnumValues().get(1).getSimpleName()); - } - - @Test - public void testSubstituteMethodBodyWithTemplatedInitializer() { - // contract: Given a block with a templated initializer, substituteMethodBody should return a - // new block with the initializer replaced with the value bound to the template parameter - - // arrange - Factory factory = createFactoryWithTemplates(); - CtClass targetClass = factory.Class().create("TargetClass"); - - String templateExecutableName = "executable"; - String templateVariableName = "s"; - String initializerToSubstitute = "My chosen initializer"; - CtStatement expectedStatement = factory.createLocalVariable( - factory.Type().stringType(), templateVariableName, factory.createLiteral(initializerToSubstitute) - ); - final CtBlock expectedMethodBody = factory.Code().createCtBlock(expectedStatement); - - StatementWithTemplatedInitializer template = new StatementWithTemplatedInitializer(); - template._initializer_ = factory.createLiteral(initializerToSubstitute); - - // act - CtBlock substitutedMethodBody = Substitution.substituteMethodBody( - targetClass, template, templateExecutableName - ); - - // assert - assertEquals(expectedMethodBody, substitutedMethodBody); - } - - @Test - public void testSubstituteStatementWithTemplatedInitializer() { - // contract: Given a statement with a templated initializer, substituteStatement should - // return a new statement with the initializer replaced with the value bound to the template - // parameter - - // arrange - Factory factory = createFactoryWithTemplates(); - CtClass targetClass = factory.Class().create("TargetClass"); - - String templateExecutableName = "executable"; - int templateVariableIndex = 0; - String templateVariableName = "s"; - String initializerToSubstitute = "My chosen initializer"; - CtStatement expectedStatement = factory.createLocalVariable( - factory.Type().stringType(), templateVariableName, factory.createLiteral(initializerToSubstitute) - ); - - StatementWithTemplatedInitializer template = new StatementWithTemplatedInitializer(); - template._initializer_ = factory.createLiteral(initializerToSubstitute); - - // act - CtStatement substitutedStatement = Substitution.substituteStatement( - targetClass, template, templateVariableIndex, templateExecutableName - ); - - // assert - assertEquals(expectedStatement, substitutedStatement); - } - - private static class StatementWithTemplatedInitializer extends ExtensionTemplate { - TemplateParameter _initializer_; - - public void executable() { - String s = _initializer_.S(); - } - } - - @Test - public void testSubstituteFieldDefaultExpressionWithTemplatedInitializer() { - // contract: Give an expression with a templated initializer, substituteFieldDefaultExpression should - // return a new expression with the initializer replaced with the value bound to the template parameter - - // arrange - Factory factory = createFactoryWithTemplates(); - CtType targetType = factory.Class().create("TargetClass"); - - String initializerToSubstitute = "My chosen initializer"; - String templateFieldName = "s"; - CtExpression expectedExpression = factory.createLiteral(initializerToSubstitute); - - FieldWithTemplatedInitializer template = new FieldWithTemplatedInitializer(); - template._initializer_ = factory.createLiteral(initializerToSubstitute); - - // act - CtExpression substitutedExpression = Substitution.substituteFieldDefaultExpression( - targetType, template, templateFieldName - ); - - // assert - assertEquals(expectedExpression, substitutedExpression); - } - - private static class FieldWithTemplatedInitializer extends ExtensionTemplate { - TemplateParameter _initializer_ = new CtLiteralImpl<>(); - String s = _initializer_.S(); - } - - private static Factory createFactoryWithTemplates() { - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/SubstitutionTest.java")); - spoon.buildModel(); - return spoon.getFactory(); - } + // act + Substitution.insertAllNestedTypes(targetType, template); + + // assert + assertEquals(1, targetType.getNestedTypes().size()); + assertEquals("nestedClass", targetType.getNestedType("nestedClass").getSimpleName()); + } + + private static class SinglyNestedTemplate extends StatementTemplate { + + class nestedClass { + } + + @Override + public void statement() { + } + } + + @Test + public void testInsertAllConstructor() { + // contract: Substitution.insertAllConstructor inserts the only constructor from a single constructor template into the target class + + // arrange + Factory factory = createFactoryWithTemplates(); + CtType targetType = factory.Class().create("goodClass"); + StatementTemplate template = new SingleConstructorTemplate(); + + // act + Substitution.insertAllConstructors(targetType, template); + List typeMembers = targetType.getTypeMembers(); + + // assert + assertEquals(1, typeMembers.size()); + assertTrue(typeMembers.get(0) instanceof CtConstructor); + } + + private static class SingleConstructorTemplate extends StatementTemplate { + + public SingleConstructorTemplate() { } + + @Override + public void statement() { + } + } + + @Test + public void testInsertAllSuperInterfaces() { + // contract: Substitution.insertAllSuperInterfaces inserts the only superInterface from a single interface implementing template into the target class + + // arrange + Factory factory = createFactoryWithTemplates(); + CtType targetType = factory.Class().create("goodClass"); + StatementTemplate template = new SingleInterfaceImplementingTemplate(); + + // act + Substitution.insertAllSuperInterfaces(targetType, template); + List superInterfaces = new ArrayList<>(targetType.getSuperInterfaces()); + + // assert + assertEquals(1, superInterfaces.size()); + assertTrue(superInterfaces.get(0).isInterface()); + assertEquals("A", superInterfaces.get(0).getSimpleName()); + } + + private static class SingleInterfaceImplementingTemplate extends StatementTemplate implements A { + + @Override + public void statement() { } + } + + private interface A { } + + @Test + public void testCreateTypeFromTemplate() { + //contract: the Substitution API provides a method createTypeFromTemplate + final Launcher launcher = new Launcher(); + launcher.setArgs(new String[] {"--output-type", "nooutput" }); + launcher.addTemplateResource(new FileSystemFolder("./src/test/java/spoon/test/template/testclasses/types")); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + Map parameters = new HashMap<>(); + //replace someMethod with genMethod + parameters.put("someMethod", "genMethod"); + + //contract: we can generate interface with createTypeFromTemplate + final CtType aIfaceModel = launcher.getFactory().Templates().Interface().get(AnIfaceModel.class); + CtType genIface = Substitution.createTypeFromTemplate("generated.GenIface", aIfaceModel, parameters); + assertNotNull(genIface); + CtMethod generatedIfaceMethod = genIface.getMethod("genMethod"); + assertNotNull(generatedIfaceMethod); + assertNull(genIface.getMethod("someMethod")); + + //add new substitution request - replace AnIfaceModel by GenIface + parameters.put("AnIfaceModel", genIface.getReference()); + //contract: we can generate class + final CtType aClassModel = launcher.getFactory().Class().get(AClassModel.class); + CtType genClass = Substitution.createTypeFromTemplate("generated.GenClass", aClassModel, parameters); + assertNotNull(genClass); + assertSame(genClass, factory.Type().get("generated.GenClass")); + CtMethod generatedClassMethod = genClass.getMethod("genMethod"); + assertNotNull(generatedClassMethod); + assertNull(genClass.getMethod("someMethod")); + assertNotSame(generatedIfaceMethod, generatedClassMethod); + assertTrue(generatedClassMethod.isOverriding(generatedIfaceMethod)); + + //contract: we can generate enum + parameters.put("case1", "GOOD"); + parameters.put("case2", "BETTER"); + final CtType aEnumModel = launcher.getFactory().Type().get(AnEnumModel.class); + CtEnum genEnum = (CtEnum) Substitution.createTypeFromTemplate("generated.GenEnum", aEnumModel, parameters); + assertNotNull(genEnum); + assertSame(genEnum, factory.Type().get("generated.GenEnum")); + assertEquals(2, genEnum.getEnumValues().size()); + assertEquals("GOOD", genEnum.getEnumValues().get(0).getSimpleName()); + assertEquals("BETTER", genEnum.getEnumValues().get(1).getSimpleName()); + } + + @Test + public void testSubstituteMethodBodyWithTemplatedInitializer() { + // contract: Given a block with a templated initializer, substituteMethodBody should return a + // new block with the initializer replaced with the value bound to the template parameter + + // arrange + Factory factory = createFactoryWithTemplates(); + CtClass targetClass = factory.Class().create("TargetClass"); + + String templateExecutableName = "executable"; + String templateVariableName = "s"; + String initializerToSubstitute = "My chosen initializer"; + CtStatement expectedStatement = factory.createLocalVariable( + factory.Type().stringType(), templateVariableName, factory.createLiteral(initializerToSubstitute) + ); + final CtBlock expectedMethodBody = factory.Code().createCtBlock(expectedStatement); + + StatementWithTemplatedInitializer template = new StatementWithTemplatedInitializer(); + template._initializer_ = factory.createLiteral(initializerToSubstitute); + + // act + CtBlock substitutedMethodBody = Substitution.substituteMethodBody( + targetClass, template, templateExecutableName + ); + + // assert + assertEquals(expectedMethodBody, substitutedMethodBody); + } + + @Test + public void testSubstituteStatementWithTemplatedInitializer() { + // contract: Given a statement with a templated initializer, substituteStatement should + // return a new statement with the initializer replaced with the value bound to the template + // parameter + + // arrange + Factory factory = createFactoryWithTemplates(); + CtClass targetClass = factory.Class().create("TargetClass"); + + String templateExecutableName = "executable"; + int templateVariableIndex = 0; + String templateVariableName = "s"; + String initializerToSubstitute = "My chosen initializer"; + CtStatement expectedStatement = factory.createLocalVariable( + factory.Type().stringType(), templateVariableName, factory.createLiteral(initializerToSubstitute) + ); + + StatementWithTemplatedInitializer template = new StatementWithTemplatedInitializer(); + template._initializer_ = factory.createLiteral(initializerToSubstitute); + + // act + CtStatement substitutedStatement = Substitution.substituteStatement( + targetClass, template, templateVariableIndex, templateExecutableName + ); + + // assert + assertEquals(expectedStatement, substitutedStatement); + } + + private static class StatementWithTemplatedInitializer extends ExtensionTemplate { + TemplateParameter _initializer_; + + public void executable() { + String s = _initializer_.S(); + } + } + + @Test + public void testSubstituteFieldDefaultExpressionWithTemplatedInitializer() { + // contract: Give an expression with a templated initializer, substituteFieldDefaultExpression should + // return a new expression with the initializer replaced with the value bound to the template parameter + + // arrange + Factory factory = createFactoryWithTemplates(); + CtType targetType = factory.Class().create("TargetClass"); + + String initializerToSubstitute = "My chosen initializer"; + String templateFieldName = "s"; + CtExpression expectedExpression = factory.createLiteral(initializerToSubstitute); + + FieldWithTemplatedInitializer template = new FieldWithTemplatedInitializer(); + template._initializer_ = factory.createLiteral(initializerToSubstitute); + + // act + CtExpression substitutedExpression = Substitution.substituteFieldDefaultExpression( + targetType, template, templateFieldName + ); + + // assert + assertEquals(expectedExpression, substitutedExpression); + } + + private static class FieldWithTemplatedInitializer extends ExtensionTemplate { + TemplateParameter _initializer_ = new CtLiteralImpl<>(); + String s = _initializer_.S(); + } + + private static Factory createFactoryWithTemplates() { + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/SubstitutionTest.java")); + spoon.buildModel(); + return spoon.getFactory(); + } } diff --git a/src/test/java/spoon/test/template/TemplateArrayAccessTest.java b/src/test/java/spoon/test/template/TemplateArrayAccessTest.java index 295cc1ebaf3..20652a5e8d2 100644 --- a/src/test/java/spoon/test/template/TemplateArrayAccessTest.java +++ b/src/test/java/spoon/test/template/TemplateArrayAccessTest.java @@ -1,61 +1,60 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.reflect.code.CtStatement; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.factory.Factory; -import spoon.support.compiler.FileSystemFile; -import spoon.test.template.testclasses.SubstituteArrayAccessTemplate; -import spoon.test.template.testclasses.SubstituteArrayLengthTemplate; - -public class TemplateArrayAccessTest { - - @Test - public void testArrayAccess() { - //contract: the template engine supports variable access, typed as Array substitution - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstituteArrayAccessTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtClass resultKlass = factory.Class().create("Result"); - CtStatement result = new SubstituteArrayAccessTemplate(new String[]{"a",null,"b"}).apply(resultKlass); - assertEquals("new java.lang.String[]{ \"a\", null, \"b\" }.toString()", result.toString()); - } - - @Test - public void testArrayLengthAccess() { - //contract: the template engine can use partial evaluation, and here, replaces the statically known length of an array by its length - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstituteArrayLengthTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtClass resultKlass = factory.Class().create("Result"); - // in SubstituteArrayLengthTemplate, withPartialEvaluation returns true - CtStatement result = new SubstituteArrayLengthTemplate(new String[]{"a",null,"b"}).apply(resultKlass); - assertEquals("if (3 > 0);", result.toString()); - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.factory.Factory; +import spoon.support.compiler.FileSystemFile; +import spoon.test.template.testclasses.SubstituteArrayAccessTemplate; +import spoon.test.template.testclasses.SubstituteArrayLengthTemplate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TemplateArrayAccessTest { + + @Test + public void testArrayAccess() { + //contract: the template engine supports variable access, typed as Array substitution + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstituteArrayAccessTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtClass resultKlass = factory.Class().create("Result"); + CtStatement result = new SubstituteArrayAccessTemplate(new String[]{"a",null,"b"}).apply(resultKlass); + assertEquals("new java.lang.String[]{ \"a\", null, \"b\" }.toString()", result.toString()); + } + + @Test + public void testArrayLengthAccess() { + //contract: the template engine can use partial evaluation, and here, replaces the statically known length of an array by its length + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstituteArrayLengthTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtClass resultKlass = factory.Class().create("Result"); + // in SubstituteArrayLengthTemplate, withPartialEvaluation returns true + CtStatement result = new SubstituteArrayLengthTemplate(new String[]{"a",null,"b"}).apply(resultKlass); + assertEquals("if (3 > 0);", result.toString()); + } +} diff --git a/src/test/java/spoon/test/template/TemplateClassAccessTest.java b/src/test/java/spoon/test/template/TemplateClassAccessTest.java index 5e691c89c17..d2847743c83 100644 --- a/src/test/java/spoon/test/template/TemplateClassAccessTest.java +++ b/src/test/java/spoon/test/template/TemplateClassAccessTest.java @@ -1,50 +1,49 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.reflect.code.CtStatement; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.factory.Factory; -import spoon.support.compiler.FileSystemFile; -import spoon.test.template.testclasses.ClassAccessTemplate; - -public class TemplateClassAccessTest { - - @Test - public void testClassAccessTest() { - //contract: the template engine supports class access substitution - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ClassAccessTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtClass resultKlass = factory.Class().create("Result"); - CtStatement result = new ClassAccessTemplate(String.class).apply(resultKlass); - assertEquals("java.lang.String.class.getName()", result.toString()); - - //I do not know if it makes sense to use null. But this kind of null handling is probably the best - CtStatement result2 = new ClassAccessTemplate(null).apply(resultKlass); - assertEquals("null.getName()", result2.toString()); - } - -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.factory.Factory; +import spoon.support.compiler.FileSystemFile; +import spoon.test.template.testclasses.ClassAccessTemplate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TemplateClassAccessTest { + + @Test + public void testClassAccessTest() { + //contract: the template engine supports class access substitution + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ClassAccessTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtClass resultKlass = factory.Class().create("Result"); + CtStatement result = new ClassAccessTemplate(String.class).apply(resultKlass); + assertEquals("java.lang.String.class.getName()", result.toString()); + + //I do not know if it makes sense to use null. But this kind of null handling is probably the best + CtStatement result2 = new ClassAccessTemplate(null).apply(resultKlass); + assertEquals("null.getName()", result2.toString()); + } + +} diff --git a/src/test/java/spoon/test/template/TemplateEnumAccessTest.java b/src/test/java/spoon/test/template/TemplateEnumAccessTest.java index ced7575439e..a9c4234a0f0 100644 --- a/src/test/java/spoon/test/template/TemplateEnumAccessTest.java +++ b/src/test/java/spoon/test/template/TemplateEnumAccessTest.java @@ -1,53 +1,51 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.File; -import java.lang.annotation.ElementType; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.OutputType; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.factory.Factory; -import spoon.support.compiler.FileSystemFile; -import spoon.test.template.testclasses.EnumAccessTemplate; -import spoon.testing.utils.ModelUtils; - -public class TemplateEnumAccessTest { - - @Test - public void testEnumAccessTest() { - //contract: the template engine supports enum value access substitution - Launcher launcher = new Launcher(); - launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/EnumAccessTemplate.java")); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "EnumAccessResult"); - new EnumAccessTemplate(ElementType.FIELD, launcher.getFactory()).apply(resultKlass); - assertEquals("java.lang.annotation.ElementType.FIELD.name()", resultKlass.getMethod("method").getBody().getStatement(0).toString()); - launcher.setSourceOutputDirectory(new File("./target/spooned/")); - launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); - ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/EnumAccessResult.java"), 8); - } - -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import java.io.File; +import java.lang.annotation.ElementType; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.OutputType; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.factory.Factory; +import spoon.support.compiler.FileSystemFile; +import spoon.test.template.testclasses.EnumAccessTemplate; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TemplateEnumAccessTest { + + @Test + public void testEnumAccessTest() { + //contract: the template engine supports enum value access substitution + Launcher launcher = new Launcher(); + launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/EnumAccessTemplate.java")); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "EnumAccessResult"); + new EnumAccessTemplate(ElementType.FIELD, launcher.getFactory()).apply(resultKlass); + assertEquals("java.lang.annotation.ElementType.FIELD.name()", resultKlass.getMethod("method").getBody().getStatement(0).toString()); + launcher.setSourceOutputDirectory(new File("./target/spooned/")); + launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); + ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/EnumAccessResult.java"), 8); + } + +} diff --git a/src/test/java/spoon/test/template/TemplateInvocationSubstitutionTest.java b/src/test/java/spoon/test/template/TemplateInvocationSubstitutionTest.java index f6f2da276c3..00c9b00378f 100644 --- a/src/test/java/spoon/test/template/TemplateInvocationSubstitutionTest.java +++ b/src/test/java/spoon/test/template/TemplateInvocationSubstitutionTest.java @@ -1,98 +1,97 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.reflect.code.CtBlock; -import spoon.reflect.code.CtStatement; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.factory.Factory; -import spoon.support.compiler.FileSystemFile; -import spoon.support.template.Parameters; -import spoon.support.template.UndefinedParameterException; -import spoon.template.BlockTemplate; -import spoon.test.template.testclasses.InvocationSubstitutionByExpressionTemplate; -import spoon.test.template.testclasses.InvocationSubstitutionByStatementTemplate; -import spoon.test.template.testclasses.SubstitutionByExpressionTemplate; - -public class TemplateInvocationSubstitutionTest { - - @Test - public void testInvocationSubstitutionByStatement() { - //contract: the template engine supports substitution of any method invocation - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/InvocationSubstitutionByStatementTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtBlock templateArg = factory.Templates().Class().get(InvocationSubstitutionByStatementTemplate.class).getMethod("sample").getBody(); - - CtClass resultKlass = factory.Class().create("Result"); - CtStatement result = new InvocationSubstitutionByStatementTemplate(templateArg).apply(resultKlass); - assertEquals("throw new java.lang.RuntimeException(\"Failed\")", result.toString()); - } - - @Test - public void testInvocationSubstitutionByExpression() { - //contract: the template engine supports substitution of any method invocation - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/InvocationSubstitutionByExpressionTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtClass resultKlass = factory.Class().create("Result"); - CtBlock result = new InvocationSubstitutionByExpressionTemplate(factory.createLiteral("abc")).apply(resultKlass); - - assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(0).toString()); - assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(1).toString()); - - // contract: the result of the template has no parent, and can be put anywhere in an AST - assertFalse(result.isParentInitialized()); - } - - @Test - public void testSubstitutionByExpression() { - //contract: the template engine understands fields whose type extends from TemplateParameter as template parameter automatically. No need for extra annotation - Launcher spoon = new Launcher(); - spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstitutionByExpressionTemplate.java")); - - spoon.buildModel(); - Factory factory = spoon.getFactory(); - - CtClass resultKlass = factory.Class().create("Result"); - BlockTemplate template = new SubstitutionByExpressionTemplate(factory.createLiteral("abc")); - CtBlock result = template.apply(resultKlass); - assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(0).toString()); - - // contract: the template code sends UndefinedParameterException - try { - Parameters.getValue(template, "oops", 3); - fail(); - } catch (UndefinedParameterException expected) { - // everything OK - } - - } -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.factory.Factory; +import spoon.support.compiler.FileSystemFile; +import spoon.support.template.Parameters; +import spoon.support.template.UndefinedParameterException; +import spoon.template.BlockTemplate; +import spoon.test.template.testclasses.InvocationSubstitutionByExpressionTemplate; +import spoon.test.template.testclasses.InvocationSubstitutionByStatementTemplate; +import spoon.test.template.testclasses.SubstitutionByExpressionTemplate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.fail; + +public class TemplateInvocationSubstitutionTest { + + @Test + public void testInvocationSubstitutionByStatement() { + //contract: the template engine supports substitution of any method invocation + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/InvocationSubstitutionByStatementTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtBlock templateArg = factory.Templates().Class().get(InvocationSubstitutionByStatementTemplate.class).getMethod("sample").getBody(); + + CtClass resultKlass = factory.Class().create("Result"); + CtStatement result = new InvocationSubstitutionByStatementTemplate(templateArg).apply(resultKlass); + assertEquals("throw new java.lang.RuntimeException(\"Failed\")", result.toString()); + } + + @Test + public void testInvocationSubstitutionByExpression() { + //contract: the template engine supports substitution of any method invocation + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/InvocationSubstitutionByExpressionTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtClass resultKlass = factory.Class().create("Result"); + CtBlock result = new InvocationSubstitutionByExpressionTemplate(factory.createLiteral("abc")).apply(resultKlass); + + assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(0).toString()); + assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(1).toString()); + + // contract: the result of the template has no parent, and can be put anywhere in an AST + assertFalse(result.isParentInitialized()); + } + + @Test + public void testSubstitutionByExpression() { + //contract: the template engine understands fields whose type extends from TemplateParameter as template parameter automatically. No need for extra annotation + Launcher spoon = new Launcher(); + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstitutionByExpressionTemplate.java")); + + spoon.buildModel(); + Factory factory = spoon.getFactory(); + + CtClass resultKlass = factory.Class().create("Result"); + BlockTemplate template = new SubstitutionByExpressionTemplate(factory.createLiteral("abc")); + CtBlock result = template.apply(resultKlass); + assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(0).toString()); + + // contract: the template code sends UndefinedParameterException + try { + Parameters.getValue(template, "oops", 3); + fail(); + } catch (UndefinedParameterException expected) { + // everything OK + } + + } +} diff --git a/src/test/java/spoon/test/template/TemplateReplaceReturnTest.java b/src/test/java/spoon/test/template/TemplateReplaceReturnTest.java index 03645665df0..29ddc4c6304 100644 --- a/src/test/java/spoon/test/template/TemplateReplaceReturnTest.java +++ b/src/test/java/spoon/test/template/TemplateReplaceReturnTest.java @@ -1,76 +1,74 @@ -/** - * Copyright (C) 2006-2018 INRIA and contributors - * Spoon - http://spoon.gforge.inria.fr/ - * - * This software is governed by the CeCILL-C License under French law and - * abiding by the rules of distribution of free software. You can use, modify - * and/or redistribute the software under the terms of the CeCILL-C license as - * circulated by CEA, CNRS and INRIA at http://www.cecill.info. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package spoon.test.template; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static spoon.testing.utils.ModelUtils.getOptimizedString; - -import java.io.File; - -import org.junit.jupiter.api.Test; - -import spoon.Launcher; -import spoon.OutputType; -import spoon.reflect.code.CtBlock; -import spoon.reflect.code.CtExpression; -import spoon.reflect.declaration.CtClass; -import spoon.reflect.factory.Factory; -import spoon.support.compiler.FileSystemFile; -import spoon.test.template.testclasses.ReturnReplaceTemplate; -import spoon.testing.utils.ModelUtils; - -public class TemplateReplaceReturnTest { - - @Test - public void testReturnReplaceTemplate() { - //contract: the template engine supports replace of `return _param_.S()` by `` - Launcher launcher = new Launcher(); - launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ReturnReplaceTemplate.java")); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - CtBlock model = (CtBlock) factory.Templates().Class().get(ReturnReplaceTemplate.class).getMethod("sample").getBody(); - - CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "ReturnReplaceResult"); - new ReturnReplaceTemplate(model).apply(resultKlass); - assertEquals("{ if ((java.lang.System.currentTimeMillis() % 2L) == 0) { return \"Panna\"; } else { return \"Orel\"; }}", getOptimizedString(resultKlass.getMethod("method").getBody())); - launcher.setSourceOutputDirectory(new File("./target/spooned/")); - launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); - ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/ReturnReplaceResult.java"), 8); - } - - @Test - public void testNoReturnReplaceTemplate() { - //contract: the template engine supports replace of return expression by `` - Launcher launcher = new Launcher(); - launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ReturnReplaceTemplate.java")); - - launcher.buildModel(); - Factory factory = launcher.getFactory(); - - CtExpression model = factory.createLiteral("AStringLiteral"); - - CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "ReturnReplaceResult"); - new ReturnReplaceTemplate(model).apply(resultKlass); - assertEquals("{ return \"AStringLiteral\";}", getOptimizedString(resultKlass.getMethod("method").getBody())); - launcher.setSourceOutputDirectory(new File("./target/spooned/")); - launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); - ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/ReturnReplaceResult.java"), 8); - } - -} +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.test.template; + +import java.io.File; +import org.junit.jupiter.api.Test; +import spoon.Launcher; +import spoon.OutputType; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtExpression; +import spoon.reflect.declaration.CtClass; +import spoon.reflect.factory.Factory; +import spoon.support.compiler.FileSystemFile; +import spoon.test.template.testclasses.ReturnReplaceTemplate; +import spoon.testing.utils.ModelUtils; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static spoon.testing.utils.ModelUtils.getOptimizedString; + +public class TemplateReplaceReturnTest { + + @Test + public void testReturnReplaceTemplate() { + //contract: the template engine supports replace of `return _param_.S()` by `` + Launcher launcher = new Launcher(); + launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ReturnReplaceTemplate.java")); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + CtBlock model = (CtBlock) factory.Templates().Class().get(ReturnReplaceTemplate.class).getMethod("sample").getBody(); + + CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "ReturnReplaceResult"); + new ReturnReplaceTemplate(model).apply(resultKlass); + assertEquals("{ if ((java.lang.System.currentTimeMillis() % 2L) == 0) { return \"Panna\"; } else { return \"Orel\"; }}", getOptimizedString(resultKlass.getMethod("method").getBody())); + launcher.setSourceOutputDirectory(new File("./target/spooned/")); + launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); + ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/ReturnReplaceResult.java"), 8); + } + + @Test + public void testNoReturnReplaceTemplate() { + //contract: the template engine supports replace of return expression by `` + Launcher launcher = new Launcher(); + launcher.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ReturnReplaceTemplate.java")); + + launcher.buildModel(); + Factory factory = launcher.getFactory(); + + CtExpression model = factory.createLiteral("AStringLiteral"); + + CtClass resultKlass = factory.Class().create(factory.Package().getOrCreate("spoon.test.template"), "ReturnReplaceResult"); + new ReturnReplaceTemplate(model).apply(resultKlass); + assertEquals("{ return \"AStringLiteral\";}", getOptimizedString(resultKlass.getMethod("method").getBody())); + launcher.setSourceOutputDirectory(new File("./target/spooned/")); + launcher.getModelBuilder().generateProcessedSourceFiles(OutputType.CLASSES); + ModelUtils.canBeBuilt(new File("./target/spooned/spoon/test/template/ReturnReplaceResult.java"), 8); + } + +} diff --git a/src/test/java/spoon/test/template/TemplateTest.java b/src/test/java/spoon/test/template/TemplateTest.java index 0a21d826eac..8bc6608732a 100644 --- a/src/test/java/spoon/test/template/TemplateTest.java +++ b/src/test/java/spoon/test/template/TemplateTest.java @@ -16,6 +16,18 @@ */ package spoon.test.template; +import java.io.File; +import java.io.Serializable; +import java.rmi.Remote; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import spoon.Launcher; @@ -44,7 +56,6 @@ import spoon.support.compiler.FileSystemFile; import spoon.support.template.Parameters; import spoon.template.*; -import spoon.test.template.testclasses.*; import spoon.test.template.testclasses.bounds.CheckBound; import spoon.test.template.testclasses.bounds.CheckBoundMatcher; import spoon.test.template.testclasses.bounds.CheckBoundTemplate; @@ -60,29 +71,18 @@ import spoon.test.template.testclasses.inheritance.SuperTemplate; import spoon.test.template.testclasses.logger.Logger; import spoon.test.template.testclasses.logger.LoggerTemplateProcessor; +import spoon.test.template.testclasses.*; import spoon.testing.utils.LineSeparatorExtension; import spoon.testing.utils.ModelUtils; -import java.io.File; -import java.io.Serializable; -import java.rmi.Remote; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import static java.util.Arrays.asList; + import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import static spoon.testing.utils.ModelUtils.getOptimizedString; @@ -110,7 +110,7 @@ public void testTemplateInheritance() throws Exception { //Collects type members which should contain generated by comment final Map elementToGeneratedByMember = new IdentityHashMap<>(); - + CtClass superc = factory.Class().get(SuperClass.class); new SuperTemplate().addGeneratedBy(true).apply(superc); @@ -157,7 +157,7 @@ public void testTemplateInheritance() throws Exception { // contract: nested types of the templates are copied assertEquals(1, subc.getNestedTypes().size()); elementToGeneratedByMember.put(subc.getNestedTypes().iterator().next(), "$InnerClass"); - + // contract: methods are renamed assertEquals(1, subc.getMethodsByName("newVarName").size()); CtMethod varMethod = subc.getMethodsByName("newVarName").get(0); @@ -202,7 +202,7 @@ public void testTemplateInheritance() throws Exception { // contract: local variable read are replaced by local variable read with modified local variable name assertEquals("l = ((java.util.LinkedList) (newVarName))// will be replaced by l = (LinkedList) newVarName" + newLine, methodWithTemplatedParameters.getBody().getStatement(13).toString()); - + // contract; field access is handled same like local variable access CtMethod methodWithFieldAccess = subc.getElements( new NamedElementFilter<>(CtMethod.class, "methodWithFieldAccess")).get(0); @@ -214,7 +214,7 @@ public void testTemplateInheritance() throws Exception { // contract: field read are replaced by field read with modified field name assertEquals("l = ((java.util.LinkedList) (newVarName))// will be replaced by l = (LinkedList) newVarName" + newLine, methodWithFieldAccess.getBody().getStatement(3).toString()); - + class Context { int nrTypeMembers = 0; @@ -258,7 +258,7 @@ class Context { */ private static final Pattern generatedByRE = Pattern.compile(".*Generated by ([^$#\\(]+)([^\\(]*)\\(([^\\.]+)\\.java:(\\d+)\\).*", Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern typeMemberRE = Pattern.compile("[^\\.$#]+$"); - + private void assertCommentHasGeneratedBy(CtElement e, String templateQName, Map elementToGeneratedByMember) { String docComment = e.getDocComment(); String generatedByMember = elementToGeneratedByMember.get(e); @@ -495,7 +495,7 @@ public void testTemplateMatcher() throws Exception { checkParameters("foo", match, "_x_", "new java.util.ArrayList<>().size()", "_y_", "10") - ||checkParameters("foo2", match, + ||checkParameters("foo2", match, "_x_", "new java.util.ArrayList<>().size()", "_y_", "11") ||checkParameters("fbar", match, @@ -518,7 +518,7 @@ public void testTemplateMatcher() throws Exception { "_x_", "new java.util.ArrayList<>().size()", "_y_", "10", "_block_", "{ throw new java.lang.IndexOutOfBoundsException();}") - ||checkParameters("foo2", match, + ||checkParameters("foo2", match, "_x_", "new java.util.ArrayList<>().size()", "_y_", "11", "_block_", "{ throw new java.lang.IndexOutOfBoundsException();}") @@ -555,7 +555,7 @@ public void testTemplateMatcher() throws Exception { "_x_", "new java.util.ArrayList<>().size()", "_y_", "10", "_stmt_", "throw new java.lang.IndexOutOfBoundsException()") - ||checkParameters("foo2", match, + ||checkParameters("foo2", match, "_x_", "new java.util.ArrayList<>().size()", "_y_", "11", "_stmt_", "throw new java.lang.IndexOutOfBoundsException()") @@ -626,7 +626,7 @@ public void testTemplateMatcher() throws Exception { assertEquals("fbar", ctElements.get(2).getSimpleName()); } } - + private boolean checkParameters(String methodName, Match match, String... keyValues) { if (methodName.equals(getMethodName(match.getMatchingElement()))) { assertEquals(0, keyValues.length % 2, "The arguments of keyValues must be in pairs"); @@ -783,7 +783,7 @@ public void testTemplateMatcherMatchTwoSnippets() { CtElement match2 = matches.get(1); assertTrue(match1.equals(match2)); - + //match using TemplateMatcher#matches method and query filter matches = factory.getModel().filterChildren(matcher).list(); @@ -889,7 +889,7 @@ public void testStatementTemplateRootSubstitution() { CtClass templateClass = factory.Templates().Class().get(SubstituteRootTemplate.class); CtBlock templateParam = (CtBlock) templateClass.getMethod("sampleBlock").getBody(); - + CtClass resultKlass = factory.Class().create("Result"); CtStatement result = new SubstituteRootTemplate(templateParam).apply(resultKlass); assertEquals("java.lang.String s = \"Spoon is cool!\"", ((CtBlock)result).getStatement(0).toString()); @@ -914,7 +914,7 @@ public void testExpressionTemplate() { assertFalse(result.isParentInitialized()); assertEquals("new java.lang.String(\"Spoon is cool!\")", result.toString()); } - + @Test public void substituteStringLiteral() { //contract: the substitution of literals is possible too @@ -942,7 +942,7 @@ public void substituteStringLiteral() { assertEquals("java.lang.System.out.println(\"value2\")", result.getMethodsByName("m1").get(0).getBody().getStatement(0).toString()); } { - //contract: simple name of type reference is substituted in String literal + //contract: simple name of type reference is substituted in String literal final CtClass result = (CtClass) new SubstituteLiteralTemplate(factory.Type().createReference("some.ignored.foo.TypeName")).apply(factory.createClass()); assertEquals("java.lang.String stringField1 = \"TypeName\";", result.getField("stringField1").toString()); assertEquals("java.lang.String stringField2 = \"Substring TypeName is substituted too - TypeName\";", result.getField("stringField2").toString()); @@ -1049,7 +1049,7 @@ public void testFieldAccessNameSubstitution() { //contract: String value is substituted in String literal final CtClass result = (CtClass) new FieldAccessTemplate("value").apply(factory.Class().create("x.X")); assertEquals("int value;", result.getField("value").toString()); - + assertEquals("value = 7", result.getMethodsByName("m").get(0).getBody().getStatement(0).toString()); } } @@ -1068,7 +1068,7 @@ public void testFieldAccessNameSubstitutionInInnerClass() { final CtClass result = (CtClass) new FieldAccessOfInnerClassTemplate("value").apply(factory.Class().create("x.X")); final CtClass innerClass = result.getNestedType("Inner"); assertEquals("int value;", innerClass.getField("value").toString()); - + assertEquals("value = 7", innerClass.getMethodsByName("m").get(0).getBody().getStatement(0).toString()); } } @@ -1106,7 +1106,7 @@ public void substituteTypeAccessReference() { //contract: String value is substituted in substring of literal, named element and reference CtTypeReference typeRef = factory.Type().createReference("spoon.test.template.TypeReferenceClassAccess$Example"); typeRef.addActualTypeArgument(factory.Type().dateType()); - + final CtClass result = (CtClass) new TypeReferenceClassAccessTemplate(typeRef).apply(factory.Class().create("spoon.test.template.TypeReferenceClassAccess")); spoon.prettyprint(); ModelUtils.canBeBuilt(outputDir, 8); diff --git a/src/test/java/spoon/test/template/core/ParameterInfoTest.java b/src/test/java/spoon/test/template/core/ParameterInfoTest.java index 7e2fc7ba710..beb87b9ce80 100644 --- a/src/test/java/spoon/test/template/core/ParameterInfoTest.java +++ b/src/test/java/spoon/test/template/core/ParameterInfoTest.java @@ -1,432 +1,429 @@ -package spoon.test.template.core; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.fail; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import org.junit.jupiter.api.Test; - -import spoon.pattern.internal.parameter.ListParameterInfo; -import spoon.pattern.internal.parameter.MapParameterInfo; -import spoon.pattern.internal.parameter.ParameterInfo; -import spoon.pattern.internal.parameter.SetParameterInfo; -import spoon.reflect.meta.ContainerKind; -import spoon.support.util.ImmutableMap; -import spoon.support.util.ImmutableMapImpl; - -public class ParameterInfoTest { - - @Test - public void testParameterNames() { - assertEquals("year", new MapParameterInfo("year").getName()); - assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); - assertEquals("year", new MapParameterInfo(new MapParameterInfo("year")).getName()); - assertEquals("year", new MapParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); - assertEquals("year.age", new MapParameterInfo("age", new MapParameterInfo("year")).getName()); - assertEquals("year.age", new MapParameterInfo("age", new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); - - assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)).getName()); - assertEquals("year", new ListParameterInfo(new MapParameterInfo("year")).getName()); - assertEquals("year", new ListParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)).getName()); - assertEquals("year_7_", new ListParameterInfo(7, new MapParameterInfo("year")).getName()); - assertEquals("year_7_", new ListParameterInfo(new ListParameterInfo(7, new MapParameterInfo("year"))).getName()); - assertEquals("year_7__2_", new ListParameterInfo(2, new ListParameterInfo(7, new MapParameterInfo("year"))).getName()); - assertEquals("year_7__2_.age", new MapParameterInfo("age", new ListParameterInfo(2, new ListParameterInfo(7, new MapParameterInfo("year")))).getName()); - - assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.SET)).getName()); - assertEquals("year", new SetParameterInfo(new MapParameterInfo("year")).getName()); - assertEquals("year", new SetParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.SET)).getName()); - - } - @Test - public void testSingleValueParameterByNameIntoNullContainer() { - ParameterInfo namedParam = new MapParameterInfo("year"); - {//adding value into null container, creates a new container with that value - ImmutableMap val = namedParam.addValueAs(null, 2018); - assertNotNull(val); - assertEquals(map().put("year", 2018), val.asMap()); - } - } - @Test - public void testSingleValueParameterByNameIntoEmptyContainer() { - ParameterInfo namedParam = new MapParameterInfo("year"); - {//adding value into empty container, creates a new container with that value - ImmutableMap empty = new ImmutableMapImpl(); - ImmutableMap val = namedParam.addValueAs(empty, 2018); - assertNotNull(val); - assertEquals(map().put("year", 2018), val.asMap()); - //empty is still empty - assertEquals(map(), empty.asMap()); - } - } - @Test - public void testSingleValueParameterByNameWhenAlreadyExists() { - ParameterInfo namedParam = new MapParameterInfo("year"); - {//adding value into container, which already contains that value changes nothing and returns origin container - ImmutableMap oldContainer = new ImmutableMapImpl().putValue("year", 2018); - assertEquals(map().put("year", 2018), oldContainer.asMap()); - //it returned the same container - assertSame(oldContainer, namedParam.addValueAs(oldContainer, 2018)); - assertEquals(map().put("year", 2018), oldContainer.asMap()); - } - } - @Test - public void testSingleValueParameterByNameWhenDifferentExists() { - ParameterInfo namedParam = new MapParameterInfo("year"); - {//adding a value into container, which already contains a different value returns null - no match - ImmutableMap oldContainer = new ImmutableMapImpl().putValue("year", 2018); - assertNull(namedParam.addValueAs(oldContainer, 2111)); - assertNull(namedParam.addValueAs(oldContainer, 0)); - assertNull(namedParam.addValueAs(oldContainer, null)); - //old container is never changed - assertEquals(map().put("year", 2018), oldContainer.asMap()); - } - } - @Test - public void testOptionalSingleValueParameterByName() { - ParameterInfo namedParam = new MapParameterInfo("year") - .setMinOccurrences(0); - {//adding null value into an container with minCount == 0, returns unchanged container. - //because minCount == 0 means that value is optional - ImmutableMap container = new ImmutableMapImpl().putValue("a", "b"); - assertSame(container, namedParam.addValueAs(container, null)); - assertEquals(map().put("a", "b"), container.asMap()); - } - } - @Test - public void testMandatorySingleValueParameterByName() { - //adding null value into an container with minCount == 1, returns null -> means NO match, null is not allowed. - //because minCount == 0 means that value is optional - ParameterInfo namedParam = new MapParameterInfo("year") - .setMinOccurrences(1); - { - ImmutableMap container = new ImmutableMapImpl().putValue("a", "b"); - assertNull(namedParam.addValueAs(container, null)); - assertEquals(map().put("a", "b"), container.asMap()); - } - } - @Test - public void testSingleValueParameterByNameConditionalMatcher() { - ParameterInfo namedParam = new MapParameterInfo("year").setMatchCondition(Integer.class, i -> i > 2000); - - //matching value is accepted - ImmutableMap val = namedParam.addValueAs(null, 2018); - assertNotNull(val); - assertEquals(map().put("year", 2018), val.asMap()); - //not matching value is not accepted - assertNull(namedParam.addValueAs(null, 1000)); - assertNull(namedParam.addValueAs(null, "3000")); - //even matching value is STILL not accepted when there is already a different value - assertNull(namedParam.addValueAs(new ImmutableMapImpl().putValue("year", 3000), 2018)); - } - - @Test - public void testListParameterByNameIntoNull() { - ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); - {//adding value into null container, creates a new container with List which contains that value - ImmutableMap val = namedParam.addValueAs(null, 2018); - assertNotNull(val); - assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); - } - } - @Test - public void testListParameterByNameIntoEmptyContainer() { - ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); - {//adding value into empty container, creates a new container with List which contains that value - ImmutableMap empty = new ImmutableMapImpl(); - ImmutableMap val = namedParam.addValueAs(empty, 2018); - assertNotNull(val); - assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); - //empty is still empty - assertEquals(map(), empty.asMap()); - } - } - @Test - public void testListParameterByNameIntoEmptyContainerWithEmptyList() { - Consumer check = (namedParam) -> - {//adding value into container, which already contains a empty list, creates a new container with List which contains that value - ImmutableMap empty = new ImmutableMapImpl().putValue("year", Collections.emptyList()); - - ImmutableMap val = namedParam.addValueAs(empty, 2018); - //adding same value - adds the second value again - ImmutableMap val2 = namedParam.addValueAs(val, 2018); - //adding null value - adds nothing. Same container is returned - assertSame(val2, namedParam.addValueAs(val2, null)); - - //empty is still empty - assertEquals(map().put("year", Collections.emptyList()), empty.asMap()); - assertNotNull(val); - assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); - assertNotNull(val2); - assertEquals(map().put("year", Arrays.asList(2018, 2018)), val2.asMap()); - }; - //contract: it behaves like this when container kind is defined as LIST - check.accept(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)); - //contract: it behaves like this even when container kind is not defined, so it is automatically detected from the existing parameter value - check.accept(new MapParameterInfo("year")); - //contract: it behaves like this when ListAccessor + NamedAccessor is used - check.accept(new ListParameterInfo(new MapParameterInfo("year"))); - //contract: it behaves like this when ListAccessor + NamedAccessor with defined container is used with - check.accept(new ListParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST))); - } - - @Test - public void testMergeOnDifferentValueTypeContainers() { - BiConsumer checker = (parameter, params) -> { - //contract: the same value can be always applied when it already exists there independent on container type - assertSame(params, parameter.addValueAs(params, "x")); - //contract: the different value must be never applied independent on container type - assertNull(parameter.addValueAs(params, "y")); - //contract: the different value must be never applied independent on container type - assertNull(parameter.addValueAs(params, null)); - }; - ImmutableMap empty = new ImmutableMapImpl(); - checker.accept(new MapParameterInfo("year"), empty.putValue("year", "x")); - checker.accept(new ListParameterInfo(0, new MapParameterInfo("year")), empty.putValue("year", Collections.singletonList("x"))); - checker.accept(new ListParameterInfo(1, new MapParameterInfo("year")), empty.putValue("year", Arrays.asList("zz","x"))); - checker.accept(new MapParameterInfo("key", new ListParameterInfo(1, new MapParameterInfo("year"))), empty.putValue("year", Arrays.asList("zz",empty.putValue("key", "x")))); - checker.accept(new MapParameterInfo("key", new MapParameterInfo("year")), empty.putValue("year", empty.putValue("key", "x"))); - } - - @Test - public void testAppendIntoList() { - ParameterInfo parameter = new MapParameterInfo("years").setContainerKind(ContainerKind.LIST); - ImmutableMap params = parameter.addValueAs(null, 1000); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(1000)), params.asMap()); - - params = parameter.addValueAs(params, 100); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(1000, 100)), params.asMap()); - - params = parameter.addValueAs(params, "a"); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(1000, 100, "a")), params.asMap()); - - params = parameter.addValueAs(params, "a"); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(1000, 100, "a", "a")), params.asMap()); - } - - @Test - public void testSetIntoList() { - ParameterInfo named = new MapParameterInfo("years"); - ImmutableMap params = new ListParameterInfo(2, named).addValueAs(null, 1000); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(null, null, 1000)), params.asMap()); - - params = new ListParameterInfo(0, named).addValueAs(params, 10); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(10, null, 1000)), params.asMap()); - - params = new ListParameterInfo(3, named).addValueAs(params, 10000); - assertNotNull(params); - assertEquals(map().put("years", Arrays.asList(10, null, 1000, 10000)), params.asMap()); - } - - @Test - public void testAppendIntoSet() { - ParameterInfo parameter = new MapParameterInfo("years").setContainerKind(ContainerKind.SET); - ImmutableMap params = parameter.addValueAs(null, 1000); - assertNotNull(params); - assertEquals(map().put("years", asSet(1000)), params.asMap()); - - params = parameter.addValueAs(params, 100); - assertNotNull(params); - assertEquals(map().put("years", asSet(1000, 100)), params.asMap()); - - params = parameter.addValueAs(params, "a"); - assertNotNull(params); - assertEquals(map().put("years", asSet(1000, 100, "a")), params.asMap()); - - assertSame(params, parameter.addValueAs(params, "a")); - assertNotNull(params); - assertEquals(map().put("years", asSet(1000, 100, "a")), params.asMap()); - } - @Test - public void testMapEntryInParameterByName() { - BiConsumer checker = (namedParam, empty) -> - {//the Map.Entry value is added into property of type Map - //only Map.Entries can be added - assertNull(namedParam.addValueAs(empty, "a value")); - - final ImmutableMap val = namedParam.addValueAs(empty, entry("year", 2018)); - assertNotNull(val); - assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); - - //adding null entry changes nothing - assertSame(val, namedParam.addValueAs(val, null)); - //adding same value changes nothing - assertSame(val, namedParam.addValueAs(val, entry("year", 2018))); - //adding entry value with same key, but different value - no match - assertNull(namedParam.addValueAs(val, entry("year", 1111))); - - ImmutableMap val2 = namedParam.addValueAs(val, entry("age", "best")); - assertNotNull(val2); - assertEquals(map().put("map", new ImmutableMapImpl() - .putValue("year", 2018) - .putValue("age", "best")), val2.asMap()); - - //after all the once returned val is still the same - unmodified - assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); - }; - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl()); - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", null)); - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); - //the map container is detected automatically from the type of value - checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); - //the map container is detected automatically from the type of value - checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", new ImmutableMapImpl())); - } - @Test - public void testAddMapIntoParameterByName() { - BiConsumer checker = (namedParam, empty) -> - {//the Map value is added into property of type Map - ImmutableMap val = namedParam.addValueAs(empty, Collections.emptyMap()); - assertEquals(map().put("map", new ImmutableMapImpl()), val.asMap()); - val = namedParam.addValueAs(empty, map().put("year", 2018)); - assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); - val = namedParam.addValueAs(empty, map().put("year", 2018).put("age", 1111)); - assertEquals(map().put("map", new ImmutableMapImpl() - .putValue("year", 2018) - .putValue("age", 1111)), val.asMap()); - - //adding null entry changes nothing - assertSame(val, namedParam.addValueAs(val, null)); - //adding same value changes nothing - assertSame(val, namedParam.addValueAs(val, entry("year", 2018))); - //adding entry value with same key, but different value - no match - assertNull(namedParam.addValueAs(val, entry("year", 1111))); - }; - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl()); - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", null)); - checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); - //the map container is detected automatically from the type of value - checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); - //the map container is detected automatically from the type of value - checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", new ImmutableMapImpl())); - //the map container is detected automatically from the type of new value - checker.accept(new MapParameterInfo("map"), null); - } - - @Test - public void testAddListIntoParameterByName() { - BiConsumer checker = (namedParam, empty) -> - {//the List value is added into property of type List - ImmutableMap val = namedParam.addValueAs(empty, Collections.emptyList()); - assertEquals(map().put("list", Collections.emptyList()), val.asMap()); - val = namedParam.addValueAs(empty, Arrays.asList(2018)); - assertEquals(map().put("list", Arrays.asList(2018)), val.asMap()); - val = namedParam.addValueAs(empty, Arrays.asList(2018, 1111)); - assertEquals(map().put("list", Arrays.asList(2018, 1111)), val.asMap()); - - //adding null entry changes nothing - assertSame(val, namedParam.addValueAs(val, null)); - }; - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl()); - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", null)); - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", Collections.emptyList())); - //Set can be converted to List - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", Collections.emptySet())); - //the list container is detected automatically from the type of value - checker.accept(new MapParameterInfo("list"), new ImmutableMapImpl().putValue("list", Collections.emptyList())); - //the list container is detected automatically from the type of new value - checker.accept(new MapParameterInfo("list"), null); - } - @Test - public void testAddSetIntoParameterByName() { - BiConsumer checker = (namedParam, empty) -> - {//the Set value is added into property of type Set - ImmutableMap val = namedParam.addValueAs(empty, Collections.emptySet()); - assertEquals(map().put("list", Collections.emptySet()), val.asMap()); - val = namedParam.addValueAs(empty, asSet(2018)); - assertEquals(map().put("list", asSet(2018)), val.asMap()); - val = namedParam.addValueAs(empty, asSet(2018, 1111)); - assertEquals(map().put("list", asSet(2018, 1111)), val.asMap()); - - //adding null entry changes nothing - assertSame(val, namedParam.addValueAs(val, null)); - //adding same entry changes nothing - assertSame(val, namedParam.addValueAs(val, 1111)); - //adding Set with same entry changes nothing - assertSame(val, namedParam.addValueAs(val, asSet(1111))); - //adding Set with same entry changes nothing - assertSame(val, namedParam.addValueAs(val, asSet(2018, 1111))); - }; - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl()); - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", null)); - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", Collections.emptySet())); - //The container kind has higher priority, so List will be converted to Set - checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", Collections.emptyList())); - //the list container is detected automatically from the type of value - checker.accept(new MapParameterInfo("list"), new ImmutableMapImpl().putValue("list", Collections.emptySet())); - //the list container is detected automatically from the type of new value - checker.accept(new MapParameterInfo("list"), null); - } - @Test - public void testFailOnUnpectedContainer() { - ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); - try { - namedParam.addValueAs(new ImmutableMapImpl().putValue("year", "unexpected"), 1); - fail(); - } catch (Exception e) { - //OK - } - } - - @Test - public void testSetEmptyMap() { - ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.MAP); - {//adding empty Map works - ImmutableMap val = namedParam.addValueAs(null, null); - assertNotNull(val); - assertEquals(map().put("year", new ImmutableMapImpl()), val.asMap()); - } - } - - private MapBuilder map() { - return new MapBuilder(); - } - - private Map.Entry entry(String key, Object value) { - return new Map.Entry() { - @Override - public Object setValue(Object value) { - throw new RuntimeException(); - } - - @Override - public Object getValue() { - return value; - } - - @Override - public String getKey() { - return key; - } - }; - } - - class MapBuilder extends LinkedHashMap { - public MapBuilder put(String key, Object value) { - super.put(key, value); - return this; - } - } - - private static Set asSet(Object... objects) { - return new HashSet<>(Arrays.asList(objects)); - } -} - +package spoon.test.template.core; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import org.junit.jupiter.api.Test; +import spoon.pattern.internal.parameter.ListParameterInfo; +import spoon.pattern.internal.parameter.MapParameterInfo; +import spoon.pattern.internal.parameter.ParameterInfo; +import spoon.pattern.internal.parameter.SetParameterInfo; +import spoon.reflect.meta.ContainerKind; +import spoon.support.util.ImmutableMap; +import spoon.support.util.ImmutableMapImpl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.fail; + +public class ParameterInfoTest { + + @Test + public void testParameterNames() { + assertEquals("year", new MapParameterInfo("year").getName()); + assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); + assertEquals("year", new MapParameterInfo(new MapParameterInfo("year")).getName()); + assertEquals("year", new MapParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); + assertEquals("year.age", new MapParameterInfo("age", new MapParameterInfo("year")).getName()); + assertEquals("year.age", new MapParameterInfo("age", new MapParameterInfo("year").setContainerKind(ContainerKind.MAP)).getName()); + + assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)).getName()); + assertEquals("year", new ListParameterInfo(new MapParameterInfo("year")).getName()); + assertEquals("year", new ListParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)).getName()); + assertEquals("year_7_", new ListParameterInfo(7, new MapParameterInfo("year")).getName()); + assertEquals("year_7_", new ListParameterInfo(new ListParameterInfo(7, new MapParameterInfo("year"))).getName()); + assertEquals("year_7__2_", new ListParameterInfo(2, new ListParameterInfo(7, new MapParameterInfo("year"))).getName()); + assertEquals("year_7__2_.age", new MapParameterInfo("age", new ListParameterInfo(2, new ListParameterInfo(7, new MapParameterInfo("year")))).getName()); + + assertEquals("year", ((ParameterInfo) new MapParameterInfo("year").setContainerKind(ContainerKind.SET)).getName()); + assertEquals("year", new SetParameterInfo(new MapParameterInfo("year")).getName()); + assertEquals("year", new SetParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.SET)).getName()); + + } + @Test + public void testSingleValueParameterByNameIntoNullContainer() { + ParameterInfo namedParam = new MapParameterInfo("year"); + {//adding value into null container, creates a new container with that value + ImmutableMap val = namedParam.addValueAs(null, 2018); + assertNotNull(val); + assertEquals(map().put("year", 2018), val.asMap()); + } + } + @Test + public void testSingleValueParameterByNameIntoEmptyContainer() { + ParameterInfo namedParam = new MapParameterInfo("year"); + {//adding value into empty container, creates a new container with that value + ImmutableMap empty = new ImmutableMapImpl(); + ImmutableMap val = namedParam.addValueAs(empty, 2018); + assertNotNull(val); + assertEquals(map().put("year", 2018), val.asMap()); + //empty is still empty + assertEquals(map(), empty.asMap()); + } + } + @Test + public void testSingleValueParameterByNameWhenAlreadyExists() { + ParameterInfo namedParam = new MapParameterInfo("year"); + {//adding value into container, which already contains that value changes nothing and returns origin container + ImmutableMap oldContainer = new ImmutableMapImpl().putValue("year", 2018); + assertEquals(map().put("year", 2018), oldContainer.asMap()); + //it returned the same container + assertSame(oldContainer, namedParam.addValueAs(oldContainer, 2018)); + assertEquals(map().put("year", 2018), oldContainer.asMap()); + } + } + @Test + public void testSingleValueParameterByNameWhenDifferentExists() { + ParameterInfo namedParam = new MapParameterInfo("year"); + {//adding a value into container, which already contains a different value returns null - no match + ImmutableMap oldContainer = new ImmutableMapImpl().putValue("year", 2018); + assertNull(namedParam.addValueAs(oldContainer, 2111)); + assertNull(namedParam.addValueAs(oldContainer, 0)); + assertNull(namedParam.addValueAs(oldContainer, null)); + //old container is never changed + assertEquals(map().put("year", 2018), oldContainer.asMap()); + } + } + @Test + public void testOptionalSingleValueParameterByName() { + ParameterInfo namedParam = new MapParameterInfo("year") + .setMinOccurrences(0); + {//adding null value into an container with minCount == 0, returns unchanged container. + //because minCount == 0 means that value is optional + ImmutableMap container = new ImmutableMapImpl().putValue("a", "b"); + assertSame(container, namedParam.addValueAs(container, null)); + assertEquals(map().put("a", "b"), container.asMap()); + } + } + @Test + public void testMandatorySingleValueParameterByName() { + //adding null value into an container with minCount == 1, returns null -> means NO match, null is not allowed. + //because minCount == 0 means that value is optional + ParameterInfo namedParam = new MapParameterInfo("year") + .setMinOccurrences(1); + { + ImmutableMap container = new ImmutableMapImpl().putValue("a", "b"); + assertNull(namedParam.addValueAs(container, null)); + assertEquals(map().put("a", "b"), container.asMap()); + } + } + @Test + public void testSingleValueParameterByNameConditionalMatcher() { + ParameterInfo namedParam = new MapParameterInfo("year").setMatchCondition(Integer.class, i -> i > 2000); + + //matching value is accepted + ImmutableMap val = namedParam.addValueAs(null, 2018); + assertNotNull(val); + assertEquals(map().put("year", 2018), val.asMap()); + //not matching value is not accepted + assertNull(namedParam.addValueAs(null, 1000)); + assertNull(namedParam.addValueAs(null, "3000")); + //even matching value is STILL not accepted when there is already a different value + assertNull(namedParam.addValueAs(new ImmutableMapImpl().putValue("year", 3000), 2018)); + } + + @Test + public void testListParameterByNameIntoNull() { + ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); + {//adding value into null container, creates a new container with List which contains that value + ImmutableMap val = namedParam.addValueAs(null, 2018); + assertNotNull(val); + assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); + } + } + @Test + public void testListParameterByNameIntoEmptyContainer() { + ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); + {//adding value into empty container, creates a new container with List which contains that value + ImmutableMap empty = new ImmutableMapImpl(); + ImmutableMap val = namedParam.addValueAs(empty, 2018); + assertNotNull(val); + assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); + //empty is still empty + assertEquals(map(), empty.asMap()); + } + } + @Test + public void testListParameterByNameIntoEmptyContainerWithEmptyList() { + Consumer check = (namedParam) -> + {//adding value into container, which already contains a empty list, creates a new container with List which contains that value + ImmutableMap empty = new ImmutableMapImpl().putValue("year", Collections.emptyList()); + + ImmutableMap val = namedParam.addValueAs(empty, 2018); + //adding same value - adds the second value again + ImmutableMap val2 = namedParam.addValueAs(val, 2018); + //adding null value - adds nothing. Same container is returned + assertSame(val2, namedParam.addValueAs(val2, null)); + + //empty is still empty + assertEquals(map().put("year", Collections.emptyList()), empty.asMap()); + assertNotNull(val); + assertEquals(map().put("year", Arrays.asList(2018)), val.asMap()); + assertNotNull(val2); + assertEquals(map().put("year", Arrays.asList(2018, 2018)), val2.asMap()); + }; + //contract: it behaves like this when container kind is defined as LIST + check.accept(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST)); + //contract: it behaves like this even when container kind is not defined, so it is automatically detected from the existing parameter value + check.accept(new MapParameterInfo("year")); + //contract: it behaves like this when ListAccessor + NamedAccessor is used + check.accept(new ListParameterInfo(new MapParameterInfo("year"))); + //contract: it behaves like this when ListAccessor + NamedAccessor with defined container is used with + check.accept(new ListParameterInfo(new MapParameterInfo("year").setContainerKind(ContainerKind.LIST))); + } + + @Test + public void testMergeOnDifferentValueTypeContainers() { + BiConsumer checker = (parameter, params) -> { + //contract: the same value can be always applied when it already exists there independent on container type + assertSame(params, parameter.addValueAs(params, "x")); + //contract: the different value must be never applied independent on container type + assertNull(parameter.addValueAs(params, "y")); + //contract: the different value must be never applied independent on container type + assertNull(parameter.addValueAs(params, null)); + }; + ImmutableMap empty = new ImmutableMapImpl(); + checker.accept(new MapParameterInfo("year"), empty.putValue("year", "x")); + checker.accept(new ListParameterInfo(0, new MapParameterInfo("year")), empty.putValue("year", Collections.singletonList("x"))); + checker.accept(new ListParameterInfo(1, new MapParameterInfo("year")), empty.putValue("year", Arrays.asList("zz","x"))); + checker.accept(new MapParameterInfo("key", new ListParameterInfo(1, new MapParameterInfo("year"))), empty.putValue("year", Arrays.asList("zz",empty.putValue("key", "x")))); + checker.accept(new MapParameterInfo("key", new MapParameterInfo("year")), empty.putValue("year", empty.putValue("key", "x"))); + } + + @Test + public void testAppendIntoList() { + ParameterInfo parameter = new MapParameterInfo("years").setContainerKind(ContainerKind.LIST); + ImmutableMap params = parameter.addValueAs(null, 1000); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(1000)), params.asMap()); + + params = parameter.addValueAs(params, 100); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(1000, 100)), params.asMap()); + + params = parameter.addValueAs(params, "a"); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(1000, 100, "a")), params.asMap()); + + params = parameter.addValueAs(params, "a"); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(1000, 100, "a", "a")), params.asMap()); + } + + @Test + public void testSetIntoList() { + ParameterInfo named = new MapParameterInfo("years"); + ImmutableMap params = new ListParameterInfo(2, named).addValueAs(null, 1000); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(null, null, 1000)), params.asMap()); + + params = new ListParameterInfo(0, named).addValueAs(params, 10); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(10, null, 1000)), params.asMap()); + + params = new ListParameterInfo(3, named).addValueAs(params, 10000); + assertNotNull(params); + assertEquals(map().put("years", Arrays.asList(10, null, 1000, 10000)), params.asMap()); + } + + @Test + public void testAppendIntoSet() { + ParameterInfo parameter = new MapParameterInfo("years").setContainerKind(ContainerKind.SET); + ImmutableMap params = parameter.addValueAs(null, 1000); + assertNotNull(params); + assertEquals(map().put("years", asSet(1000)), params.asMap()); + + params = parameter.addValueAs(params, 100); + assertNotNull(params); + assertEquals(map().put("years", asSet(1000, 100)), params.asMap()); + + params = parameter.addValueAs(params, "a"); + assertNotNull(params); + assertEquals(map().put("years", asSet(1000, 100, "a")), params.asMap()); + + assertSame(params, parameter.addValueAs(params, "a")); + assertNotNull(params); + assertEquals(map().put("years", asSet(1000, 100, "a")), params.asMap()); + } + @Test + public void testMapEntryInParameterByName() { + BiConsumer checker = (namedParam, empty) -> + {//the Map.Entry value is added into property of type Map + //only Map.Entries can be added + assertNull(namedParam.addValueAs(empty, "a value")); + + final ImmutableMap val = namedParam.addValueAs(empty, entry("year", 2018)); + assertNotNull(val); + assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); + + //adding null entry changes nothing + assertSame(val, namedParam.addValueAs(val, null)); + //adding same value changes nothing + assertSame(val, namedParam.addValueAs(val, entry("year", 2018))); + //adding entry value with same key, but different value - no match + assertNull(namedParam.addValueAs(val, entry("year", 1111))); + + ImmutableMap val2 = namedParam.addValueAs(val, entry("age", "best")); + assertNotNull(val2); + assertEquals(map().put("map", new ImmutableMapImpl() + .putValue("year", 2018) + .putValue("age", "best")), val2.asMap()); + + //after all the once returned val is still the same - unmodified + assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); + }; + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl()); + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", null)); + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); + //the map container is detected automatically from the type of value + checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); + //the map container is detected automatically from the type of value + checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", new ImmutableMapImpl())); + } + @Test + public void testAddMapIntoParameterByName() { + BiConsumer checker = (namedParam, empty) -> + {//the Map value is added into property of type Map + ImmutableMap val = namedParam.addValueAs(empty, Collections.emptyMap()); + assertEquals(map().put("map", new ImmutableMapImpl()), val.asMap()); + val = namedParam.addValueAs(empty, map().put("year", 2018)); + assertEquals(map().put("map", new ImmutableMapImpl().putValue("year", 2018)), val.asMap()); + val = namedParam.addValueAs(empty, map().put("year", 2018).put("age", 1111)); + assertEquals(map().put("map", new ImmutableMapImpl() + .putValue("year", 2018) + .putValue("age", 1111)), val.asMap()); + + //adding null entry changes nothing + assertSame(val, namedParam.addValueAs(val, null)); + //adding same value changes nothing + assertSame(val, namedParam.addValueAs(val, entry("year", 2018))); + //adding entry value with same key, but different value - no match + assertNull(namedParam.addValueAs(val, entry("year", 1111))); + }; + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl()); + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", null)); + checker.accept(new MapParameterInfo("map").setContainerKind(ContainerKind.MAP), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); + //the map container is detected automatically from the type of value + checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", Collections.emptyMap())); + //the map container is detected automatically from the type of value + checker.accept(new MapParameterInfo("map"), new ImmutableMapImpl().putValue("map", new ImmutableMapImpl())); + //the map container is detected automatically from the type of new value + checker.accept(new MapParameterInfo("map"), null); + } + + @Test + public void testAddListIntoParameterByName() { + BiConsumer checker = (namedParam, empty) -> + {//the List value is added into property of type List + ImmutableMap val = namedParam.addValueAs(empty, Collections.emptyList()); + assertEquals(map().put("list", Collections.emptyList()), val.asMap()); + val = namedParam.addValueAs(empty, Arrays.asList(2018)); + assertEquals(map().put("list", Arrays.asList(2018)), val.asMap()); + val = namedParam.addValueAs(empty, Arrays.asList(2018, 1111)); + assertEquals(map().put("list", Arrays.asList(2018, 1111)), val.asMap()); + + //adding null entry changes nothing + assertSame(val, namedParam.addValueAs(val, null)); + }; + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl()); + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", null)); + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", Collections.emptyList())); + //Set can be converted to List + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.LIST), new ImmutableMapImpl().putValue("list", Collections.emptySet())); + //the list container is detected automatically from the type of value + checker.accept(new MapParameterInfo("list"), new ImmutableMapImpl().putValue("list", Collections.emptyList())); + //the list container is detected automatically from the type of new value + checker.accept(new MapParameterInfo("list"), null); + } + @Test + public void testAddSetIntoParameterByName() { + BiConsumer checker = (namedParam, empty) -> + {//the Set value is added into property of type Set + ImmutableMap val = namedParam.addValueAs(empty, Collections.emptySet()); + assertEquals(map().put("list", Collections.emptySet()), val.asMap()); + val = namedParam.addValueAs(empty, asSet(2018)); + assertEquals(map().put("list", asSet(2018)), val.asMap()); + val = namedParam.addValueAs(empty, asSet(2018, 1111)); + assertEquals(map().put("list", asSet(2018, 1111)), val.asMap()); + + //adding null entry changes nothing + assertSame(val, namedParam.addValueAs(val, null)); + //adding same entry changes nothing + assertSame(val, namedParam.addValueAs(val, 1111)); + //adding Set with same entry changes nothing + assertSame(val, namedParam.addValueAs(val, asSet(1111))); + //adding Set with same entry changes nothing + assertSame(val, namedParam.addValueAs(val, asSet(2018, 1111))); + }; + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl()); + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", null)); + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", Collections.emptySet())); + //The container kind has higher priority, so List will be converted to Set + checker.accept(new MapParameterInfo("list").setContainerKind(ContainerKind.SET), new ImmutableMapImpl().putValue("list", Collections.emptyList())); + //the list container is detected automatically from the type of value + checker.accept(new MapParameterInfo("list"), new ImmutableMapImpl().putValue("list", Collections.emptySet())); + //the list container is detected automatically from the type of new value + checker.accept(new MapParameterInfo("list"), null); + } + @Test + public void testFailOnUnpectedContainer() { + ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.LIST); + try { + namedParam.addValueAs(new ImmutableMapImpl().putValue("year", "unexpected"), 1); + fail(); + } catch (Exception e) { + //OK + } + } + + @Test + public void testSetEmptyMap() { + ParameterInfo namedParam = new MapParameterInfo("year").setContainerKind(ContainerKind.MAP); + {//adding empty Map works + ImmutableMap val = namedParam.addValueAs(null, null); + assertNotNull(val); + assertEquals(map().put("year", new ImmutableMapImpl()), val.asMap()); + } + } + + private MapBuilder map() { + return new MapBuilder(); + } + + private Map.Entry entry(String key, Object value) { + return new Map.Entry() { + @Override + public Object setValue(Object value) { + throw new RuntimeException(); + } + + @Override + public Object getValue() { + return value; + } + + @Override + public String getKey() { + return key; + } + }; + } + + class MapBuilder extends LinkedHashMap { + public MapBuilder put(String key, Object value) { + super.put(key, value); + return this; + } + } + + private static Set asSet(Object... objects) { + return new HashSet<>(Arrays.asList(objects)); + } +} diff --git a/src/test/java/spoon/test/textBlocks/TextBlockTest.java b/src/test/java/spoon/test/textBlocks/TextBlockTest.java index 87c48c509db..e8dd9f1fb8e 100644 --- a/src/test/java/spoon/test/textBlocks/TextBlockTest.java +++ b/src/test/java/spoon/test/textBlocks/TextBlockTest.java @@ -1,8 +1,5 @@ package spoon.test.textBlocks; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import spoon.Launcher; @@ -18,6 +15,9 @@ import spoon.reflect.path.CtRole; import spoon.testing.utils.LineSeparatorExtension; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** Test for the new Java 15 text block feature with */ public class TextBlockTest{ private Launcher setUpTest() { @@ -39,7 +39,7 @@ public void testTextBlock1(){ Launcher launcher = setUpTest(); CtClass allstmt = (CtClass) launcher.getFactory().Type().get("textBlock.TextBlockTestClass"); CtMethod m1 = allstmt.getMethod("m1"); - + CtStatement stmt1 = m1.getBody().getStatement(0); assertTrue(stmt1.getValueByRole(CtRole.ASSIGNMENT) instanceof CtTextBlock); CtTextBlock l1 = (CtTextBlock) stmt1.getValueByRole(CtRole.ASSIGNMENT); @@ -52,7 +52,7 @@ public void testTextBlockqoute(){ Launcher launcher = setUpTest(); CtClass allstmt = (CtClass) launcher.getFactory().Type().get("textBlock.TextBlockTestClass"); CtMethod m2 = allstmt.getMethod("m2"); - + CtStatement stmt2 = m2.getBody().getStatement(0); assertTrue(stmt2.getValueByRole(CtRole.ASSIGNMENT) instanceof CtTextBlock); CtTextBlock l2 = (CtTextBlock) stmt2.getValueByRole(CtRole.ASSIGNMENT); @@ -68,7 +68,7 @@ public void testTextBlockQouteWithinQoute(){ Launcher launcher = setUpTest(); CtClass allstmt = (CtClass) launcher.getFactory().Type().get("textBlock.TextBlockTestClass"); CtMethod m3 = allstmt.getMethod("m3"); - + CtTry stmt4 = (CtTry) m3.getBody().getStatement(1); CtStatement stmt5 = stmt4.getBody().getStatement(0); CtInvocation inv = (CtInvocation) stmt5.getDirectChildren().get(1); @@ -89,7 +89,7 @@ public void testTextBlockEmpty(){ Launcher launcher = setUpTest(); CtClass allstmt = (CtClass) launcher.getFactory().Type().get("textBlock.TextBlockTestClass"); CtMethod m4 = allstmt.getMethod("m4"); - + CtStatement stmt1 = m4.getBody().getStatement(0); assertTrue(stmt1.getValueByRole(CtRole.ASSIGNMENT) instanceof CtTextBlock); CtTextBlock l1 = (CtTextBlock) stmt1.getValueByRole(CtRole.ASSIGNMENT); @@ -126,7 +126,7 @@ public void testTextBlockEscapes(){ //contract: text-blocks should retain escape sequences in code Launcher launcher = setUpTest(); launcher.getEnvironment().setAutoImports(true); - + CtClass allstmt = (CtClass) launcher.getFactory().Type().get("textBlock.TextBlockTestClass"); CtMethod m5 = allstmt.getMethod("m5"); diff --git a/src/test/java/spoon/test/trycatch/TryCatchTest.java b/src/test/java/spoon/test/trycatch/TryCatchTest.java index 4af8aac9317..335a0593ceb 100644 --- a/src/test/java/spoon/test/trycatch/TryCatchTest.java +++ b/src/test/java/spoon/test/trycatch/TryCatchTest.java @@ -24,7 +24,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -44,7 +43,6 @@ import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtParameter; -import spoon.reflect.declaration.CtVariable; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtCatchVariableReference; @@ -58,9 +56,8 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.test.trycatch.testclasses.Foo; import spoon.test.trycatch.testclasses.Main; -import spoon.testing.utils.ModelTest; import spoon.testing.utils.LineSeparatorExtension; - +import spoon.testing.utils.ModelTest; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/spoon/test/type/TypeTest.java b/src/test/java/spoon/test/type/TypeTest.java index 4a4a146deb8..b7403d8fcf3 100644 --- a/src/test/java/spoon/test/type/TypeTest.java +++ b/src/test/java/spoon/test/type/TypeTest.java @@ -24,7 +24,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.reflect.CtModel; diff --git a/src/test/java/spoon/test/variable/AccessFullyQualifiedFieldTest.java b/src/test/java/spoon/test/variable/AccessFullyQualifiedFieldTest.java index 88525fa8658..d56de2a1ac9 100644 --- a/src/test/java/spoon/test/variable/AccessFullyQualifiedFieldTest.java +++ b/src/test/java/spoon/test/variable/AccessFullyQualifiedFieldTest.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.ContractVerifier; import spoon.Launcher; diff --git a/src/test/java/spoon/test/variable/AccessTest.java b/src/test/java/spoon/test/variable/AccessTest.java index c97a1820482..e9d8c3b51cd 100644 --- a/src/test/java/spoon/test/variable/AccessTest.java +++ b/src/test/java/spoon/test/variable/AccessTest.java @@ -18,7 +18,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.ContractVerifier; import spoon.Launcher; @@ -60,34 +59,34 @@ public void testCanVisitVariableAccessAndSubClasses() throws Exception { final List> variablesRead = Query.getElements(factory, - new AbstractFilter>(CtVariableRead.class) { - @Override - public boolean matches(CtVariableRead element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtVariableRead.class) { + @Override + public boolean matches(CtVariableRead element) { + return super.matches(element); + } + }); assertEquals(2, variablesRead.size());// System.out and s final List> variablesWrite = Query.getElements(factory, - new AbstractFilter>(CtVariableWrite.class) { - @Override - public boolean matches(CtVariableWrite element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtVariableWrite.class) { + @Override + public boolean matches(CtVariableWrite element) { + return super.matches(element); + } + }); assertEquals(1, variablesWrite.size()); final List> variablesAccess = Query.getElements(factory, - new AbstractFilter>(CtVariableAccess.class) { - @Override - public boolean matches(CtVariableAccess element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtVariableAccess.class) { + @Override + public boolean matches(CtVariableAccess element) { + return super.matches(element); + } + }); assertEquals(3, variablesAccess.size()); } @@ -98,34 +97,34 @@ public void testCanVisitFieldAccessAndSubClasses() throws Exception { final List> fieldsRead = Query.getElements(factory, - new AbstractFilter>(CtFieldRead.class) { - @Override - public boolean matches(CtFieldRead element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtFieldRead.class) { + @Override + public boolean matches(CtFieldRead element) { + return super.matches(element); + } + }); assertEquals(2, fieldsRead.size()); final List> fieldsWrite = Query.getElements(factory, - new AbstractFilter>(CtFieldWrite.class) { - @Override - public boolean matches(CtFieldWrite element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtFieldWrite.class) { + @Override + public boolean matches(CtFieldWrite element) { + return super.matches(element); + } + }); assertEquals(3, fieldsWrite.size()); final List> fieldsAccess = Query.getElements(factory, - new AbstractFilter>(CtFieldAccess.class) { - @Override - public boolean matches(CtFieldAccess element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtFieldAccess.class) { + @Override + public boolean matches(CtFieldAccess element) { + return super.matches(element); + } + }); assertEquals(5, fieldsAccess.size()); } @@ -136,36 +135,36 @@ public void testCanVisitArrayAccessAndSubClasses() throws Exception { final List> arraysRead = Query.getElements(factory, - new AbstractFilter>(CtArrayRead.class) { - @Override - public boolean matches(CtArrayRead element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtArrayRead.class) { + @Override + public boolean matches(CtArrayRead element) { + return super.matches(element); + } + }); assertEquals(2, arraysRead.size()); final List> arraysWrite = Query.getElements(factory, - new AbstractFilter>(CtArrayWrite.class) { - @Override - public boolean matches(CtArrayWrite element) { - return super.matches(element); - } - }); + new AbstractFilter>(CtArrayWrite.class) { + @Override + public boolean matches(CtArrayWrite element) { + return super.matches(element); + } + }); assertEquals(1, arraysWrite.size()); final List>> arraysAccess = Query.getElements(factory, - new AbstractFilter>>( - CtArrayAccess.class) { - @Override - public boolean matches( - CtArrayAccess> element) { - return super.matches(element); - } - }); + new AbstractFilter>>( + CtArrayAccess.class) { + @Override + public boolean matches( + CtArrayAccess> element) { + return super.matches(element); + } + }); assertEquals(3, arraysAccess.size()); } diff --git a/src/test/java/spoon/test/variable/VariableTest.java b/src/test/java/spoon/test/variable/VariableTest.java index 5875c79de9e..a20a5d94152 100644 --- a/src/test/java/spoon/test/variable/VariableTest.java +++ b/src/test/java/spoon/test/variable/VariableTest.java @@ -17,6 +17,10 @@ package spoon.test.variable; import com.google.common.io.Files; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledForJreRange; @@ -40,166 +44,160 @@ import spoon.support.sniper.SniperJavaPrettyPrinter; import spoon.testing.utils.ModelTest; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.List; -import java.util.Objects; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.assertions.SpoonAssertions.assertThat; public class VariableTest { - @Test - public void testSetType() { - // contract: one can use setType without having a very hard generics type checking error - - // to get this done, we use the refactoring below - CtClass c = Launcher.parseClass("class C{ void f() {Object i=null; }}"); - List localVariables = c.getElements(new TypeFilter<>(CtLocalVariable.class)); - - // before: "CtLocalVariable lv" could not typecheck, with a hard generics error - // now it works; we can use both "CtLocalVariable lv" and "CtLocalVariable lv" - // it's source level backward compatible for Spoon itself - CtLocalVariable lv = localVariables.get(0); - lv.setType(c.getFactory().Type().createReference(Object.class)); - - CtLocalVariable lv2 = localVariables.get(0); - lv2.setType(c.getFactory().Type().createReference(Object.class)); - - } - - public void refactorFortestSetType() { - // rectoring all setType(CtTypeParameter) -> setType(CtTypeParameter) - // this is the refactoring done for this pull-request - Launcher l = new Launcher(); - l.addInputResource("src/main/java"); - l.setSourceOutputDirectory("src/main/java"); - l.getEnvironment().setPrettyPrinterCreator(() -> { - return new SniperJavaPrettyPrinter(l.getEnvironment()); - } - ); - l.addProcessor(new AbstractProcessor>() { - @Override - public boolean isToBeProcessed(CtMethod candidate) { - if (!candidate.getSimpleName().equals("setType")) return false; - if (candidate.getParameters().size()!=1) return false; - final CtParameter ctParameter = candidate.getParameters().get(0); - if (!ctParameter.getType().getSimpleName().equals("CtTypeReference")) return false; - if (ctParameter.getType().getActualTypeArguments().size()!=1) return false; - return true; - } - - @Override - public void process(CtMethod element) { - final CtParameter ctParameter = element.getParameters().get(0); - ctParameter.getType().removeActualTypeArgument(ctParameter.getType().getActualTypeArguments().get(0)); - } - }); - l.run(); - - } - - - - @Test - public void testJointDeclVariables() { - // contract: we can get the information of the jointly declared local variables - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(10); - launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); - - CtModel model = launcher.buildModel(); - List localVariables = model.getElements(new TypeFilter<>(CtLocalVariable.class)); - for (int i=0; i <= 7; i++) { - assertEquals(false, localVariables.get(i).isPartOfJointDeclaration()); - } - assertEquals(true, localVariables.get(8).isPartOfJointDeclaration()); - assertEquals(true, localVariables.get(9).isPartOfJointDeclaration()); - - } - - @Test - @DisabledForJreRange(max = JRE.JAVA_9) - public void testInferredVariableAreMarked() { - // contract: if a variable is declared with 'var' keyword, it must be marked as inferred in the model - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(10); - launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); - - CtModel model = launcher.buildModel(); - List localVariables = model.getElements(new TypeFilter<>(CtLocalVariable.class)); - assertEquals(10, localVariables.size()); - - TypeFactory typeFactory = launcher.getFactory().Type(); - - assertTrue(localVariables.get(0).isInferred()); - assertEquals(typeFactory.stringType(), localVariables.get(0).getType()); - - assertFalse(localVariables.get(1).isInferred()); - assertEquals(typeFactory.stringType(), localVariables.get(1).getType()); - - assertTrue(localVariables.get(2).isInferred()); - assertEquals("java.io.FileReader", localVariables.get(2).getType().getQualifiedName()); - - assertFalse(localVariables.get(3).isInferred()); - assertEquals("java.io.FileReader", localVariables.get(3).getType().getQualifiedName()); - - assertTrue(localVariables.get(4).isInferred()); - assertEquals(typeFactory.booleanPrimitiveType(), localVariables.get(4).getType()); - - assertFalse(localVariables.get(5).isInferred()); - assertEquals(typeFactory.booleanPrimitiveType(), localVariables.get(5).getType()); - - assertTrue(localVariables.get(6).isInferred()); - assertEquals(typeFactory.integerPrimitiveType(), localVariables.get(6).getType()); - - assertFalse(localVariables.get(7).isInferred()); - assertEquals(typeFactory.integerPrimitiveType(), localVariables.get(7).getType()); - } - - @Test - @DisabledForJreRange(max = JRE.JAVA_9) - public void testInferredVariableArePrintedWithVar(@TempDir File outputDir) throws IOException { - // contract: if a variable is marked as inferred in the model, it must be pretty-printed with a 'var' keyword - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(10); - launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); - - launcher.setSourceOutputDirectory(outputDir); - - launcher.run(); - - File outputFile = new File(outputDir, "fr/inria/sandbox/Main.java"); - assertTrue(outputFile.exists()); - - String fileContent = StringUtils.join(Files.readLines(outputFile, Charset.defaultCharset())); - - assertTrue(fileContent.contains("var mySubstring = \"bla\";")); - assertTrue(fileContent.contains("var myFile = new java.io.FileReader(new java.io.File(\"/tmp/myfile\")")); - assertTrue(fileContent.contains("var myboolean = true;")); - assertTrue(fileContent.contains("for (var i = 0;")); - } - - @Test - @DisabledForJreRange(max = JRE.JAVA_10) - public void testVarInLambda() { - // contract: we should handle local variable syntax for lambda parameters properly (since Java 11) - // example: (var x, var y) -> x + y; - Launcher launcher = new Launcher(); - launcher.getEnvironment().setComplianceLevel(11); - launcher.addInputResource("./src/test/resources/spoon/test/var/VarInLambda.java"); - CtModel model = launcher.buildModel(); - - CtLambda lambda = model.getElements(new TypeFilter<>(CtLambda.class)).get(0); - assertTrue(lambda.getParameters().get(0).isInferred()); - assertTrue(lambda.getParameters().get(1).isInferred()); - assertEquals("java.lang.Integer", lambda.getParameters().get(0).getType().getQualifiedName()); - assertEquals("java.lang.Long", lambda.getParameters().get(1).getType().getQualifiedName()); - assertEquals("(var x,var y) -> x + y", lambda.toString()); // we should print var, if it was in the original code - } + @Test + public void testSetType() { + // contract: one can use setType without having a very hard generics type checking error + + // to get this done, we use the refactoring below + CtClass c = Launcher.parseClass("class C{ void f() {Object i=null; }}"); + List localVariables = c.getElements(new TypeFilter<>(CtLocalVariable.class)); + + // before: "CtLocalVariable lv" could not typecheck, with a hard generics error + // now it works; we can use both "CtLocalVariable lv" and "CtLocalVariable lv" + // it's source level backward compatible for Spoon itself + CtLocalVariable lv = localVariables.get(0); + lv.setType(c.getFactory().Type().createReference(Object.class)); + + CtLocalVariable lv2 = localVariables.get(0); + lv2.setType(c.getFactory().Type().createReference(Object.class)); + + } + + public void refactorFortestSetType() { + // rectoring all setType(CtTypeParameter) -> setType(CtTypeParameter) + // this is the refactoring done for this pull-request + Launcher l = new Launcher(); + l.addInputResource("src/main/java"); + l.setSourceOutputDirectory("src/main/java"); + l.getEnvironment().setPrettyPrinterCreator(() -> { + return new SniperJavaPrettyPrinter(l.getEnvironment()); + } + ); + l.addProcessor(new AbstractProcessor>() { + @Override + public boolean isToBeProcessed(CtMethod candidate) { + if (!candidate.getSimpleName().equals("setType")) return false; + if (candidate.getParameters().size()!=1) return false; + final CtParameter ctParameter = candidate.getParameters().get(0); + if (!ctParameter.getType().getSimpleName().equals("CtTypeReference")) return false; + if (ctParameter.getType().getActualTypeArguments().size()!=1) return false; + return true; + } + + @Override + public void process(CtMethod element) { + final CtParameter ctParameter = element.getParameters().get(0); + ctParameter.getType().removeActualTypeArgument(ctParameter.getType().getActualTypeArguments().get(0)); + } + }); + l.run(); + + } + + + + @Test + public void testJointDeclVariables() { + // contract: we can get the information of the jointly declared local variables + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(10); + launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); + + CtModel model = launcher.buildModel(); + List localVariables = model.getElements(new TypeFilter<>(CtLocalVariable.class)); + for (int i=0; i <= 7; i++) { + assertEquals(false, localVariables.get(i).isPartOfJointDeclaration()); + } + assertEquals(true, localVariables.get(8).isPartOfJointDeclaration()); + assertEquals(true, localVariables.get(9).isPartOfJointDeclaration()); + + } + + @Test + @DisabledForJreRange(max = JRE.JAVA_9) + public void testInferredVariableAreMarked() { + // contract: if a variable is declared with 'var' keyword, it must be marked as inferred in the model + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(10); + launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); + + CtModel model = launcher.buildModel(); + List localVariables = model.getElements(new TypeFilter<>(CtLocalVariable.class)); + assertEquals(10, localVariables.size()); + + TypeFactory typeFactory = launcher.getFactory().Type(); + + assertTrue(localVariables.get(0).isInferred()); + assertEquals(typeFactory.stringType(), localVariables.get(0).getType()); + + assertFalse(localVariables.get(1).isInferred()); + assertEquals(typeFactory.stringType(), localVariables.get(1).getType()); + + assertTrue(localVariables.get(2).isInferred()); + assertEquals("java.io.FileReader", localVariables.get(2).getType().getQualifiedName()); + + assertFalse(localVariables.get(3).isInferred()); + assertEquals("java.io.FileReader", localVariables.get(3).getType().getQualifiedName()); + + assertTrue(localVariables.get(4).isInferred()); + assertEquals(typeFactory.booleanPrimitiveType(), localVariables.get(4).getType()); + + assertFalse(localVariables.get(5).isInferred()); + assertEquals(typeFactory.booleanPrimitiveType(), localVariables.get(5).getType()); + + assertTrue(localVariables.get(6).isInferred()); + assertEquals(typeFactory.integerPrimitiveType(), localVariables.get(6).getType()); + + assertFalse(localVariables.get(7).isInferred()); + assertEquals(typeFactory.integerPrimitiveType(), localVariables.get(7).getType()); + } + + @Test + @DisabledForJreRange(max = JRE.JAVA_9) + public void testInferredVariableArePrintedWithVar(@TempDir File outputDir) throws IOException { + // contract: if a variable is marked as inferred in the model, it must be pretty-printed with a 'var' keyword + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(10); + launcher.addInputResource("./src/test/resources/spoon/test/var/Main.java"); + + launcher.setSourceOutputDirectory(outputDir); + + launcher.run(); + + File outputFile = new File(outputDir, "fr/inria/sandbox/Main.java"); + assertTrue(outputFile.exists()); + + String fileContent = StringUtils.join(Files.readLines(outputFile, Charset.defaultCharset())); + + assertTrue(fileContent.contains("var mySubstring = \"bla\";")); + assertTrue(fileContent.contains("var myFile = new java.io.FileReader(new java.io.File(\"/tmp/myfile\")")); + assertTrue(fileContent.contains("var myboolean = true;")); + assertTrue(fileContent.contains("for (var i = 0;")); + } + + @Test + @DisabledForJreRange(max = JRE.JAVA_10) + public void testVarInLambda() { + // contract: we should handle local variable syntax for lambda parameters properly (since Java 11) + // example: (var x, var y) -> x + y; + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(11); + launcher.addInputResource("./src/test/resources/spoon/test/var/VarInLambda.java"); + CtModel model = launcher.buildModel(); + + CtLambda lambda = model.getElements(new TypeFilter<>(CtLambda.class)).get(0); + assertTrue(lambda.getParameters().get(0).isInferred()); + assertTrue(lambda.getParameters().get(1).isInferred()); + assertEquals("java.lang.Integer", lambda.getParameters().get(0).getType().getQualifiedName()); + assertEquals("java.lang.Long", lambda.getParameters().get(1).getType().getQualifiedName()); + assertEquals("(var x,var y) -> x + y", lambda.toString()); // we should print var, if it was in the original code + } @ModelTest(value = "./src/test/resources/spoon/test/unnamed/UnnamedVar.java", complianceLevel = 22) void testUnnamedVariable(Factory factory) throws IOException { diff --git a/src/test/java/spoon/test/visibility/VisibilityTest.java b/src/test/java/spoon/test/visibility/VisibilityTest.java index 6c7593dd139..deda1c3cd88 100644 --- a/src/test/java/spoon/test/visibility/VisibilityTest.java +++ b/src/test/java/spoon/test/visibility/VisibilityTest.java @@ -19,7 +19,6 @@ import java.io.File; import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.OutputType; diff --git a/src/test/java/spoon/test/visitor/AssignmentsEqualsTest.java b/src/test/java/spoon/test/visitor/AssignmentsEqualsTest.java index 2791982995a..d5f84921d4d 100644 --- a/src/test/java/spoon/test/visitor/AssignmentsEqualsTest.java +++ b/src/test/java/spoon/test/visitor/AssignmentsEqualsTest.java @@ -1,9 +1,6 @@ package spoon.test.visitor; import java.util.List; - -import org.junit.jupiter.api.Test; -import spoon.Launcher; import spoon.reflect.code.CtAssignment; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.Query; diff --git a/src/test/java/spoon/test/visitor/VisitorTest.java b/src/test/java/spoon/test/visitor/VisitorTest.java index acbe2198181..8876852a5ec 100644 --- a/src/test/java/spoon/test/visitor/VisitorTest.java +++ b/src/test/java/spoon/test/visitor/VisitorTest.java @@ -1,7 +1,5 @@ package spoon.test.visitor; -import org.junit.jupiter.api.Test; -import spoon.Launcher; import spoon.reflect.code.CtIf; import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; diff --git a/src/test/java/spoon/testing/CtPackageAssertTest.java b/src/test/java/spoon/testing/CtPackageAssertTest.java index a11df82f62d..f8431faeaad 100644 --- a/src/test/java/spoon/testing/CtPackageAssertTest.java +++ b/src/test/java/spoon/testing/CtPackageAssertTest.java @@ -16,8 +16,9 @@ */ package spoon.testing; +import java.io.File; +import java.util.List; import org.junit.jupiter.api.Test; - import spoon.SpoonException; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtPackage; @@ -26,9 +27,6 @@ import spoon.reflect.factory.Factory; import spoon.reflect.visitor.filter.TypeFilter; -import java.io.File; -import java.util.List; - import static org.junit.jupiter.api.Assertions.*; import static spoon.testing.Assert.assertThat; import static spoon.testing.utils.ModelUtils.build; diff --git a/src/test/java/spoon/testing/assertions/codegen/AssertJCodegen.java b/src/test/java/spoon/testing/assertions/codegen/AssertJCodegen.java index 9c64d68c348..fbf5c039aeb 100644 --- a/src/test/java/spoon/testing/assertions/codegen/AssertJCodegen.java +++ b/src/test/java/spoon/testing/assertions/codegen/AssertJCodegen.java @@ -1,5 +1,18 @@ package spoon.testing.assertions.codegen; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; import org.assertj.core.api.AbstractBooleanAssert; import org.assertj.core.api.AbstractByteAssert; import org.assertj.core.api.AbstractCharacterAssert; @@ -46,20 +59,6 @@ import spoon.reflect.visitor.CtScanner; import spoon.testing.assertions.SpoonAssert; -import java.io.IOException; -import java.lang.annotation.Annotation; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.Collectors; - public class AssertJCodegen { private static final String GEN_ROOT = "src/test/java/"; diff --git a/src/test/java/spoon/testing/matchers/ContentEqualsMatcher.java b/src/test/java/spoon/testing/matchers/ContentEqualsMatcher.java index 549fb45799e..5fe04613ef0 100644 --- a/src/test/java/spoon/testing/matchers/ContentEqualsMatcher.java +++ b/src/test/java/spoon/testing/matchers/ContentEqualsMatcher.java @@ -1,10 +1,9 @@ package spoon.testing.matchers; -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; - import java.util.Collection; import java.util.HashSet; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; /** * A matcher that compares the contents of two collections. diff --git a/src/test/java/spoon/testing/matchers/RegexFindMatcher.java b/src/test/java/spoon/testing/matchers/RegexFindMatcher.java index f15b6060e1b..0d7fab105fc 100644 --- a/src/test/java/spoon/testing/matchers/RegexFindMatcher.java +++ b/src/test/java/spoon/testing/matchers/RegexFindMatcher.java @@ -1,10 +1,9 @@ package spoon.testing.matchers; +import java.util.regex.Pattern; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; -import java.util.regex.Pattern; - /** * A matcher that checks for a regex pattern in a string. */ diff --git a/src/test/java/spoon/testing/processors/FooToBarProcessor.java b/src/test/java/spoon/testing/processors/FooToBarProcessor.java index ef821f4ff61..9ef85aaf41b 100644 --- a/src/test/java/spoon/testing/processors/FooToBarProcessor.java +++ b/src/test/java/spoon/testing/processors/FooToBarProcessor.java @@ -32,4 +32,4 @@ public boolean isToBeProcessed(CtClass candidate) { public void process(CtClass element) { element.setSimpleName("Bar"); } -} \ No newline at end of file +} diff --git a/src/test/java/spoon/testing/utils/CheckTest.java b/src/test/java/spoon/testing/utils/CheckTest.java index ed21ddd4959..dcab13037eb 100644 --- a/src/test/java/spoon/testing/utils/CheckTest.java +++ b/src/test/java/spoon/testing/utils/CheckTest.java @@ -1,124 +1,122 @@ package spoon.testing.utils; +import java.io.File; +import java.io.IOException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; - import spoon.Launcher; import spoon.reflect.declaration.CtField; import spoon.support.reflect.declaration.CtEnumValueImpl; import spoon.support.reflect.declaration.CtFieldImpl; -import java.io.File; -import java.io.IOException; - import static org.junit.jupiter.api.Assertions.*; class CheckTest { - @Test - public void testAssertNotNull() { - // contract: assertNotNull throws AssertionError as we pass a null reference, with a default - // error message + @Test + public void testAssertNotNull() { + // contract: assertNotNull throws AssertionError as we pass a null reference, with a default + // error message + + String expectedMessage = "Your parameter can't be null."; + + AssertionError error = assertThrows(AssertionError.class, () -> { + Check.assertNotNull(null); + }); - String expectedMessage = "Your parameter can't be null."; - - AssertionError error = assertThrows(AssertionError.class, () -> { - Check.assertNotNull(null); - }); - - assertEquals(expectedMessage, error.getMessage()); - } + assertEquals(expectedMessage, error.getMessage()); + } - @Test - public void testAssertNotNullWithMessageParameter() { - // contract: assertNotNull throws AssertionError as we pass a null reference, with an - // error message that was passed as an argument + @Test + public void testAssertNotNullWithMessageParameter() { + // contract: assertNotNull throws AssertionError as we pass a null reference, with an + // error message that was passed as an argument - String messageParameter = "testMessage"; + String messageParameter = "testMessage"; - AssertionError error = assertThrows(AssertionError.class, () -> { - Check.assertNotNull(messageParameter,null); - }); + AssertionError error = assertThrows(AssertionError.class, () -> { + Check.assertNotNull(messageParameter,null); + }); - assertEquals(messageParameter, error.getMessage()); - } + assertEquals(messageParameter, error.getMessage()); + } - @Test - public void testAssertNotNullWithNotNullReference() { - // contract: assertNotNull returns the reference passed without any changes as the reference - // passed was not null + @Test + public void testAssertNotNullWithNotNullReference() { + // contract: assertNotNull returns the reference passed without any changes as the reference + // passed was not null - int i = 0; + int i = 0; - int j = Check.assertNotNull(i); + int j = Check.assertNotNull(i); - assertEquals(i, j); - } + assertEquals(i, j); + } - @Test - public void testAssertExistWithoutAnExistingFile(@TempDir File tempDir) { - // contract: assertExists throws AssertionError as a non existing file is passed + @Test + public void testAssertExistWithoutAnExistingFile(@TempDir File tempDir) { + // contract: assertExists throws AssertionError as a non existing file is passed - File file = getFileWithTestFilePathName(tempDir); - String expectedMessage = "You should specify an existing file."; + File file = getFileWithTestFilePathName(tempDir); + String expectedMessage = "You should specify an existing file."; - AssertionError error = assertThrows(AssertionError.class, () -> { - Check.assertExists(file); - }); + AssertionError error = assertThrows(AssertionError.class, () -> { + Check.assertExists(file); + }); - assertEquals(expectedMessage, error.getMessage()); - } + assertEquals(expectedMessage, error.getMessage()); + } - @Test - public void testAssertExistWithExistingFile(@TempDir File tempDir) throws IOException { - // contract: assertExists the passed file exists, and as it exists it returns the passed file back + @Test + public void testAssertExistWithExistingFile(@TempDir File tempDir) throws IOException { + // contract: assertExists the passed file exists, and as it exists it returns the passed file back - File file = getFileWithTestFilePathName(tempDir); - file.createNewFile(); + File file = getFileWithTestFilePathName(tempDir); + file.createNewFile(); - File returnedFile = Check.assertExists(file); + File returnedFile = Check.assertExists(file); - assertEquals(file, returnedFile); - } + assertEquals(file, returnedFile); + } - @Test - public void testAssertIsSameWithSameElementsIsTrue() { - // contract: assertIsSame returns the assumedActualElement without any changes as the assumedExpectedElement - // and the assumedActualElement were objects of the same class + @Test + public void testAssertIsSameWithSameElementsIsTrue() { + // contract: assertIsSame returns the assumedActualElement without any changes as the assumedExpectedElement + // and the assumedActualElement were objects of the same class - CtEnumValueImpl assumedExpectedElement = new CtEnumValueImpl(); - CtField assumedActualElement = new CtEnumValueImpl(); + CtEnumValueImpl assumedExpectedElement = new CtEnumValueImpl(); + CtField assumedActualElement = new CtEnumValueImpl(); - CtField returnedActualElement = Check.assertIsSame(assumedActualElement, assumedExpectedElement); + CtField returnedActualElement = Check.assertIsSame(assumedActualElement, assumedExpectedElement); - assertEquals(assumedActualElement, returnedActualElement); - } + assertEquals(assumedActualElement, returnedActualElement); + } - @Test - public void testAssertIsSameWithDissimilarElements() { - // contract: assertIsSame throws AssertionError as the assumedExpectedElement and the assumeActualElement - // were not objects of the same class + @Test + public void testAssertIsSameWithDissimilarElements() { + // contract: assertIsSame throws AssertionError as the assumedExpectedElement and the assumeActualElement + // were not objects of the same class - // arrange - CtEnumValueImpl assumedExpectedElement = new CtEnumValueImpl(); - CtField assumedActualElement = new CtFieldImpl(); - String expectedMessage = String.format( - "Actual value is typed by %1$s and expected is typed by %2$s, these objects should be the same type.", - assumedActualElement.getClass().getName(), assumedExpectedElement.getClass().getName() - ); + // arrange + CtEnumValueImpl assumedExpectedElement = new CtEnumValueImpl(); + CtField assumedActualElement = new CtFieldImpl(); + String expectedMessage = String.format( + "Actual value is typed by %1$s and expected is typed by %2$s, these objects should be the same type.", + assumedActualElement.getClass().getName(), assumedExpectedElement.getClass().getName() + ); - // act - AssertionError error = assertThrows(AssertionError.class, () -> { - Check.assertIsSame(assumedActualElement, assumedExpectedElement); - }); + // act + AssertionError error = assertThrows(AssertionError.class, () -> { + Check.assertIsSame(assumedActualElement, assumedExpectedElement); + }); - // assert - assertEquals(expectedMessage, error.getMessage()); - } + // assert + assertEquals(expectedMessage, error.getMessage()); + } - private static File getFileWithTestFilePathName(File tempDir) { - Launcher launcher = new Launcher(); - launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); - return new File (launcher.getModelBuilder().getSourceOutputDirectory() + "testFile.txt"); - } -} \ No newline at end of file + private static File getFileWithTestFilePathName(File tempDir) { + Launcher launcher = new Launcher(); + launcher.setSourceOutputDirectory(tempDir.getAbsolutePath()); + return new File (launcher.getModelBuilder().getSourceOutputDirectory() + "testFile.txt"); + } +} diff --git a/src/test/java/spoon/testing/utils/GitHubIssue.java b/src/test/java/spoon/testing/utils/GitHubIssue.java index da991e1fe0d..f961734c05e 100644 --- a/src/test/java/spoon/testing/utils/GitHubIssue.java +++ b/src/test/java/spoon/testing/utils/GitHubIssue.java @@ -7,7 +7,6 @@ */ package spoon.testing.utils; -import static org.junit.jupiter.api.Assertions.fail; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -19,6 +18,8 @@ import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.TestExecutionExceptionHandler; +import static org.junit.jupiter.api.Assertions.fail; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @@ -46,7 +47,7 @@ int issueNumber(); /* - * Signals if the issue is fixed. If the issue is marked as not fixed a failing testcase is a success. + * Signals if the issue is fixed. If the issue is marked as not fixed a failing testcase is a success. */ boolean fixed(); diff --git a/src/test/java/spoon/testing/utils/ModelTest.java b/src/test/java/spoon/testing/utils/ModelTest.java index cd36a81399f..25d63eef793 100644 --- a/src/test/java/spoon/testing/utils/ModelTest.java +++ b/src/test/java/spoon/testing/utils/ModelTest.java @@ -1,12 +1,11 @@ package spoon.testing.utils; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; /** * This meta-annotation marks test cases which should have a spoon model built for them. diff --git a/src/test/java/spoon/testing/utils/ModelTestParameterResolver.java b/src/test/java/spoon/testing/utils/ModelTestParameterResolver.java index 14bef313524..20d92adf02c 100644 --- a/src/test/java/spoon/testing/utils/ModelTestParameterResolver.java +++ b/src/test/java/spoon/testing/utils/ModelTestParameterResolver.java @@ -1,5 +1,6 @@ package spoon.testing.utils; +import java.lang.reflect.Executable; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; @@ -11,8 +12,6 @@ import spoon.reflect.factory.Factory; import spoon.reflect.visitor.ModelConsistencyCheckerTestHelper; -import java.lang.reflect.Executable; - public class ModelTestParameterResolver implements ParameterResolver { private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create("spoon", "modeltest"); diff --git a/src/test/java/spoon/toStringBugTest/ToStringBugTest.java b/src/test/java/spoon/toStringBugTest/ToStringBugTest.java index c3b0dbfc102..6f291958753 100644 --- a/src/test/java/spoon/toStringBugTest/ToStringBugTest.java +++ b/src/test/java/spoon/toStringBugTest/ToStringBugTest.java @@ -2,7 +2,6 @@ import java.util.List; - import org.junit.jupiter.api.Test; import spoon.Launcher; import spoon.SpoonException; @@ -11,32 +10,32 @@ import static org.junit.jupiter.api.Assertions.fail; public class ToStringBugTest { - - @Test - public void testIssue3382() { - // contract: the cleanComment should not crash - final Launcher launcher = new Launcher(); - launcher.getEnvironment().setNoClasspath(true); - // folder with both classes - launcher.addInputResource("./src/test/resources/toStringBugTest"); - launcher.buildModel(); - List> all = launcher.getFactory().Class().getAll(); - // first class of resources - CtType ctType0 = all.get(0); - try { - String s = ctType0.toString(); - } catch (SpoonException e) { - // spoon.SpoonException: Unexpected next line after last line - fail(e.toString()); - } + @Test + public void testIssue3382() { + // contract: the cleanComment should not crash + final Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + // folder with both classes + launcher.addInputResource("./src/test/resources/toStringBugTest"); + launcher.buildModel(); + List> all = launcher.getFactory().Class().getAll(); + + // first class of resources + CtType ctType0 = all.get(0); + try { + String s = ctType0.toString(); + } catch (SpoonException e) { + // spoon.SpoonException: Unexpected next line after last line + fail(e.toString()); + } - // second class of resources - CtType ctType1 = all.get(1); - try { - String s = ctType1.toString(); - } catch (SpoonException e) { - fail(e.toString()); - } - } + // second class of resources + CtType ctType1 = all.get(1); + try { + String s = ctType1.toString(); + } catch (SpoonException e) { + fail(e.toString()); + } + } }