From df1a62370cf555a9f1dba4f1cb70ea03455a0774 Mon Sep 17 00:00:00 2001 From: I-Al-Istannen Date: Sun, 12 Jun 2022 13:40:17 +0200 Subject: [PATCH] fix: Stop adding duplicated modules when cloning them Previously, cloning a module (e.g. while printing it), caused the module to be inserted in to the global list of modules *again*. Co-authored-by: Hannes Greule --- .../java/spoon/reflect/factory/ModuleFactory.java | 1 + src/main/java/spoon/support/DefaultCoreFactory.java | 2 +- src/test/java/spoon/test/module/TestModule.java | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/spoon/reflect/factory/ModuleFactory.java b/src/main/java/spoon/reflect/factory/ModuleFactory.java index 40c4e8a1b53..dadb41b6862 100644 --- a/src/main/java/spoon/reflect/factory/ModuleFactory.java +++ b/src/main/java/spoon/reflect/factory/ModuleFactory.java @@ -128,6 +128,7 @@ public CtModule getOrCreate(String moduleName) { ctModule = factory.Core().createModule().setSimpleName(moduleName); ctModule.setRootPackage(new CtModelImpl.CtRootPackage()); ctModule.setParent(getUnnamedModule()); + getUnnamedModule().addModule(ctModule); } return ctModule; diff --git a/src/main/java/spoon/support/DefaultCoreFactory.java b/src/main/java/spoon/support/DefaultCoreFactory.java index c279c12aa32..f9f49fa1ea3 100644 --- a/src/main/java/spoon/support/DefaultCoreFactory.java +++ b/src/main/java/spoon/support/DefaultCoreFactory.java @@ -1124,7 +1124,7 @@ public CtTypeMemberWildcardImportReference createTypeMemberWildcardImportReferen public CtModule createModule() { CtModule module = new CtModuleImpl(); module.setFactory(getMainFactory()); - this.getMainFactory().Module().getUnnamedModule().addModule(module); + module.setParent(this.getMainFactory().Module().getUnnamedModule()); return module; } diff --git a/src/test/java/spoon/test/module/TestModule.java b/src/test/java/spoon/test/module/TestModule.java index b7f5d365ce2..a0176d03079 100644 --- a/src/test/java/spoon/test/module/TestModule.java +++ b/src/test/java/spoon/test/module/TestModule.java @@ -407,4 +407,17 @@ public void testModuleOverlappingPackages() { ); assertNotNull(launcher.getFactory().Type().get("test.parent.nested.Foo"), ""); } + + @Test + public void testModulePrintDoesNotDuplicate() { + // contract: Printing a module does not duplicate it in Model#getAllModules() + Launcher launcher = new Launcher(); + launcher.getEnvironment().setComplianceLevel(9); + launcher.addInputResource(MODULE_RESOURCES_PATH + "/code-multiple-modules"); + CtModel ctModel = launcher.buildModel(); + assertEquals(3, ctModel.getAllModules().size()); + //noinspection ResultOfMethodCallIgnored I wish it had no effect too, unspecified static analysis tool + launcher.getFactory().Module().getModule("bar").toString(); + assertEquals(3, ctModel.getAllModules().size()); + } }