diff --git a/examples/tests/current_test.panda b/examples/tests/current_test.panda index fac7b064e..62254eb0d 100644 --- a/examples/tests/current_test.panda +++ b/examples/tests/current_test.panda @@ -174,6 +174,8 @@ main { // Test implementation of Java class CustomThread thread = new CustomThread() thread.start() + + // Runnable runnable = { log 'x' } } // simple interface diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpretation.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpretation.java deleted file mode 100644 index ca5372128..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpretation.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2020 Dzikoysk - * - * Licensed 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.panda_lang.language.interpreter; - -import org.panda_lang.language.interpreter.logging.LoggerHolder; -import org.panda_lang.utilities.commons.function.ThrowingRunnable; -import org.panda_lang.utilities.commons.function.ThrowingSupplier; - -import java.util.Collection; - -/** - * Represents process of interpretation - */ -public interface Interpretation extends LoggerHolder { - - /** - * Execute the given task - * - * @param task the task to execute - * @param exception type - * @return the interpretation instance - */ - Interpretation execute(ThrowingRunnable task); - - /** - * Execute the given task and get result - * - * @param task the task to execute - * @param type of result - * @param exception type - * @return the interpretation instance - */ - T execute(ThrowingSupplier task); - - /** - * Check if process of interpretation is still healthy (executed tasks didn't throw any exceptions) - * - * @return true if healthy, otherwise false - */ - boolean isHealthy(); - - /** - * Get all collected failures - * - * @return collection of failures - */ - Collection getFailures(); - - /** - * Get associated interpreter - * - * @return the interpreter - */ - Interpreter getInterpreter(); - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpreter.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpreter.java index 1f8b592c3..a28b529c4 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpreter.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/Interpreter.java @@ -19,7 +19,6 @@ import org.panda_lang.language.architecture.Application; import org.panda_lang.language.architecture.Environment; import org.panda_lang.language.interpreter.source.Source; -import org.panda_lang.utilities.commons.function.ThrowingConsumer; /** * Translate source code into efficient intermediate representation and build an application @@ -28,16 +27,10 @@ public interface Interpreter { /** * Starts the process of interpretation - */ - Application interpret(Source source); - - /** - * Starts the process of interpretation and gives access to the interpretation process * - * @param interpretationConsumer the interpretation process consumer * @return interpreted application */ - Application interpret(Source source, ThrowingConsumer interpretationConsumer); + Application interpret(Source source); /** * Get associated environment diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/PandaInterpretation.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/PandaInterpretation.java deleted file mode 100644 index 783f9d37f..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/PandaInterpretation.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2020 Dzikoysk - * - * Licensed 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.panda_lang.language.interpreter; - -import org.jetbrains.annotations.Nullable; -import org.panda_lang.language.interpreter.logging.Logger; -import org.panda_lang.utilities.commons.function.ThrowingRunnable; -import org.panda_lang.utilities.commons.function.ThrowingSupplier; - -import java.util.ArrayList; -import java.util.Collection; - -public final class PandaInterpretation implements Interpretation { - - private final Interpreter interpreter; - private final Collection failures = new ArrayList<>(1); - private boolean healthy = true; - - public PandaInterpretation(Interpreter interpreter) { - this.interpreter = interpreter; - } - - @Override - public Interpretation execute(ThrowingRunnable task) { - execute((ThrowingSupplier<@Nullable Object, Exception>) () -> { - task.run(); - return null; - }); - - return this; - } - - @Override - public @Nullable T execute(ThrowingSupplier task) { - try { - return isHealthy() ? task.get() : null; - } catch (Exception exception) { - failures.add(exception); - return null; - } - } - - @Override - public boolean isHealthy() { - return healthy; - } - - @Override - public Collection getFailures() { - return failures; - } - - @Override - public Interpreter getInterpreter() { - return interpreter; - } - - @Override - public Logger getLogger() { - return interpreter.getEnvironment().getLogger(); - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java index b01adab97..f87fb5ca3 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java @@ -23,7 +23,6 @@ import org.panda_lang.language.architecture.module.Imports; import org.panda_lang.language.architecture.statement.Scope; import org.panda_lang.language.architecture.module.TypeLoader; -import org.panda_lang.language.interpreter.Interpretation; import org.panda_lang.language.interpreter.parser.expression.ExpressionParser; import org.panda_lang.language.interpreter.parser.stage.StageController; import org.panda_lang.language.interpreter.parser.pipeline.PipelinePath; @@ -41,11 +40,6 @@ public final class Components { */ public static final ContextComponent CONTROLLER = ContextComponent.of("controller", FrameworkController.class); - /** - * Represents the interpretation process - */ - public static final ContextComponent INTERPRETATION = ContextComponent.of("interpretation", Interpretation.class); - /** * Represents the application environment */ diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/ContextParser.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/ContextParser.java index 15baed19c..6298525f3 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/ContextParser.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/ContextParser.java @@ -28,6 +28,6 @@ public interface ContextParser extends Parser { * * @param context set of information about source and interpretation process */ - T parse(Context context) throws Exception; + T parse(Context context); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/pipeline/PipelineParser.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/pipeline/PipelineParser.java index 2024f2e17..4e26767ee 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/pipeline/PipelineParser.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/pipeline/PipelineParser.java @@ -16,7 +16,6 @@ package org.panda_lang.language.interpreter.parser.pipeline; -import org.panda_lang.language.interpreter.Interpretation; import org.panda_lang.language.interpreter.parser.Components; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.interpreter.parser.ContextParser; @@ -41,13 +40,11 @@ public PipelineParser(PipelineComponent component) { * @param context the context to use * @param stream the stream to parse * @return returns always null - * @throws Exception if something happen in subparser */ - public boolean parse(Context context, SourceStream stream) throws Exception { - Interpretation interpretation = context.getComponent(Components.INTERPRETATION); + public boolean parse(Context context, SourceStream stream) { Pipeline pipeline = context.getComponent(Components.PIPELINE).getPipeline(pipelineComponent); - while (stream.hasUnreadSource() && interpretation.isHealthy()) { + while (stream.hasUnreadSource()) { LocalChannel channel = new PandaLocalChannel(); Snippet source = stream.toSnippet(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStage.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStage.java index b3cceb6d1..6647363c9 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStage.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStage.java @@ -31,7 +31,7 @@ public PandaStage(StageController controller, String name) { } @Override - public boolean execute() throws Exception { + public boolean execute() { while (true) { currentPhase.callTasks(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStageController.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStageController.java index 701033840..e9991733a 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStageController.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStageController.java @@ -40,13 +40,13 @@ public PandaStageController initialize(List types) { } @Override - public void launch() throws Exception { + public void launch() { while (countTasks(null) > 0) { executeOnce(); } } - private void executeOnce() throws Exception { + private void executeOnce() { for (Stage cycle : cycles.values()) { currentCycle = cycle; diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStagePhase.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStagePhase.java index 42d10ab80..a64f19a39 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStagePhase.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/PandaStagePhase.java @@ -40,7 +40,7 @@ public PandaStagePhase(Stage cycle) { } @Override - public void callTasks() throws Exception { + public void callTasks() { Map> unitsMap = new TreeMap<>(tasks); tasks.clear(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/Stage.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/Stage.java index 160ee54dc..c052ed86e 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/Stage.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/Stage.java @@ -25,9 +25,8 @@ public interface Stage { * Launch cycle * * @return true if all tasks was called - * @throws Exception allows you to handle exception that may occur in tasks */ - boolean execute() throws Exception; + boolean execute(); /** * @return amount of tasks diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageController.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageController.java index 5ace753d0..2eb14dcb1 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageController.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageController.java @@ -25,10 +25,8 @@ public interface StageController { /** * Launch cycles - * - * @throws Exception if {@link StagePhase} throws an exception, you should catch it and handle */ - void launch() throws Exception; + void launch(); /** * Get amount of tasks before the specified cycle. diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StagePhase.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StagePhase.java index 5003119d4..a7f5dd386 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StagePhase.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StagePhase.java @@ -25,10 +25,8 @@ public interface StagePhase { /** * Call all tasks delegated to the phase - * - * @throws Exception allows you to handle exception that may occur in tasks */ - void callTasks() throws Exception; + void callTasks(); /** * Delegate task diff --git a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageTask.java b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageTask.java index f26dcec07..9674fcc64 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageTask.java +++ b/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/stage/StageTask.java @@ -32,8 +32,7 @@ public interface StageTask { * @param cycle current cycle * @param context data assigned to task * @return task value - * @throws Exception allows you to handle exception that may occur */ - @Nullable T call(Stage cycle, Context context) throws Exception; + @Nullable T call(Stage cycle, Context context); } diff --git a/panda-framework/src/test/java/org/panda_lang/language/interpreter/parser/stage/pipeline/StagePhaseControllerTest.java b/panda-framework/src/test/java/org/panda_lang/language/interpreter/parser/stage/pipeline/StagePhaseControllerTest.java index 002329a92..b1fde5048 100644 --- a/panda-framework/src/test/java/org/panda_lang/language/interpreter/parser/stage/pipeline/StagePhaseControllerTest.java +++ b/panda-framework/src/test/java/org/panda_lang/language/interpreter/parser/stage/pipeline/StagePhaseControllerTest.java @@ -38,7 +38,7 @@ public static void createPipelines() { } @Test - public void testPipelineGeneration() throws Throwable { + public void testPipelineGeneration() { StringBuilder outputBuilder = new StringBuilder(); generation.getCycle("b").nextPhase().delegate((pipeline, context) -> outputBuilder.append("b "), null); diff --git a/panda-utilities/src/main/java/org/panda_lang/utilities/commons/UnsafeUtils.java b/panda-utilities/src/main/java/org/panda_lang/utilities/commons/UnsafeUtils.java index 623353a9b..6360dda4d 100644 --- a/panda-utilities/src/main/java/org/panda_lang/utilities/commons/UnsafeUtils.java +++ b/panda-utilities/src/main/java/org/panda_lang/utilities/commons/UnsafeUtils.java @@ -24,7 +24,7 @@ public final class UnsafeUtils { private UnsafeUtils() { } @SuppressWarnings("unchecked") - public static void throwException(Exception e) throws E { + public static void throwException(Throwable e) throws E { throw (E) e; } diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/PandaInterpreter.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/PandaInterpreter.java index 94a21816d..7dd67890e 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/PandaInterpreter.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/PandaInterpreter.java @@ -16,19 +16,33 @@ package org.panda_lang.panda.language.interpreter; -import org.jetbrains.annotations.Nullable; import org.panda_lang.language.architecture.Application; import org.panda_lang.language.architecture.Environment; -import org.panda_lang.language.interpreter.Interpretation; +import org.panda_lang.language.architecture.module.Imports; +import org.panda_lang.language.architecture.module.PandaImports; import org.panda_lang.language.interpreter.Interpreter; -import org.panda_lang.language.interpreter.PandaInterpretation; +import org.panda_lang.language.interpreter.lexer.Lexer; +import org.panda_lang.language.interpreter.lexer.PandaLexer; +import org.panda_lang.language.interpreter.parser.Components; +import org.panda_lang.language.interpreter.parser.Context; +import org.panda_lang.language.interpreter.parser.PandaContext; import org.panda_lang.language.interpreter.parser.expression.PandaExpressionParser; +import org.panda_lang.language.interpreter.parser.pipeline.PandaLocalChannel; +import org.panda_lang.language.interpreter.parser.pipeline.PipelineParser; +import org.panda_lang.language.interpreter.parser.pipeline.Pipelines; +import org.panda_lang.language.interpreter.parser.stage.PandaStageController; +import org.panda_lang.language.interpreter.parser.stage.Stages; +import org.panda_lang.language.interpreter.source.PandaSourceSet; import org.panda_lang.language.interpreter.source.Source; -import org.panda_lang.panda.PandaException; +import org.panda_lang.language.interpreter.source.SourceSet; +import org.panda_lang.language.interpreter.token.PandaSourceStream; +import org.panda_lang.language.interpreter.token.Snippet; +import org.panda_lang.language.interpreter.token.SourceStream; +import org.panda_lang.language.resource.Resources; import org.panda_lang.panda.language.architecture.PandaApplication; -import org.panda_lang.panda.language.interpreter.parser.ApplicationParser; +import org.panda_lang.panda.language.architecture.PandaScript; +import org.panda_lang.panda.language.interpreter.parser.PandaComponents; import org.panda_lang.utilities.commons.TimeUtils; -import org.panda_lang.utilities.commons.function.ThrowingConsumer; public final class PandaInterpreter implements Interpreter { @@ -40,29 +54,59 @@ public PandaInterpreter(Environment environment) { @Override public Application interpret(Source source) { - return interpret(source, interpretation -> {}); - } + long uptime = System.nanoTime(); - @Override - public Application interpret(Source source, @Nullable ThrowingConsumer interpretationConsumer) { - Interpretation interpretation = new PandaInterpretation(this); - ApplicationParser parser = new ApplicationParser(interpretation); - - if (interpretationConsumer != null) { - interpretation.execute(() -> { - interpretationConsumer.accept(interpretation); - }); - } + Resources resources = environment.getController().getResources(); + PandaApplication application = new PandaApplication(environment); - long uptime = System.nanoTime(); - PandaApplication application = parser.parse(source); + PandaStageController stageController = new PandaStageController(); + stageController.initialize(Stages.getValues()); + + SourceSet sources = new PandaSourceSet(); + sources.addSource(source); + + Lexer lexer = PandaLexer.of(environment.getController().getLanguage().getSyntax()) + .enableSections() + .build(); + + Context context = new PandaContext() + .withComponent(Components.CONTROLLER, environment.getController()) + .withComponent(Components.APPLICATION, application) + .withComponent(Components.ENVIRONMENT, environment) + .withComponent(Components.GENERATION, stageController) + .withComponent(Components.TYPE_LOADER, environment.getTypeLoader()) + .withComponent(Components.PIPELINE, resources.getPipelinePath()) + .withComponent(Components.EXPRESSION, resources.getExpressionSubparsers().toParser()) + .withComponent(Components.SOURCES, sources); - if (!interpretation.isHealthy()) { - throw new PandaException("Interpretation failed, cannot parse specified sources"); + PipelineParser headParser = new PipelineParser<>(Pipelines.HEAD); + + for (Source current : sources) { + PandaScript script = new PandaScript(current.getId()); + application.addScript(script); + + Snippet snippet = lexer.convert(current); + SourceStream stream = new PandaSourceStream(snippet); + + Imports imports = new PandaImports(environment.getModulePath(), environment.getTypeLoader()); + imports.importModule("java"); + imports.importModule("panda"); + + Context delegatedContext = context.fork() + .withComponent(PandaComponents.PANDA_SCRIPT, script) + .withComponent(Components.SCRIPT, script) + .withComponent(Components.IMPORTS, imports) + .withComponent(Components.SOURCE, snippet) + .withComponent(Components.STREAM, stream) + .withComponent(Components.CURRENT_SOURCE, snippet) + .withComponent(Components.CHANNEL, new PandaLocalChannel()); + + headParser.parse(delegatedContext, stream); } - String parseTime = TimeUtils.toMilliseconds(System.nanoTime() - uptime); + stageController.launch(); + String parseTime = TimeUtils.toMilliseconds(System.nanoTime() - uptime); environment.getLogger().debug("--- Interpretation of " + source.getId() + " details "); environment.getLogger().debug("• Parse time: " + parseTime); environment.getLogger().debug("• Amount of types: " + environment.getModulePath().countTypes()); diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ApplicationParser.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ApplicationParser.java deleted file mode 100644 index 2dcfa443c..000000000 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ApplicationParser.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2020 Dzikoysk - * - * Licensed 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.panda_lang.panda.language.interpreter.parser; - -import org.panda_lang.language.architecture.Environment; -import org.panda_lang.language.architecture.module.Imports; -import org.panda_lang.language.architecture.module.PandaImports; -import org.panda_lang.language.interpreter.Interpretation; -import org.panda_lang.language.interpreter.lexer.Lexer; -import org.panda_lang.language.interpreter.lexer.PandaLexer; -import org.panda_lang.language.interpreter.parser.Components; -import org.panda_lang.language.interpreter.parser.Context; -import org.panda_lang.language.interpreter.parser.PandaContext; -import org.panda_lang.language.interpreter.parser.Parser; -import org.panda_lang.language.interpreter.parser.pipeline.PandaLocalChannel; -import org.panda_lang.language.interpreter.parser.pipeline.PipelineParser; -import org.panda_lang.language.interpreter.parser.pipeline.Pipelines; -import org.panda_lang.language.interpreter.parser.stage.PandaStageController; -import org.panda_lang.language.interpreter.parser.stage.Stages; -import org.panda_lang.language.interpreter.source.PandaSourceSet; -import org.panda_lang.language.interpreter.source.Source; -import org.panda_lang.language.interpreter.source.SourceSet; -import org.panda_lang.language.interpreter.token.PandaSourceStream; -import org.panda_lang.language.interpreter.token.Snippet; -import org.panda_lang.language.interpreter.token.SourceStream; -import org.panda_lang.language.resource.Resources; -import org.panda_lang.panda.language.architecture.PandaApplication; -import org.panda_lang.panda.language.architecture.PandaScript; - -public final class ApplicationParser implements Parser { - - private final Interpretation interpretation; - - public ApplicationParser(Interpretation interpretation) { - this.interpretation = interpretation; - } - - public PandaApplication parse(Source source) { - Environment environment = interpretation.getInterpreter().getEnvironment(); - Resources resources = environment.getController().getResources(); - PandaApplication application = new PandaApplication(environment); - - PandaStageController generation = new PandaStageController(); - generation.initialize(Stages.getValues()); - - SourceSet sources = new PandaSourceSet(); - sources.addSource(source); - - Lexer lexer = PandaLexer.of(environment.getController().getLanguage().getSyntax()) - .enableSections() - .build(); - - Context context = new PandaContext() - .withComponent(Components.CONTROLLER, environment.getController()) - .withComponent(Components.APPLICATION, application) - .withComponent(Components.ENVIRONMENT, environment) - .withComponent(Components.INTERPRETATION, interpretation) - .withComponent(Components.GENERATION, generation) - .withComponent(Components.TYPE_LOADER, environment.getTypeLoader()) - .withComponent(Components.PIPELINE, resources.getPipelinePath()) - .withComponent(Components.EXPRESSION, resources.getExpressionSubparsers().toParser()) - .withComponent(Components.SOURCES, sources); - - PipelineParser headParser = new PipelineParser<>(Pipelines.HEAD); - - for (Source current : sources) { - PandaScript script = new PandaScript(current.getId()); - application.addScript(script); - - interpretation.execute(() -> { - Snippet snippet = lexer.convert(current); - SourceStream stream = new PandaSourceStream(snippet); - - Imports imports = new PandaImports(environment.getModulePath(), environment.getTypeLoader()); - imports.importModule("java"); - imports.importModule("panda"); - - Context delegatedContext = context.fork() - .withComponent(PandaComponents.PANDA_SCRIPT, script) - .withComponent(Components.SCRIPT, script) - .withComponent(Components.IMPORTS, imports) - .withComponent(Components.SOURCE, snippet) - .withComponent(Components.STREAM, stream) - .withComponent(Components.CURRENT_SOURCE, snippet) - .withComponent(Components.CHANNEL, new PandaLocalChannel()); - - interpretation.execute(() -> headParser.parse(delegatedContext, stream)); - }); - } - - return interpretation - .execute(generation::launch) - .execute(() -> application); - } - -} diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ScopeParser.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ScopeParser.java index 7c8de9e07..9527df5f6 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ScopeParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/ScopeParser.java @@ -29,7 +29,7 @@ public final class ScopeParser implements Parser { private static final PipelineParser SCOPE_PIPELINE_PARSER = new PipelineParser<>(Pipelines.SCOPE); - public Scope parse(Context context, Scope scope, Snippet body) throws Exception { + public Scope parse(Context context, Scope scope, Snippet body) { PandaSourceStream stream = new PandaSourceStream(body); Context delegatedContext = context.fork() diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockParser.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockParser.java index 61ae04c4c..e047dabef 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockParser.java @@ -76,7 +76,7 @@ protected Boolean customHandle(Handler handler, Context context, LocalChannel ch } @Autowired(order = 1) - public void parse(Context context, LocalChannel channel, @Ctx Scope parent, @Src("declaration") Snippet declaration) throws Exception { + public void parse(Context context, LocalChannel channel, @Ctx Scope parent, @Src("declaration") Snippet declaration) { BlockSubparser blockParser = channel.get("subparser", BlockSubparser.class); Context delegatedContext = channel.allocated("blockContext", context.fork()) @@ -106,7 +106,7 @@ public void parse(Context context, LocalChannel channel, @Ctx Scope parent, @Src } @Autowired(order = 2) - public void parseContent(@Channel Context blockContext, @Channel Block block, @Nullable @Src("body") Snippet body) throws Exception { + public void parseContent(@Channel Context blockContext, @Channel Block block, @Nullable @Src("body") Snippet body) { if (body != null) { SCOPE_PARSER.parse(blockContext, block, body); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparser.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparser.java index 8e17d1269..44c1c7757 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparser.java @@ -23,6 +23,6 @@ public interface BlockSubparser extends Parser, Handler { - BlockData parse(Context context, Snippet declaration) throws Exception; + BlockData parse(Context context, Snippet declaration); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparserBootstrap.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparserBootstrap.java index 2aa2aa685..1c777b764 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparserBootstrap.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/block/BlockSubparserBootstrap.java @@ -25,7 +25,7 @@ public abstract class BlockSubparserBootstrap extends ParserBootstrap implements BlockSubparser { @Override - public final BlockData parse(Context context, Snippet declaration) throws Exception { + public final BlockData parse(Context context, Snippet declaration) { return super.parse(context.withComponent(Components.STREAM, new PandaSourceStream(declaration))); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapContextParser.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapContextParser.java index 582d667ec..862004e92 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapContextParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapContextParser.java @@ -36,7 +36,7 @@ final class BootstrapContextParser implements ContextParser { } @Override - public final T parse(Context context) throws Exception { + public final T parse(Context context) { SourceStream stream = context.getComponent(Components.STREAM); Snippet source = stream.toSnippet(); int length = stream.getUnreadLength(); diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapTaskScheduler.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapTaskScheduler.java index 39d4ecedb..cc6aeea50 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapTaskScheduler.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/BootstrapTaskScheduler.java @@ -23,6 +23,7 @@ import org.panda_lang.language.interpreter.parser.stage.Stage; import org.panda_lang.language.interpreter.parser.stage.StagePhase; import org.panda_lang.language.interpreter.parser.stage.StageTask; +import org.panda_lang.utilities.commons.UnsafeUtils; import java.lang.reflect.InvocationTargetException; import java.util.Stack; @@ -41,7 +42,7 @@ final class BootstrapTaskScheduler { this.methods = methods; } - protected @Nullable T schedule(Context context) throws Exception { + protected @Nullable T schedule(Context context) { int currentOrder = methods.peek().getOrder(); while (hasNext(currentOrder)) { @@ -58,20 +59,16 @@ final class BootstrapTaskScheduler { return null; } - private T delegateNext(Context context, BootstrapMethod method, boolean last) throws Exception { + private T delegateNext(Context context, BootstrapMethod method, boolean last) { StageTask callback = (cycle, delegatedContext) -> { - T value; + T value = null; try { value = method.getGeneratedMethod().invoke(content.getInstance(), delegatedContext); - } catch (InvocationTargetException e) { - if (e.getTargetException() instanceof Exception) { - throw (Exception) e.getTargetException(); - } - - throw new BootstrapException("Cannot execute " + method.getName() + " -> " + e.getTargetException().getMessage(), e.getTargetException()); - } catch (Throwable e) { - throw new BootstrapException("Cannot execute " + method.getName() + " -> " + e.getMessage(), e); + } catch (InvocationTargetException targetException) { + UnsafeUtils.throwException(targetException.getTargetException()); + } catch (Throwable throwable) { + UnsafeUtils.throwException(throwable); } if (last && !methods.isEmpty()) { @@ -84,7 +81,7 @@ private T delegateNext(Context context, BootstrapMethod method, boolean last) th return delegateMethod(context, callback, method); } - private @Nullable T delegateMethod(Context context, StageTask callback, BootstrapMethod method) throws Exception { + private @Nullable T delegateMethod(Context context, StageTask callback, BootstrapMethod method) { StageController stageController = context.getComponent(Components.GENERATION); Stage cycle = stageController.getCycle(method.getCycle()); diff --git a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/ParserBootstrap.java b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/ParserBootstrap.java index f85f38ece..0a656e40d 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/ParserBootstrap.java +++ b/panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/context/ParserBootstrap.java @@ -39,7 +39,7 @@ public final Object handle(Context context, LocalChannel channel, Snippet source } @Override - public final T parse(Context context) throws Exception { + public final T parse(Context context) { return get(context).getParser().parse(context); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/assignation/AssignationSubparserBootstrap.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/assignation/AssignationSubparserBootstrap.java index 1010bda39..d8f76c08b 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/assignation/AssignationSubparserBootstrap.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/assignation/AssignationSubparserBootstrap.java @@ -30,7 +30,7 @@ public abstract class AssignationSubparserBootstrap extends ParserBootstrap<@Nullable ExpressionResult> implements AssignationSubparser { @Override - public final @Nullable ExpressionResult parseAssignment(Context context, Snippet declaration, TokenInfo operator, Expression expression) throws Exception { + public final @Nullable ExpressionResult parseAssignment(Context context, Snippet declaration, TokenInfo operator, Expression expression) { context.withComponent(Components.STREAM, new PandaSourceStream(declaration)); context.withComponent(AssignationComponents.EXPRESSION, expression); diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/operation/subparsers/logical/OrOperation.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/operation/subparsers/logical/OrOperation.java index 8dfcd95f9..10846d634 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/operation/subparsers/logical/OrOperation.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/expressions/subparsers/operation/subparsers/logical/OrOperation.java @@ -23,7 +23,7 @@ import org.panda_lang.panda.language.resource.syntax.expressions.subparsers.operation.rpn.RPNOperationAction; import org.panda_lang.panda.language.resource.syntax.expressions.subparsers.operation.rpn.RPNOperationSupplier; -public class OrOperation implements RPNOperationSupplier { +public class OrOperation implements RPNOperationSupplier { @Override public RPNOperationAction of(TypeLoader typeLoader, Expression a, Expression b) { diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/MainParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/MainParser.java index b354c1ed4..ec1a3cdda 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/MainParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/MainParser.java @@ -59,7 +59,7 @@ public void createScope(LocalChannel channel, @Ctx Script script, @Channel Locat } @Autowired(order = 2, phase = Phases.NEXT_AFTER) - public void parseScope(Context context, @Channel MainScope main, @Src("body") @Nullable Snippet body) throws Exception { + public void parseScope(Context context, @Channel MainScope main, @Src("body") @Nullable Snippet body) { SCOPE_PARSER.parse(context.fork(), main, body); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/RequireParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/RequireParser.java index 197062b07..5981702b8 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/RequireParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/head/RequireParser.java @@ -20,7 +20,6 @@ import org.panda_lang.language.architecture.Environment; import org.panda_lang.language.architecture.module.Imports; import org.panda_lang.language.architecture.module.Module; -import org.panda_lang.language.interpreter.Interpretation; import org.panda_lang.language.interpreter.parser.Components; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.interpreter.parser.PandaParserFailure; @@ -96,8 +95,7 @@ private void parseFile(Context context, Imports imports, TokenInfo requiredFile) throw new PandaParserFailure(context, requiredFile, "Invalid token", "You should use string sequence to import file"); } - Interpretation interpretation = context.getComponent(Components.INTERPRETATION); - Environment environment = interpretation.getInterpreter().getEnvironment(); + Environment environment = context.getComponent(Components.ENVIRONMENT); File environmentDirectory = environment.getDirectory(); File file = new File(environmentDirectory, requiredFile.getValue() + ".panda"); @@ -114,7 +112,7 @@ private void parseFile(Context context, Imports imports, TokenInfo requiredFile) } try { - PackageManagerUtils.loadToEnvironment(interpretation, file); + PackageManagerUtils.loadToEnvironment(environment, file); } catch (IOException e) { throw new PandaParserFailure(context, requiredFile, e.getMessage()); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/scope/TryCatchParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/scope/TryCatchParser.java index 284459112..ec2a48833 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/scope/TryCatchParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/scope/TryCatchParser.java @@ -57,14 +57,14 @@ protected BootstrapInitializer initialize(Context context, BootstrapInitia } @Autowired(order = 1) - public void parse(Context context, LocalChannel channel, @Ctx Scope parent, @Channel Location location, @Src("try-body") Snippet tryBody) throws Exception { + public void parse(Context context, LocalChannel channel, @Ctx Scope parent, @Channel Location location, @Src("try-body") Snippet tryBody) { Scope tryBlock = SCOPE_PARSER.parse(context, new PandaBlock(parent, location), tryBody); TryCatch tryCatch = channel.allocated("statement", new TryCatch(location, tryBlock, new PandaBlock(parent, location))); parent.addStatement(tryCatch); } @Autowired(order = 2) - public void parse(Context context, @Ctx Scope parent, @Channel TryCatch tryCatch, @Src("catch-what") Snippet catchWhat, @Src("catch-body") Snippet catchBody) throws Exception { + public void parse(Context context, @Ctx Scope parent, @Channel TryCatch tryCatch, @Src("catch-what") Snippet catchWhat, @Src("catch-body") Snippet catchBody) { Scope catchBlock = new PandaBlock(parent, catchWhat.getLocation()); PandaVariableDataInitializer dataInitializer = new PandaVariableDataInitializer(context, catchBlock); diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/ConstructorParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/ConstructorParser.java index 62d40c245..9e83f149c 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/ConstructorParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/ConstructorParser.java @@ -90,7 +90,7 @@ public void parse(Context context, LocalChannel channel, @Channel Location locat } @Autowired(order = 2, phase = Phases.NEXT_DEFAULT) - public void parse(Context context, @Ctx TypeScope typeScope, @Channel ConstructorScope scope, @Channel TypeConstructor constructor, @Channel Snippet src, @Src("body") @Nullable Snippet body) throws Exception { + public void parse(Context context, @Ctx TypeScope typeScope, @Channel ConstructorScope scope, @Channel TypeConstructor constructor, @Channel Snippet src, @Src("body") @Nullable Snippet body) { SCOPE_PARSER.parse(context, scope, body); typeScope.getType().getSuperclass() diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/MethodParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/MethodParser.java index d9e9da3de..4d46416c5 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/MethodParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/MethodParser.java @@ -170,7 +170,7 @@ public void declareMethod(LocalChannel channel, @Ctx Type type, @Channel Mapping } @Autowired(order = 5, phase = Phases.NEXT_DEFAULT) - public void parse(Context context, @Channel MethodScope methodScope, @Channel TypeMethod method, @Nullable @Src("body") Snippet body) throws Exception { + public void parse(Context context, @Channel MethodScope methodScope, @Channel TypeMethod method, @Nullable @Src("body") Snippet body) { if (!SnippetUtils.isEmpty(body)) { SCOPE_PARSER.parse(context, methodScope, body); } diff --git a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/TypeParser.java b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/TypeParser.java index ad2ead153..d7b80220f 100644 --- a/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/TypeParser.java +++ b/panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/TypeParser.java @@ -118,7 +118,7 @@ public void parseDeclaration(Context context, @Ctx Type type, @Ctx TypeLoader lo } @Autowired(order = 2, stage = Stages.TYPES_LABEL, phase = Phases.NEXT_BEFORE) - public Object parseBody(Context context, @Ctx Type type, @Src("body") Snippet body) throws Exception { + public Object parseBody(Context context, @Ctx Type type, @Src("body") Snippet body) { return TYPE_PIPELINE_PARSER.parse(context, new PandaSourceStream(body)); } diff --git a/panda/src/main/java/org/panda_lang/panda/manager/PackageManagerUtils.java b/panda/src/main/java/org/panda_lang/panda/manager/PackageManagerUtils.java index 6efcbbd64..3e51c4957 100644 --- a/panda/src/main/java/org/panda_lang/panda/manager/PackageManagerUtils.java +++ b/panda/src/main/java/org/panda_lang/panda/manager/PackageManagerUtils.java @@ -16,7 +16,7 @@ package org.panda_lang.panda.manager; -import org.panda_lang.language.interpreter.Interpretation; +import org.panda_lang.language.architecture.Environment; import org.panda_lang.language.interpreter.source.Source; import org.panda_lang.language.interpreter.source.PandaURLSource; @@ -31,25 +31,22 @@ private PackageManagerUtils() { } /** * Load module * - * @param interpretation the interpretation process to use * @param moduleDirectory the module directory to load * @throws IOException when module directory or module file does not exist */ - public static void loadToEnvironment(Interpretation interpretation, File moduleDirectory) throws IOException { + public static void loadToEnvironment(Environment environment, File moduleDirectory) throws IOException { File packageInfoFile = new File(moduleDirectory, PackageManagerConstants.PACKAGE_INFO); if (!packageInfoFile.exists()) { - interpretation.getLogger().debug("Skipping non-panda dependency directory " + moduleDirectory); + environment.getLogger().debug("Skipping non-panda dependency directory " + moduleDirectory); return; } PackageDocument packageInfo = new PackageDocumentFile(packageInfoFile).getContent(); - interpretation.getInterpreter().getEnvironment().getModulePath().include(moduleDirectory.getName(), () -> { - interpretation.execute(() -> { - Source source = PandaURLSource.fromFile(new File(moduleDirectory, Objects.requireNonNull(packageInfo.getMainScript()))); - interpretation.getInterpreter().interpret(source); - }); + environment.getModulePath().include(moduleDirectory.getName(), () -> { + Source source = PandaURLSource.fromFile(new File(moduleDirectory, Objects.requireNonNull(packageInfo.getMainScript()))); + environment.getInterpreter().interpret(source); }); } diff --git a/panda/src/main/java/org/panda_lang/panda/manager/Run.java b/panda/src/main/java/org/panda_lang/panda/manager/Run.java index 08e20a1fc..ff1b52352 100644 --- a/panda/src/main/java/org/panda_lang/panda/manager/Run.java +++ b/panda/src/main/java/org/panda_lang/panda/manager/Run.java @@ -17,12 +17,11 @@ package org.panda_lang.panda.manager; import org.panda_lang.language.FrameworkController; -import org.panda_lang.language.interpreter.Interpretation; import org.panda_lang.language.interpreter.source.PandaURLSource; import org.panda_lang.panda.language.architecture.PandaEnvironment; -import org.panda_lang.utilities.commons.function.ThrowingConsumer; import java.io.File; +import java.io.IOException; import java.util.Objects; final class Run { @@ -35,7 +34,7 @@ final class Run { this.document = document; } - protected Object run(FrameworkController controller) { + protected Object run(FrameworkController controller) throws IOException { File mainScript = new File(document.getDocument().getParentFile(), Objects.requireNonNull(document.getMainScript())); PandaEnvironment environment = new PandaEnvironment(controller, manager.getWorkingDirectory()); @@ -44,20 +43,14 @@ protected Object run(FrameworkController controller) { File pandaModules = document.getPandaModules(); File[] owners = pandaModules.listFiles(); - ThrowingConsumer initialize = interpretation -> { - if (owners == null) { - return; + for (File ownerDirectory : owners) { + for (File moduleDirectory : Objects.requireNonNull(ownerDirectory.listFiles())) { + PackageManagerUtils.loadToEnvironment(environment, moduleDirectory); } - - for (File ownerDirectory : owners) { - for (File moduleDirectory : Objects.requireNonNull(ownerDirectory.listFiles())) { - PackageManagerUtils.loadToEnvironment(interpretation, moduleDirectory); - } - } - }; + } return environment.getInterpreter() - .interpret(PandaURLSource.fromFile(mainScript), initialize) + .interpret(PandaURLSource.fromFile(mainScript)) .launch(); }