You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/11/29 18:13:13 UTC

[groovy] branch master updated: Minor refactoring: implement `AstStringCompiler` in Java

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new ae9beec  Minor refactoring: implement `AstStringCompiler` in Java
ae9beec is described below

commit ae9beecc6f753b7d13cec9747b3956c6ca7a609b
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Nov 30 01:15:40 2019 +0800

    Minor refactoring: implement `AstStringCompiler` in Java
---
 .../groovy/ast/builder/AstStringCompiler.groovy    | 71 --------------------
 .../groovy/ast/builder/AstStringCompiler.java      | 77 ++++++++++++++++++++++
 2 files changed, 77 insertions(+), 71 deletions(-)

diff --git a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy
deleted file mode 100644
index a3818de..0000000
--- a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.groovy
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.codehaus.groovy.ast.builder
-
-import groovy.transform.CompileStatic
-import groovy.transform.PackageScope
-import org.codehaus.groovy.ast.ASTNode
-import org.codehaus.groovy.ast.ModuleNode
-import org.codehaus.groovy.control.CompilationUnit
-import org.codehaus.groovy.control.CompilePhase
-import org.codehaus.groovy.control.CompilerConfiguration
-
-import java.security.AccessController
-import java.security.PrivilegedAction
-
-/**
- * This class handles converting Strings to ASTNode lists.
- */
-@CompileStatic
-@PackageScope
-class AstStringCompiler {
-
-    /**
-     * Performs the String source to {@link List} of {@link ASTNode}.
-     *
-     * @param script
-     *      a Groovy script in String form
-     * @param compilePhase
-     *      the int based CompilePhase to compile it to.
-     * @param statementsOnly
-     */
-    List<ASTNode> compile(String script, CompilePhase compilePhase, boolean statementsOnly) {
-        final scriptClassName = makeScriptClassName()
-        GroovyCodeSource codeSource = new GroovyCodeSource(script, "${scriptClassName}.groovy", '/groovy/script')
-        CompilationUnit cu = new CompilationUnit(CompilerConfiguration.DEFAULT, codeSource.codeSource, AccessController.doPrivileged({
-            new GroovyClassLoader()
-        } as PrivilegedAction<GroovyClassLoader>))
-        cu.addSource(codeSource.name, script)
-        cu.compile(compilePhase.phaseNumber)
-        // collect all the ASTNodes into the result, possibly ignoring the script body if desired
-        (List<ASTNode>) cu.AST.modules.inject([]) { List acc, ModuleNode node ->
-            if (node.statementBlock) acc.add(node.statementBlock)
-            node.classes?.each {
-                if (!(statementsOnly && it.name == scriptClassName)) {
-                    acc << it
-                }
-            }
-            acc
-        }
-    }
-
-    private static String makeScriptClassName() {
-        "Script${System.nanoTime()}"
-    }
-}
diff --git a/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java
new file mode 100644
index 0000000..c48114e
--- /dev/null
+++ b/src/main/groovy/org/codehaus/groovy/ast/builder/AstStringCompiler.java
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.ast.builder;
+
+import groovy.lang.GroovyClassLoader;
+import groovy.lang.GroovyCodeSource;
+import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.stmt.BlockStatement;
+import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.CompilePhase;
+import org.codehaus.groovy.control.CompilerConfiguration;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * This class handles converting Strings to ASTNode lists.
+ */
+class AstStringCompiler {
+    /**
+     * Performs the String source to {@link java.util.List} of {@link ASTNode}.
+     *
+     * @param script
+     *      a Groovy script in String form
+     * @param compilePhase
+     *      the int based CompilePhase to compile it to.
+     * @param statementsOnly
+     */
+    public List<ASTNode> compile(String script, CompilePhase compilePhase, boolean statementsOnly) {
+        final String scriptClassName = makeScriptClassName();
+        GroovyCodeSource codeSource = new GroovyCodeSource(script, scriptClassName + ".groovy", "/groovy/script");
+        CompilationUnit cu = new CompilationUnit(CompilerConfiguration.DEFAULT, codeSource.getCodeSource(),
+                AccessController.doPrivileged((PrivilegedAction<GroovyClassLoader>) GroovyClassLoader::new));
+        cu.addSource(codeSource.getName(), script);
+        cu.compile(compilePhase.getPhaseNumber());
+
+        // collect all the ASTNodes into the result, possibly ignoring the script body if desired
+        List<ASTNode> result = cu.getAST().getModules().stream().reduce(new LinkedList<>(), (acc, node) -> {
+            BlockStatement statementBlock = node.getStatementBlock();
+            if (null != statementBlock) {
+                acc.add(statementBlock);
+            }
+            acc.addAll(
+                    node.getClasses().stream()
+                        .filter(c -> !(statementsOnly && scriptClassName.equals(c.getName())))
+                        .collect(Collectors.toList())
+            );
+
+            return acc;
+        }, (o1, o2) -> o1);
+
+        return result;
+    }
+
+    private static String makeScriptClassName() {
+        return "Script" + System.nanoTime();
+    }
+}