From 51c9a94fa6429fbc31842af476173a52faecf4f4 Mon Sep 17 00:00:00 2001 From: Martin Monperrus Date: Mon, 2 Oct 2017 09:45:21 +0200 Subject: [PATCH] feat: add a static method to getting started with one single line of code (#1559) * feat: add a static method to getting started with one single line of code * up * up --- README.md | 5 +++++ doc/launcher.md | 8 +++++++- src/main/java/spoon/Launcher.java | 18 ++++++++++++++++++ src/test/java/spoon/test/api/APITest.java | 10 ++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 97d89346eba..7104a4501c4 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ # Spoon Spoon is an open-source library to analyze, rewrite, transform, transpile Java source code. It parses source files to build a well-designed AST with powerful analysis and transformation API. It fully supports Java 8. + +```java +CtClass l = Launcher.parseClass("class A { void m() { System.out.println(\"yeah\");} }"); +``` + External contributions as pull requests are welcome. The official website is available at . Spoon is an official Inria open-source project, and member of the [OW2](https://www.ow2.org/) open-source consortium. diff --git a/doc/launcher.md b/doc/launcher.md index 2acd0a23efa..a2f1dd2c054 100644 --- a/doc/launcher.md +++ b/doc/launcher.md @@ -6,7 +6,13 @@ keywords: usage, java ## Basic Launcher -The Spoon `Launcher` ([JavaDoc](http://spoon.gforge.inria.fr/mvnsites/spoon-core/apidocs/spoon/Launcher.html)) is used to create the AST model of a project. +The Spoon `Launcher` ([JavaDoc](http://spoon.gforge.inria.fr/mvnsites/spoon-core/apidocs/spoon/Launcher.html)) is used to create the AST model of a project. It can be as short as: + +```java +CtClass l = Launcher.parseClass("class A { void m() { System.out.println(\"yeah\");} }"); +``` + +The Launcher is highly configurable: ```java Launcher launcher = new Launcher(); diff --git a/src/main/java/spoon/Launcher.java b/src/main/java/spoon/Launcher.java index 79fdb45abfb..aa5f8f9d828 100644 --- a/src/main/java/spoon/Launcher.java +++ b/src/main/java/spoon/Launcher.java @@ -34,6 +34,7 @@ import spoon.compiler.SpoonResourceHelper; import spoon.processing.Processor; import spoon.reflect.CtModel; +import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; @@ -47,6 +48,7 @@ import spoon.support.StandardEnvironment; import spoon.support.compiler.FileSystemFile; import spoon.support.compiler.FileSystemFolder; +import spoon.support.compiler.VirtualFile; import spoon.support.compiler.jdt.JDTBasedSpoonCompiler; import spoon.support.gui.SpoonModelTree; @@ -798,4 +800,20 @@ public CtModel getModel() { return factory.getModel(); } + /** returns the AST of an inline class */ + public static CtClass parseClass(String code) { + Launcher launcher = new Launcher(); + launcher.addInputResource(new VirtualFile(code)); + launcher.getEnvironment().setNoClasspath(true); + launcher.getEnvironment().setAutoImports(true); + Collection> allTypes = launcher.buildModel().getAllTypes(); + if (allTypes.size() != 1) { + throw new SpoonException("parseClass only considers one class. Please consider using a Launcher object for more advanced usage."); + } + try { + return (CtClass) allTypes.stream().findFirst().get(); + } catch (ClassCastException e) { + throw new SpoonException("parseClass only considers classes (and not interfaces and enums). Please consider using a Launcher object for more advanced usage."); + } + } } diff --git a/src/test/java/spoon/test/api/APITest.java b/src/test/java/spoon/test/api/APITest.java index 9eafb5d8c5a..ba9bd3023d0 100644 --- a/src/test/java/spoon/test/api/APITest.java +++ b/src/test/java/spoon/test/api/APITest.java @@ -406,4 +406,14 @@ public void accept(CtVisitor visitor) { assertEquals("Check the number of if in method " + statement.getParent(CtMethod.class).getSignature() + " in the declaring class " + statement.getParent(CtType.class).getQualifiedName(),1, matcher.find(ifCondition).size()); } } + + @Test + public void testOneLinerIntro() { + // contract: spoon can be used with a single line of code with Launcher.parseClass + CtClass l = Launcher.parseClass("class A { void m() { System.out.println(\"yeah\");} }"); + assertEquals("A", l.getSimpleName()); + assertEquals(1, l.getMethods().size()); + assertEquals("m", l.getMethodsByName("m").get(0).getSimpleName()); + assertEquals("System.out.println(\"yeah\")", l.getMethodsByName("m").get(0).getBody().getStatement(0).toString()); + } }