From a734f47efa50e921d407fe7429d2007ad2caa0c0 Mon Sep 17 00:00:00 2001 From: dzikoysk Date: Wed, 7 Oct 2020 00:19:09 +0200 Subject: [PATCH] GH-556 Simplify modules and loading services, improve relations between signatures and types, refactor type and module parsers --- .../language/architecture/AbstractScript.java | 10 +- .../language/architecture/Script.java | 3 +- .../expression/AbstractDynamicExpression.java | 8 +- .../expression/PandaExpression.java | 3 +- .../expression/ThisExpression.java | 1 - .../language/architecture/module/Imports.java | 72 +++++- ...ndaImportsUtils.java => ImportsUtils.java} | 19 +- .../language/architecture/module/Module.java | 49 ++-- .../module/ModuleLoaderUtils.java | 35 --- .../architecture/module/ModulePath.java | 4 + .../module/ModuleResourceUtils.java | 41 --- .../language/architecture/module/Modules.java | 24 +- .../architecture/module/PandaImports.java | 98 -------- .../architecture/module/PandaModule.java | 54 ++-- .../architecture/module/PandaModulePath.java | 4 +- .../architecture/module/PandaModules.java | 21 +- .../architecture/module/PandaTypeLoader.java | 64 +++-- .../architecture/module/PandaTypesMap.java | 75 ------ .../architecture/module/TypeLoader.java | 30 +-- ...{ModuleResource.java => TypeResolver.java} | 34 +-- .../architecture/module/TypesMap.java | 51 ---- .../PandaVariableDataInitializer.java | 1 - .../architecture/type/Adjustment.java | 20 +- .../language/architecture/type/Autocast.java | 1 - .../type/{TypeModels.java => Kind.java} | 14 +- .../language/architecture/type/PandaType.java | 127 ++++------ .../architecture/type/PandaTypeMetadata.java | 30 ++- .../language/architecture/type/Reference.java | 57 +++++ .../language/architecture/type/Signature.java | 13 +- .../architecture/type/SignatureMatcher.java | 22 -- .../language/architecture/type/State.java | 15 ++ .../architecture/type/StateComparator.java | 43 ---- .../language/architecture/type/Type.java | 62 +---- .../architecture/type/TypeComponents.java | 29 --- .../architecture/type/TypeContext.java | 21 ++ .../language/architecture/type/TypeScope.java | 4 +- .../architecture/type/TypedUtils.java | 2 +- .../type/VisibilityComparator.java | 3 +- .../type/array/ArrayClassTypeConstants.java | 4 +- .../type/array/ArrayClassTypeFetcher.java | 4 +- .../architecture/type/array/ArrayType.java | 4 +- .../type/generator/MethodGenerator.java | 2 +- .../type/generator/TypeGenerator.java | 6 +- .../dynamic/DynamicClassGenerator.java | 4 +- .../generator/dynamic/PandaDynamicClass.java | 20 +- .../type/member/AbstractMember.java | 3 +- .../type/member/AbstractMetadata.java | 19 +- .../architecture/type/member/Member.java | 4 +- .../type/{ => member}/MemberInvoker.java | 3 +- .../architecture/type/member/Metadata.java | 2 +- .../type/member/method/MethodScope.java | 2 +- .../type/member/method/Methods.java | 5 +- .../type/member/method/PandaMethod.java | 2 +- .../interpreter/parser/Components.java | 115 --------- .../language/interpreter/parser/Context.java | 2 - .../interpreter/parser/ContextCreator.java | 2 +- .../interpreter/parser/ContextParser.java | 15 ++ .../interpreter/parser/PandaContext.java | 3 - .../parser/PandaContextCreator.java | 7 +- .../parser/PandaParserFailure.java | 36 ++- .../language/interpreter/parser/Parser.java | 2 +- .../interpreter/parser/ParserFailure.java | 33 --- .../interpreter/parser/SourceReader.java | 102 ++++++++ .../expression/PandaExpressionParser.java | 1 - .../parser/pool/PandaParserPool.java | 14 +- .../parser/pool/PandaParserPoolService.java | 8 +- .../interpreter/parser/pool/ParserPool.java | 12 +- .../parser/pool/ParserPoolService.java | 9 +- .../interpreter/parser/pool/PoolParser.java | 61 +++-- .../interpreter/parser/pool/Target.java | 69 ----- .../interpreter/parser/pool/Targets.java | 13 +- .../parser/stage/PandaStagePhase.java | 9 +- .../interpreter/parser/stage/Phases.java | 4 + .../interpreter/parser/stage/StagePhase.java | 4 +- .../parser/stage/StageService.java | 12 +- .../interpreter/parser/stage/StageTask.java | 4 +- .../functional/elements/ArgumentsElement.java | 1 - .../elements/ExpressionElement.java | 1 - .../interpreter/token/PandaSourceStream.java | 10 + .../interpreter/token/SourceStream.java | 15 +- .../interpreter/token/TokenUtils.java | 30 +-- .../resource/internal/java/JavaModule.java | 6 +- .../resource/syntax/operator/Operators.java | 10 +- .../PhasesLayerLayerControllerTest.java | 19 +- .../functional/FunctionalPatternTest.java | 1 - .../commons/collection/Component.java | 16 +- .../commons/function/CompletableOption.java | 70 ++++++ .../utilities/commons/function/Option.java | 4 +- .../commons/function/PandaStream.java | 22 +- .../utilities/commons/function/Produce.java | 62 ----- .../utilities/commons/function/Publisher.java | 7 + .../utilities/commons/function/Result.java | 8 + .../commons/function/Subscriber.java | 8 + ...keWhile.java => TakeWhileSpliterator.java} | 4 +- .../commons/function/ProduceTest.java | 66 ----- .../panda/bootstrap/PipelinesInitializer.java | 1 - .../interpreter/PandaInterpreter.java | 4 +- .../interpreter/parser/PandaContextUtils.java | 6 +- .../interpreter/parser/PandaPipeline.java | 3 +- .../interpreter/parser/PandaSourceReader.java | 79 ++++++ .../interpreter/parser/ParsersLoader.java | 1 - .../interpreter/parser/ScopeParser.java | 1 - .../parser/block/AutowiredBlockParser.java | 1 - .../interpreter/parser/block/BlockParser.java | 2 - .../language/resource/ResourcesLoader.java | 2 +- .../subparsers/ArgumentsParser.java | 1 - .../subparsers/ArrayInstanceExpression.java | 5 +- .../subparsers/CastExpressionSubparser.java | 1 - .../ConstructorExpressionSubparser.java | 22 +- .../expressions/subparsers/IsExpression.java | 2 +- .../subparsers/IsExpressionSubparser.java | 2 - .../LiteralExpressionSubparser.java | 1 - .../SequenceExpressionSubparser.java | 1 - .../subparsers/StaticExpressionSubparser.java | 1 - .../subparsers/SubparsersUtils.java | 17 +- .../VariableExpressionSubparser.java | 2 - .../AssignationExpressionSubparser.java | 1 - .../AutowiredAssignationParser.java | 1 - .../array/ArrayValueAccessorParser.java | 1 - .../array/ArrayValueAssignationSubparser.java | 2 - .../VariableAssignationSubparser.java | 2 - .../VariableDeclarationSubparser.java | 2 - .../subparsers/number/NumberParser.java | 1 - .../subparsers/operation/OperationParser.java | 1 - .../rpn/RPNOperationTransformer.java | 1 - .../ConcatenationOperatorSubparser.java | 1 - .../logical/ComparisonOperator.java | 4 +- .../logical/ComparisonOperatorAction.java | 2 +- .../subparsers/logical/EqualsToOperation.java | 4 +- .../subparsers/logical/OrOperation.java | 2 +- .../subparsers/math/MathOperation.java | 2 +- .../resource/syntax/head/CommentParser.java | 2 - .../resource/syntax/head/ConveyanceUtils.java | 1 - .../resource/syntax/head/ExportParser.java | 1 - .../resource/syntax/head/ImportParser.java | 2 - .../resource/syntax/head/MainParser.java | 1 - .../resource/syntax/head/ModuleParser.java | 73 +++--- .../resource/syntax/head/RequireParser.java | 5 +- .../syntax/scope/LateDeclarationParser.java | 1 - .../resource/syntax/scope/LogParser.java | 1 - .../scope/StandaloneExpressionParser.java | 2 - .../resource/syntax/scope/TryCatchParser.java | 1 - .../conditional/ConditionalBlockParser.java | 3 +- .../scope/block/looping/ForEachParser.java | 3 +- .../syntax/scope/block/looping/ForParser.java | 3 - .../scope/block/looping/LoopParser.java | 1 - .../scope/block/looping/WhileParser.java | 1 - .../syntax/scope/branching/BreakParser.java | 1 - .../scope/branching/ContinueParser.java | 1 - .../syntax/scope/branching/ReturnParser.java | 1 - .../syntax/scope/branching/ThrowParser.java | 1 - .../resource/syntax/type/BaseCallParser.java | 1 - .../syntax/type/ConstructorParser.java | 1 - .../resource/syntax/type/FieldParser.java | 6 +- .../resource/syntax/type/MethodParser.java | 6 +- .../resource/syntax/type/ParameterParser.java | 2 - .../syntax/type/SelfConstructorParser.java | 1 - .../resource/syntax/type/SignatureParser.java | 36 +++ .../resource/syntax/type/SignatureSource.java | 25 ++ .../resource/syntax/type/TypeParser.java | 238 +++++++++++------- .../resource/syntax/type/TypeParserUtils.java | 76 ------ .../org/panda_lang/panda/shell/repl/Repl.java | 1 - .../panda/shell/repl/ReplCreator.java | 2 - .../expression/ExpressionContextUtils.java | 6 +- .../ExpressionParserTestBootstrap.java | 2 - .../panda_lang/panda/shell/repl/ReplTest.java | 1 - 166 files changed, 1233 insertions(+), 1603 deletions(-) rename panda-framework/src/main/java/org/panda_lang/language/architecture/module/{PandaImportsUtils.java => ImportsUtils.java} (71%) delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleLoaderUtils.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResourceUtils.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImports.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypesMap.java rename panda-framework/src/main/java/org/panda_lang/language/architecture/module/{ModuleResource.java => TypeResolver.java} (60%) delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypesMap.java rename panda-framework/src/main/java/org/panda_lang/language/architecture/type/{TypeModels.java => Kind.java} (82%) create mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/type/Reference.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/type/StateComparator.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeComponents.java create mode 100644 panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeContext.java rename panda-framework/src/main/java/org/panda_lang/language/architecture/type/{ => member}/MemberInvoker.java (88%) delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/ParserFailure.java create mode 100644 panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/SourceReader.java delete mode 100644 panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/pool/Target.java create mode 100644 panda-utilities/src/main/java/org/panda_lang/utilities/commons/function/CompletableOption.java delete mode 100644 panda-utilities/src/main/java/org/panda_lang/utilities/commons/function/Produce.java create mode 100644 panda-utilities/src/main/java/org/panda_lang/utilities/commons/function/Publisher.java create mode 100644 panda-utilities/src/main/java/org/panda_lang/utilities/commons/function/Subscriber.java rename panda-utilities/src/main/java/org/panda_lang/utilities/commons/function/{PandaStreamTakeWhile.java => TakeWhileSpliterator.java} (92%) delete mode 100644 panda-utilities/src/test/groovy/org/panda_lang/utilities/commons/function/ProduceTest.java create mode 100644 panda/src/main/java/org/panda_lang/panda/language/interpreter/parser/PandaSourceReader.java create mode 100644 panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/SignatureParser.java create mode 100644 panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/SignatureSource.java delete mode 100644 panda/src/main/java/org/panda_lang/panda/language/resource/syntax/type/TypeParserUtils.java diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/AbstractScript.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/AbstractScript.java index 09d9cb9ac..99a72df69 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/AbstractScript.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/AbstractScript.java @@ -18,15 +18,17 @@ import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.architecture.statement.Statement; +import org.panda_lang.utilities.commons.function.CompletableOption; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; public abstract class AbstractScript implements Script { private final String scriptName; private final List statements = new ArrayList<>(); - protected Module associatedModule; + private final CompletableOption associatedModule = new CompletableOption<>(); public AbstractScript(String scriptName) { this.scriptName = scriptName; @@ -54,12 +56,8 @@ public void addStatement(Statement statement) { this.statements.add(statement); } - public void setModule(Module module) { - this.associatedModule = module; - } - @Override - public Module getModule() { + public CompletableOption getModule() { return associatedModule; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/Script.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/Script.java index 8a1a45bc2..4b8c24600 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/Script.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/Script.java @@ -18,6 +18,7 @@ import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.architecture.statement.Statement; +import org.panda_lang.utilities.commons.function.CompletableOption; import java.util.List; @@ -45,7 +46,7 @@ public interface Script { * * @return the module */ - Module getModule(); + CompletableOption getModule(); /** * Get script name diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/AbstractDynamicExpression.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/AbstractDynamicExpression.java index ece74cd11..c589af5b3 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/AbstractDynamicExpression.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/AbstractDynamicExpression.java @@ -16,18 +16,18 @@ package org.panda_lang.language.architecture.expression; -import org.panda_lang.language.architecture.type.Type; +import org.panda_lang.language.architecture.type.Signature; public abstract class AbstractDynamicExpression implements DynamicExpression { - private final Type returnType; + private final Signature returnType; - public AbstractDynamicExpression(Type returnType) { + public AbstractDynamicExpression(Signature returnType) { this.returnType = returnType; } @Override - public Type getReturnType() { + public Signature getReturnType() { return returnType; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/PandaExpression.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/PandaExpression.java index 63ba4660c..071ae6f69 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/PandaExpression.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/PandaExpression.java @@ -17,7 +17,6 @@ package org.panda_lang.language.architecture.expression; import org.panda_lang.language.architecture.type.Signature; -import org.panda_lang.language.architecture.type.Type; import org.panda_lang.language.runtime.ProcessStack; import java.security.InvalidParameterException; @@ -66,7 +65,7 @@ public ExpressionValueType getExpressionType() { @Override public String toString() { - String s = type.name() + ":" + (returnType != null ? returnType.getType().getSimpleName() : "any"); + String s = type.name() + ":" + (returnType != null ? returnType.getType() : "any"); return ExpressionValueType.CONST == type ? s + ":" + value : s; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/ThisExpression.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/ThisExpression.java index 10ca16d76..8eb3df672 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/ThisExpression.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/expression/ThisExpression.java @@ -20,7 +20,6 @@ import org.panda_lang.language.architecture.type.Type; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.runtime.ProcessStack; -import org.panda_lang.language.architecture.type.TypeComponents; import org.panda_lang.utilities.commons.ObjectUtils; public final class ThisExpression implements DynamicExpression { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Imports.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Imports.java index b2db656b8..fce30c7b2 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Imports.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Imports.java @@ -16,19 +16,43 @@ package org.panda_lang.language.architecture.module; +import org.panda_lang.language.PandaFrameworkException; +import org.panda_lang.language.architecture.type.Reference; import org.panda_lang.language.architecture.type.Type; +import org.panda_lang.utilities.commons.function.Option; +import org.panda_lang.utilities.commons.function.PandaStream; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * Represents references imported in the specific space, e.g. file */ -public interface Imports extends ModuleResource { +public final class Imports { + + private final TypeLoader typeLoader; + private final Map importedModules = new HashMap<>(); + private final Map importedTypes = new HashMap<>(); + + public Imports(TypeLoader typeLoader) { + this.typeLoader = typeLoader; + } /** * Import module using the given name * * @param name the name of module */ - void importModule(String name); + + public void importModule(String name) { + typeLoader.forModule(name) + .peek(module -> importedModules.put(name, module)) + .orThrow(() -> { + throw new PandaFrameworkException("Module " + name + " does not exist"); + }); + } /** * Import module @@ -36,21 +60,57 @@ public interface Imports extends ModuleResource { * @param module the module to import * // @return if type with the given name is already imported, the method will interrupt importing and return the name of that type */ - void importModule(Module module); + public void importModule(Module module) { + importedModules.putIfAbsent(module.getName(), module); + } /** * Import reference * * @param name the name of type to import as (may be different than type name) - * @param type the reference to type + * @param reference the reference to type * @return if type with the given name is already imported, the method will return false, otherwise true */ - boolean importType(String name, Type type); + public boolean importType(String name, Reference reference) { + reference.getType().then(typeLoader::load); + + if (importedTypes.containsKey(name)) { + return false; + } + + importedTypes.put(name, reference); + return true; + } + + public Option forType(String name) { + return Option.of(importedTypes.get(name)) + .orElse(() -> forModuleType(name)) + .map(Reference::getType) + .map(futureType -> futureType.orThrow(() -> { + throw new PandaFrameworkException("Parse error, cannot get type " + name); + })) + .peek(typeLoader::load); + } + + private Option forModuleType(String name) { + List references = PandaStream.of(importedModules.entrySet()) + .mapOpt(entry -> entry.getValue().get(name)) + .collect(Collectors.toList()); + + if (references.size() > 1) { + throw new PandaFrameworkException("Duplicated reference names: " + references); + } + + return references.isEmpty() ? Option.none() : Option.of(references.get(0)); + } /** * Get associated type loader * * @return the associated type loader */ - TypeLoader getTypeLoader(); + public TypeLoader getTypeLoader() { + return typeLoader; + } + } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImportsUtils.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ImportsUtils.java similarity index 71% rename from panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImportsUtils.java rename to panda-framework/src/main/java/org/panda_lang/language/architecture/module/ImportsUtils.java index 56d767d76..65b4cb50f 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImportsUtils.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ImportsUtils.java @@ -18,7 +18,6 @@ import org.jetbrains.annotations.Nullable; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.interpreter.parser.Components; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.interpreter.token.Snippet; import org.panda_lang.language.interpreter.token.Snippetable; @@ -29,15 +28,15 @@ import java.util.function.Function; import java.util.function.Supplier; -public final class PandaImportsUtils { +public final class ImportsUtils { - private PandaImportsUtils() { } + private ImportsUtils() { } - public static Type getTypeOrThrow(Context context, Snippetable nameSource, String message, String note) { + public static Type getTypeOrThrow(Context context, Snippetable nameSource, String message, String note) { String name = nameSource.toSnippet().asSource(); - return context.getComponent(Components.IMPORTS) - .forName(name) + return context.getImports() + .forType(name) .orThrow((Supplier) () -> { MessageFormatter formatter = new MessageFormatter(); formatter.register("{name}", name); @@ -46,12 +45,12 @@ public static Type getTypeOrThrow(Context context, Snippetable nameSource, Strin }); } - public static Type getTypeOrThrow(Context context, String className, @Nullable Snippet source) { - return getTypeOrThrow(context, imports -> imports.forName(className), "Unknown type " + className, source); + public static Type getTypeOrThrow(Context context, String className, @Nullable Snippet source) { + return getTypeOrThrow(context, imports -> imports.forType(className), "Unknown type " + className, source); } - private static Type getTypeOrThrow(Context context, Function> mapper, String message, Snippet source) { - return mapper.apply(context.getComponent(Components.IMPORTS)).orThrow(() -> { + private static Type getTypeOrThrow(Context context, Function> mapper, String message, Snippet source) { + return mapper.apply(context.getImports()).orThrow(() -> { throw new PandaParserFailure(context, source, message); }); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Module.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Module.java index cb9237d68..11799b721 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Module.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Module.java @@ -16,7 +16,7 @@ package org.panda_lang.language.architecture.module; -import org.panda_lang.language.architecture.type.Type; +import org.panda_lang.language.architecture.type.Reference; import org.panda_lang.utilities.commons.function.Option; import java.util.Collection; @@ -24,33 +24,31 @@ /** * Identifiable container of resources */ -public interface Module extends Modules, ModuleResource { +public interface Module extends Modules { /** * Add reference to type to the module * - * @param type the reference to add + * @param reference the reference to add * @return the added reference */ - Type add(Type type); + Reference add(Reference reference); /** - * Check if the given module is submodule of the current module + * Get reference if exists * - * @param module the module to check - * @return true if module is submodule, otherwise false + * @param name the name of reference + * @return the option with reference, otherwise none */ - boolean isSubmodule(Module module); + Option get(String name); /** - * Check if the module contains type associated with the specified class + * Check if the given module is submodule of the current module * - * @param clazz the class to check - * @return true if module contains type associated with the provided class + * @param module the module to check + * @return true if module is submodule, otherwise false */ - default boolean hasType(Class clazz) { - return forClass(clazz).isDefined(); - } + boolean hasSubmodule(Module module); /** * Check if the module contains a reference to type with the given name @@ -58,31 +56,30 @@ default boolean hasType(Class clazz) { * @param name the name to search for * @return true if module contains such a reference */ - default boolean hasType(CharSequence name) { - return forName(name).isDefined(); + default boolean hasType(String name) { + return get(name).isDefined(); } - /** - * Get all types (also from submodules) - * Iterable is used instead of collection because of the performance reasons. - * - * @return the iterable that contains all types - */ - Collection getAllTypes(); - /** * Get types that belongs to the module * * @return collection of types */ - Collection getTypes(); + Collection getReferences(); /** * Get parent module * * @return the parent module */ - Option getParent(); + Option getParent(); + + /** + * Get non prefixed name of module + * + * @return the simple name of module + */ + String getSimpleName(); /** * Get name of module diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleLoaderUtils.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleLoaderUtils.java deleted file mode 100644 index 886a296b4..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleLoaderUtils.java +++ /dev/null @@ -1,35 +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.architecture.module; - -import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.interpreter.parser.Components; -import org.panda_lang.language.interpreter.parser.Context; - -public final class ModuleLoaderUtils { - - private ModuleLoaderUtils() { } - - public static Type requireType(Context context, Class associatedClass) { - return context.getComponent(Components.TYPE_LOADER).requireType(associatedClass); - } - - public static Type requireType(Context context, String name) { - return context.getComponent(Components.TYPE_LOADER).requireType(name); - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModulePath.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModulePath.java index c98cf3037..e1663c3b7 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModulePath.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModulePath.java @@ -16,6 +16,8 @@ package org.panda_lang.language.architecture.module; +import jdk.internal.access.SharedSecrets; + /** * ModulePath is collection of all available modules */ @@ -29,4 +31,6 @@ public interface ModulePath extends Modules { */ void include(String name, Runnable initializer); + SharedSecrets. + } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResourceUtils.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResourceUtils.java deleted file mode 100644 index f642ef287..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResourceUtils.java +++ /dev/null @@ -1,41 +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.architecture.module; - -import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.utilities.commons.function.Option; -import org.panda_lang.utilities.commons.function.PandaStream; - -import java.util.Collection; - -final class ModuleResourceUtils { - - private ModuleResourceUtils() { } - - public static Option forClass(Collection resources, Class associatedClass) { - return PandaStream.of(resources) - .flatMap(parent -> parent.forClass(associatedClass)) - .head(); - } - - public static Option forName(Collection resources, CharSequence name) { - return PandaStream.of(resources) - .flatMap(parent -> parent.forName(name)) - .head(); - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Modules.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Modules.java index 63ed51afe..f9093c7d0 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Modules.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/Modules.java @@ -16,8 +16,8 @@ package org.panda_lang.language.architecture.module; -import org.panda_lang.utilities.commons.function.StreamUtils; import org.panda_lang.utilities.commons.function.Option; +import org.panda_lang.utilities.commons.function.StreamUtils; import java.util.Collection; @@ -31,14 +31,22 @@ public interface Modules { * * @param module the module to add */ - void include(Module module); + Module include(Module module); /** - * Allocates module with the given qualifier + * Allocates module with the given qualifier or * * @return a module with the given name */ - Module allocate(String moduleQualifier); + Module acquire(String moduleQualifier); + + /** + * Get module with the given name + * + * @param moduleQualifier the name of module + * @return the module + */ + Option forModule(String moduleQualifier); /** * Count used types @@ -58,14 +66,6 @@ default long countTypes() { return StreamUtils.sum(getModules(), Module::countTypes); } - /** - * Get module with the given name - * - * @param moduleQualifier the name of module - * @return the module - */ - Option get(String moduleQualifier); - /** * Get all names of modules * diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImports.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImports.java deleted file mode 100644 index f5390b3d7..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaImports.java +++ /dev/null @@ -1,98 +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.architecture.module; - -import org.jetbrains.annotations.Nullable; -import org.panda_lang.language.PandaFrameworkException; -import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.array.ArrayClassTypeFetcher; -import org.panda_lang.language.architecture.type.array.PandaArray; -import org.panda_lang.language.runtime.PandaRuntimeException; -import org.panda_lang.utilities.commons.function.Option; - -import java.util.HashMap; -import java.util.Map; - -public final class PandaImports implements Imports { - - private final ModulePath modulePath; - private final TypeLoader typeLoader; - private final Map importedModules = new HashMap<>(); - private final Map importedTypes = new HashMap<>(); - - public PandaImports(ModulePath modulePath, TypeLoader typeLoader) { - this.modulePath = modulePath; - this.typeLoader = typeLoader; - } - - @Override - public void importModule(String name) { - modulePath.get(name) - .peek(module -> { - typeLoader.load(module); - importedModules.put(name, module); - }) - .onEmpty(() -> { - throw new PandaFrameworkException("Module " + name + " does not exist"); - }); - } - - @Override - public void importModule(Module module) { - importedModules.putIfAbsent(module.getName(), module); - } - - @Override - public boolean importType(String name, Type type) { - type = typeLoader.load(type); - - if (importedTypes.containsKey(name)) { - return false; - } - - importedTypes.put(name, type); - return true; - } - - /** - * Imports does not support this method - * - * @param associatedClass the class associated with type to search for - * @return always empty optional - */ - @Override - public Option forClass(@Nullable Class associatedClass) { - throw new PandaRuntimeException("Not supported"); - } - - @Override - public Option forName(CharSequence name) { - if (name.toString().endsWith(PandaArray.IDENTIFIER)) { - return ArrayClassTypeFetcher.fetch(typeLoader, name.toString()); - } - - return Option.of(importedTypes.get(name.toString())) - .orElse(() -> ModuleResourceUtils.forName(importedModules.values(), name)) - .peek(typeLoader::load); - } - - @Override - public TypeLoader getTypeLoader() { - return typeLoader; - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModule.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModule.java index 3c1454b8f..a2ae2257d 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModule.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModule.java @@ -17,22 +17,23 @@ package org.panda_lang.language.architecture.module; import org.jetbrains.annotations.Nullable; -import org.panda_lang.language.architecture.type.Type; +import org.panda_lang.language.architecture.type.Reference; import org.panda_lang.utilities.commons.function.Option; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; public class PandaModule extends PandaModules implements Module { protected final String name; - protected final TypesMap types; - protected @Nullable final Module parent; + protected final Map types = new HashMap<>(32); + protected final @Nullable Module parent; - public PandaModule(Module parent, String name) { + public PandaModule(@Nullable Module parent, String name) { this.name = name; this.parent = parent; - this.types = new PandaTypesMap(); } public PandaModule(String name) { @@ -40,14 +41,14 @@ public PandaModule(String name) { } @Override - public Type add(Type type) { - types.put(type); - return type; + public Reference add(Reference reference) { + types.put(reference.getName(), reference); + return reference; } @Override public long countUsedTypes() { - return types.countUsedTypes(); + return types.size(); } @Override @@ -56,8 +57,8 @@ public long countTypes() { } @Override - public boolean isSubmodule(Module module) { - Option parentModule = module.getParent(); + public boolean hasSubmodule(Module module) { + Option parentModule = module.getParent(); while (parentModule.isDefined()) { Module parent = parentModule.get(); @@ -73,28 +74,12 @@ public boolean isSubmodule(Module module) { } @Override - public Option forClass(Class associatedClass) { - return types.forClass(associatedClass); + public Option get(String typeName) { + return Option.of(types.get(typeName)); } @Override - public Option forName(CharSequence typeName) { - return types.forName(typeName); - } - - @Override - public Collection getAllTypes() { - Collection entries = new ArrayList<>(types.values()); - - for (Module submodule : getModules()) { - entries.addAll(submodule.getAllTypes()); - } - - return entries; - } - - @Override - public Collection getTypes() { + public Collection getReferences() { return new ArrayList<>(types.values()); } @@ -104,13 +89,18 @@ public Option getParent() { } @Override - public String getName() { + public String getSimpleName() { return name; } @Override - public String toString() { + public String getName() { return (parent != null ? parent.toString() + ":" : "") + name; } + @Override + public String toString() { + return getName(); + } + } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModulePath.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModulePath.java index 26bd42a25..b4ea7eff4 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModulePath.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModulePath.java @@ -42,7 +42,7 @@ public void include(String name, Runnable initializer) { } @Override - public Option get(String moduleQualifier) { + public Option forModule(String moduleQualifier) { Runnable initialize = modulesInitializers.get(moduleQualifier); if (initialize != null) { @@ -50,7 +50,7 @@ public Option get(String moduleQualifier) { initialize.run(); } - return super.get(moduleQualifier); + return super.forModule(moduleQualifier); } } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModules.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModules.java index fe9e3eac5..7a330dd4b 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModules.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaModules.java @@ -17,8 +17,10 @@ package org.panda_lang.language.architecture.module; import org.panda_lang.language.PandaFrameworkException; +import org.panda_lang.language.architecture.type.Type; import org.panda_lang.utilities.commons.StringUtils; import org.panda_lang.utilities.commons.function.Option; +import org.panda_lang.utilities.commons.function.PandaStream; import java.util.Collection; import java.util.HashMap; @@ -29,12 +31,17 @@ abstract class PandaModules implements Modules { protected final Map modules = new HashMap<>(); @Override - public void include(Module module) { + public Module include(Module module) { modules.put(module.getName(), module); + return module; } @Override - public Option get(String moduleQualifier) { + public Option forModule(String moduleQualifier) { + if (moduleQualifier.contains("::")) { + throw new PandaFrameworkException("Cannot get module using qualifier with type operator"); + } + if (!moduleQualifier.contains(":")) { return Option.of(modules.get(moduleQualifier)); } @@ -43,7 +50,7 @@ public Option get(String moduleQualifier) { } @Override - public Module allocate(String moduleQualifier) { + public Module acquire(String moduleQualifier) { return fetch(moduleQualifier, true).orThrow(() -> { throw new PandaFrameworkException("Cannot create module " + moduleQualifier); }); @@ -59,7 +66,7 @@ protected Option fetch(String moduleQualifier, boolean compute) { throw new PandaFrameworkException("Illegal name " + moduleQualifier); } - Module nextModule = modules.get(name).getOrNull(); + Module nextModule = modules.forModule(name).getOrNull(); if (nextModule == null && compute) { nextModule = new PandaModule(module, name); @@ -77,6 +84,12 @@ protected Option fetch(String moduleQualifier, boolean compute) { return Option.of(module); } + public static Option forName(Collection resources, String name) { + return PandaStream.of(resources) + .flatMap(parent -> parent.forType(name)) + .head(); + } + @Override public Collection getNames() { return modules.keySet(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypeLoader.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypeLoader.java index 8ee22362a..722f3b48a 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypeLoader.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypeLoader.java @@ -16,31 +16,31 @@ package org.panda_lang.language.architecture.module; -import org.panda_lang.language.FrameworkController; -import org.panda_lang.language.architecture.type.generator.TypeGeneratorManager; -import org.panda_lang.utilities.commons.function.Option; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.array.ArrayClassTypeFetcher; -import org.panda_lang.language.architecture.type.array.PandaArray; +import org.panda_lang.utilities.commons.collection.Pair; +import org.panda_lang.utilities.commons.function.Option; +import org.panda_lang.utilities.commons.function.PandaStream; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; public final class PandaTypeLoader implements TypeLoader { private final Collection parents; - private final TypesMap loadedTypes = new PandaTypesMap(); - private final Collection loadedModules = new ArrayList<>(); - private final TypeGeneratorManager generator; + private final Map loadedTypes = new HashMap<>(1024); + private final ModulePath modulePath; - public PandaTypeLoader(FrameworkController controller, TypeLoader... parents) { + public PandaTypeLoader(ModulePath modulePath, TypeLoader... parents) { this.parents = Arrays.asList(parents); - this.generator = new TypeGeneratorManager(controller); + this.modulePath = modulePath; } @Override public Type load(Type type) { + loadedTypes.put(type.getName(), type); + if (!type.isInitialized()) { type.initialize(this); } @@ -49,37 +49,31 @@ public Type load(Type type) { } @Override - public Type load(Module module, Class type, String alias) { - return forClass(type).orElseGet(() -> generator.generate(module, alias, type)); + public Option forType(String type) { + return Option.of(loadedTypes.get(type)) + .orElse(() -> forParentType(type)) + .orElse(() -> forPathType(type)) + .peek(this::load); } - @Override - public void load(Module module) { - loadedModules.add(module); + private Option forParentType(String type) { + return PandaStream.of(parents) + .mapOpt(typeResolver -> typeResolver.forType(type)) + .any(); } - @Override - public Option forClass(Class associatedClass) { - if (associatedClass.isArray()) { - ArrayClassTypeFetcher.fetch(this, associatedClass); - } - - return loadedTypes.forClass(associatedClass) - .orElse(() -> ModuleResourceUtils.forClass(loadedModules, associatedClass)) - .orElse(() -> ModuleResourceUtils.forClass(parents, associatedClass)) - .peek(this::load); + private Option forPathType(String type) { + return Option.of(type) + .map(name -> name.split("::")) + .filter(elements -> elements.length == 2) + .map(elements -> new Pair<>(modulePath.forModule(elements[0]), elements[1])) + .filter(pair -> pair.getKey().isDefined()) + .flatMap(pair -> pair.getKey().get().forType(pair.getValue())); } @Override - public Option forName(CharSequence typeName) { - if (typeName.toString().endsWith(PandaArray.IDENTIFIER)) { - return ArrayClassTypeFetcher.fetch(this, typeName.toString()); - } - - return loadedTypes.forName(typeName) - .orElse(() -> ModuleResourceUtils.forName(loadedModules, typeName)) - .orElse(() -> ModuleResourceUtils.forName(parents, typeName)) - .peek(this::load); + public Option forModule(String moduleName) { + return null; } } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypesMap.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypesMap.java deleted file mode 100644 index 0a3993a4c..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/PandaTypesMap.java +++ /dev/null @@ -1,75 +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.architecture.module; - -import org.panda_lang.language.architecture.type.DynamicClass; -import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.utilities.commons.ClassUtils; -import org.panda_lang.utilities.commons.function.Option; -import org.panda_lang.utilities.commons.function.PandaStream; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -final class PandaTypesMap extends HashMap implements TypesMap { - - private final Map associatedClasses = new HashMap<>(); - - @Override - public boolean put(Type type) { - if (associatedClasses.containsKey(type.getAssociatedClass()) || containsKey(type.getSimpleName())) { - return false; - } - - super.put(type.getSimpleName(), type); - associatedClasses.put(type.getAssociatedClass(), type.getSimpleName()); - return true; - } - - @Override - public long countUsedTypes() { - return PandaStream.of(entrySet()).count(entry -> entry.getValue().isInitialized()); - } - - @Override - public Option forClass(Class associatedClass) { - return get(associatedClass) - .flatMap(this::forName) - .orElse(() -> associatedClass.isPrimitive() ? forClass(ClassUtils.getNonPrimitiveClass(associatedClass)) : Option.none()); - } - - @Override - public Option forName(CharSequence typeName) { - return Option.of(get(typeName.toString())); - } - - private Option get(Class associatedClass) { - return PandaStream.of(associatedClasses.entrySet()) - .find(entry -> entry.getKey().fetchStructure().equals(associatedClass)) - .map(Entry::getValue); - } - - @Override - @SuppressWarnings("unchecked") - public Collection> getTypes() { - Object sharedSet = entrySet(); // due to javac 1.8 bug - return new HashSet<>((Collection>) sharedSet); - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeLoader.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeLoader.java index 86877a1be..7f572a4fb 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeLoader.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeLoader.java @@ -18,7 +18,7 @@ import org.panda_lang.language.architecture.type.Type; -public interface TypeLoader extends ModuleResource { +public interface TypeLoader extends TypeResolver { /** * Load type by this loader @@ -28,32 +28,4 @@ public interface TypeLoader extends ModuleResource { */ Type load(Type type); - /** - * Load java class as panda type - * - * @param module the associated with type module - * @param type the class to load - * @return loaded type - */ - default Type load(Module module, Class type) { - return load(module, type, type.getSimpleName()); - } - - /** - * Load java class as panda type - * - * @param module the associated with type module - * @param type the class to load - * @param alias the alias name for class type - * @return loaded type - */ - Type load(Module module, Class type, String alias); - - /** - * Load all types that belongs to the given module - * - * @param module the module to load - */ - void load(Module module); - } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResource.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeResolver.java similarity index 60% rename from panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResource.java rename to panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeResolver.java index 274b82c29..432dc751c 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/ModuleResource.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypeResolver.java @@ -23,21 +23,15 @@ /** * References container */ -public interface ModuleResource { +public interface TypeResolver { /** - * Get type associated with the given class. - * Use this method only if you are absolutely sure that the requested type exists + * Find reference using the given name * - * @param associatedClass the associated class to search for - * @return the found type - * @throws org.panda_lang.language.runtime.PandaRuntimeException if type does not exist + * @param typeName the name to search for + * @return the reference */ - default Type requireType(Class associatedClass) throws PandaRuntimeException { - return forClass(associatedClass).orThrow(() -> { - throw new PandaRuntimeException("Cannot find type associated with " + associatedClass); - }); - } + Option forType(String typeName); /** * Get type with the given name. @@ -48,25 +42,11 @@ default Type requireType(Class associatedClass) throws PandaRuntimeException * @throws org.panda_lang.language.runtime.PandaRuntimeException if type does not exist */ default Type requireType(String name) throws PandaRuntimeException { - return forName(name).orThrow(() -> { + return forType(name).orThrow(() -> { throw new PandaRuntimeException("Cannot find type " + name); }); } - /** - * Find reference using the given class - * - * @param associatedClass the class associated with type to search for - * @return the reference - */ - Option forClass(Class associatedClass); - - /** - * Find reference using the given name - * - * @param typeName the name to search for - * @return the reference - */ - Option forName(CharSequence typeName); + Option forModule(String moduleName); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypesMap.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypesMap.java deleted file mode 100644 index 4650c3013..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/module/TypesMap.java +++ /dev/null @@ -1,51 +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.architecture.module; - -import org.panda_lang.language.architecture.type.Type; - -import java.util.Collection; -import java.util.Map; - -/** - * Custom implementation of map to store types with support for associated classes and {@link org.panda_lang.language.architecture.module.ModuleResource} - */ -public interface TypesMap extends Map, ModuleResource { - - /** - * Add reference to map - * - * @param type the reference to add - * @return false if a name or type is already stored, otherwise true - */ - boolean put(Type type); - - /** - * Count used types - * - * @return the amount of used types - */ - long countUsedTypes(); - - /** - * Get collection of entries that contains types - * - * @return the collection of types - */ - Collection> getTypes(); - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/statement/PandaVariableDataInitializer.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/statement/PandaVariableDataInitializer.java index a02f834af..d44879210 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/statement/PandaVariableDataInitializer.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/statement/PandaVariableDataInitializer.java @@ -16,7 +16,6 @@ package org.panda_lang.language.architecture.statement; -import org.panda_lang.language.interpreter.parser.Components; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.interpreter.token.Snippet; import org.panda_lang.language.interpreter.token.Snippetable; diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Adjustment.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Adjustment.java index a2e02f61c..122827d1c 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Adjustment.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Adjustment.java @@ -16,6 +16,7 @@ package org.panda_lang.language.architecture.type; +import org.jetbrains.annotations.Nullable; import org.panda_lang.language.architecture.expression.Expression; import org.panda_lang.language.architecture.type.member.Member; @@ -24,20 +25,33 @@ * * @param generic type of property */ -public interface Adjustment { +public class Adjustment { + + private final T executable; + private final Expression[] arguments; + + public Adjustment(T executable, @Nullable Expression[] arguments) { + this.executable = executable; + this.arguments = arguments; + } /** * Get adjusted arguments * * @return the array of arguments */ - Expression[] getArguments(); + public Expression[] getArguments() { + return arguments; + + } /** * Get associated parametrized executable * * @return the executable */ - T getExecutable(); + public T getExecutable() { + return executable; + } } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Autocast.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Autocast.java index 67847a9cc..cca945819 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Autocast.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Autocast.java @@ -16,7 +16,6 @@ package org.panda_lang.language.architecture.type; - @FunctionalInterface public interface Autocast { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeModels.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Kind.java similarity index 82% rename from panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeModels.java rename to panda-framework/src/main/java/org/panda_lang/language/architecture/type/Kind.java index 4ea8ba27c..177eba6e7 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeModels.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Kind.java @@ -16,22 +16,26 @@ package org.panda_lang.language.architecture.type; -public final class TypeModels { +public final class Kind { public static final String CLASS = "class"; + public static final String INTERFACE = "interface"; + public static final String ENUM = "enum"; - public static final String INTERFACE = "interface"; + public static final String STRUCT = "struct"; + + public static final String TRAIT = "trait"; - private TypeModels() { } + private Kind() { } public static boolean isClass(Type type) { - return CLASS.equals(type.getModel()); + return CLASS.equals(type.getKind()); } public static boolean isInterface(Type type) { - return INTERFACE.equals(type.getModel()); + return INTERFACE.equals(type.getKind()); } public static String of(Class clazz) { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaType.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaType.java index f6c70c4f1..dff32a111 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaType.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaType.java @@ -21,22 +21,22 @@ import org.panda_lang.language.architecture.expression.ExpressionUtils; import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.architecture.module.TypeLoader; -import org.panda_lang.language.architecture.type.array.ArrayClassTypeFetcher; -import org.panda_lang.language.architecture.type.generator.dynamic.PandaDynamicClass; import org.panda_lang.language.architecture.type.member.AbstractMetadata; -import org.panda_lang.language.architecture.type.member.constructor.Constructors; import org.panda_lang.language.architecture.type.member.Member; -import org.panda_lang.language.architecture.type.member.field.Fields; -import org.panda_lang.language.architecture.type.member.method.Methods; -import org.panda_lang.language.architecture.type.member.constructor.PandaConstructors; -import org.panda_lang.language.architecture.type.member.field.PandaFields; -import org.panda_lang.language.architecture.type.member.method.PandaMethods; import org.panda_lang.language.architecture.type.member.Members; +import org.panda_lang.language.architecture.type.member.constructor.Constructors; +import org.panda_lang.language.architecture.type.member.constructor.PandaConstructors; import org.panda_lang.language.architecture.type.member.constructor.TypeConstructor; +import org.panda_lang.language.architecture.type.member.field.Fields; +import org.panda_lang.language.architecture.type.member.field.PandaFields; import org.panda_lang.language.architecture.type.member.field.TypeField; +import org.panda_lang.language.architecture.type.member.method.Methods; +import org.panda_lang.language.architecture.type.member.method.PandaMethods; import org.panda_lang.language.architecture.type.member.method.TypeMethod; import org.panda_lang.utilities.commons.ValidationUtils; +import org.panda_lang.utilities.commons.function.CompletableOption; import org.panda_lang.utilities.commons.function.Option; +import org.panda_lang.utilities.commons.function.PandaStream; import java.util.ArrayList; import java.util.Collection; @@ -49,30 +49,25 @@ public class PandaType extends AbstractMetadata implements Type { protected final Module module; - protected final String model; + protected final String kind; protected final State state; - protected final DynamicClass associated; - protected final Collection bases = new ArrayList<>(1); + protected final CompletableOption> associated; + protected final List bases; protected final Map> autocasts = new HashMap<>(); - protected final List> initializers = new ArrayList<>(2); protected final Fields fields = new PandaFields(this); protected final Constructors constructors = new PandaConstructors(this); protected final Methods methods = new PandaMethods(this); + protected final List> initializers = new ArrayList<>(2); protected TypeLoader typeLoader; public PandaType(PandaTypeMetadata metadata) { super(metadata.name, metadata.location, metadata.visibility, metadata.isNative); this.module = ValidationUtils.notNull(metadata.module, "Type needs module"); - this.model = ValidationUtils.notNull(metadata.model, "Type requires defined model"); + this.kind = ValidationUtils.notNull(metadata.kind, "The kind of type is not defined"); this.state = ValidationUtils.notNull(metadata.state, "State of type is missing"); - - if (metadata.javaType == null) { - this.associated = new PandaDynamicClass(this, getName(), getModule().getName(), getModel()); - } - else { - this.associated = new PandaDynamicClass(this, metadata.javaType); - } + this.associated = ValidationUtils.notNull(metadata.associatedType, "Associated type is missing"); + this.bases = ValidationUtils.notNull(metadata.bases, "Bases are not defined"); } @Override @@ -106,14 +101,21 @@ public void initialize(TypeLoader typeLoader) { } @Override - public void addBase(Type baseType) { - bases.add(baseType); - associated.append(baseType); + public void addAutocast(Type to, Autocast autocast) { + if (isInitialized()) { + throw new IllegalStateException("Cannot add autocast to initialized type"); + } + + autocasts.put(to, autocast); } @Override - public void addAutocast(Type to, Autocast autocast) { - autocasts.put(to, autocast); + public void addBase(Signature baseSignature) { + if (isInitialized()) { + throw new IllegalStateException("Cannot add base type to initialized type"); + } + + bases.add(baseSignature); } @Override @@ -126,46 +128,28 @@ public void addInitializer(Initializer staticInitializer) { } } - @Override - public Type toArray(TypeLoader loader) { - return ArrayClassTypeFetcher.getArrayOf(typeLoader, this, 1); - } - @Override public int hashCode() { return Objects.hash(getModule(), getSimpleName()); } @Override - public boolean equals(@Nullable Object o) { - return this == o; + public boolean equals(@Nullable Object to) { + return this == to; } @Override - public boolean isAssignableFrom(@Nullable Type to) { - if (to == null) { - return true; - } - - return to.equals(this) - || getAssociatedClass().isAssignableFrom(to.getAssociatedClass()) - || hasCommonTypes(bases, to) + public boolean isAssignableFrom(Type to) { + return getSignature().isAssignableFrom(to.getSignature()) + || hasCommonTypes(to) || to.getAutocast(this).isPresent(); } - private boolean hasCommonTypes(Collection fromTypes, Type to) { - for (Type from : fromTypes) { - if (to.equals(from) || to.getAssociatedClass().isAssignableFrom(from.getAssociatedClass())) { - return true; - } - } - - return false; - } - - @Override - public boolean isArray() { - return false; + private boolean hasCommonTypes(Type to) { + return PandaStream.of(bases) + .map(Signature::getPrimaryType) + .find(from -> from.equals(to) || to.isAssignableFrom(from)) + .isDefined(); } @Override @@ -193,13 +177,9 @@ else if (TypeField.class.isAssignableFrom(propertyType)) { @Override public Option> getAutocast(Type to) { - for (Entry> autocastEntry : autocasts.entrySet()) { - if (to.isAssignableFrom(autocastEntry.getKey())) { - return Option.of(autocastEntry.getValue()); - } - } - - return Option.none(); + return PandaStream.of(autocasts.entrySet()) + .find(autocastEntry -> to.isAssignableFrom(autocastEntry.getKey())) + .map(Entry::getValue); } @Override @@ -218,19 +198,13 @@ public Constructors getConstructors() { } @Override - public Collection getBases() { + public Collection getBases() { return bases; } @Override - public Option getSuperclass() { - for (Type base : getBases()) { - if (TypeModels.isClass(base)) { - return Option.of(base); - } - } - - return Option.none(); + public Option getSuperclass() { + return PandaStream.of(getBases()).find(base -> Kind.isClass(base.getType().get())); } @Override @@ -239,17 +213,17 @@ public State getState() { } @Override - public String getModel() { - return model; + public String getKind() { + return kind; } @Override - public Type getType() { - return this; + public Signature getSignature() { + return null; } @Override - public DynamicClass getAssociatedClass() { + public CompletableOption> getAssociated() { return associated; } @@ -263,6 +237,11 @@ public Module getModule() { return module; } + @Override + public String getName() { + return getModule().getName() + "::" + getSimpleName(); + } + @Override public String toString() { return getName(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaTypeMetadata.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaTypeMetadata.java index bd549adfa..29da31a83 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaTypeMetadata.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/PandaTypeMetadata.java @@ -19,14 +19,19 @@ import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.interpreter.source.Location; import org.panda_lang.language.interpreter.source.PandaClassSource; +import org.panda_lang.utilities.commons.function.CompletableOption; + +import java.util.List; public class PandaTypeMetadata, TYPE extends PandaType> { protected String name; + protected Signature signature; protected Module module; protected Location location; - protected Class javaType; - protected String model = TypeModels.CLASS; + protected CompletableOption> associatedType; + protected List bases; + protected String kind = Kind.CLASS; protected State state = State.DEFAULT; protected Visibility visibility = Visibility.OPEN; protected boolean isNative; @@ -38,6 +43,11 @@ public BUILDER name(String name) { return getThis(); } + public BUILDER signature(Signature signature) { + this.signature = signature; + return getThis(); + } + public BUILDER module(Module module) { this.module = module; return getThis(); @@ -52,18 +62,18 @@ public BUILDER location(Class javaType) { return location(new PandaClassSource(javaType).toLocation()); } - public BUILDER javaType(Class javaType) { - this.javaType = javaType; - - if (name == null) { - this.name = javaType.getSimpleName(); - } + public BUILDER associatedType(CompletableOption> associatedType) { + this.associatedType = associatedType; + return getThis(); + } + public BUILDER bases(List bases) { + this.bases = bases; return getThis(); } - public BUILDER model(String model) { - this.model = model; + public BUILDER kind(String kind) { + this.kind = kind; return getThis(); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Reference.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Reference.java new file mode 100644 index 000000000..e973aa7e5 --- /dev/null +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Reference.java @@ -0,0 +1,57 @@ +package org.panda_lang.language.architecture.type; + +import org.panda_lang.language.architecture.module.Module; +import org.panda_lang.language.interpreter.source.Location; +import org.panda_lang.utilities.commons.function.CompletableOption; + +public class Reference { + + private final CompletableOption type; + private final String name; + private final Module module; + private final Visibility visibility; + private final String kind; + private final Location location; + + public Reference(CompletableOption type, Module module, String name, Visibility visibility, String kind, Location location) { + this.type = type; + this.name = name; + this.module = module; + this.visibility = visibility; + this.kind = kind; + this.location = location; + } + + public boolean isLoaded() { + return type.isReady(); + } + + public CompletableOption getType() { + return type; + } + + public String getName() { + return module.getName() + "::" + getSimpleName(); + } + + public Module getModule() { + return module; + } + + public String getSimpleName() { + return name; + } + + public Visibility getVisibility() { + return visibility; + } + + public String getKind() { + return kind; + } + + public Location getLocation() { + return location; + } + +} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Signature.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Signature.java index d850e6578..3708560df 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Signature.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Signature.java @@ -1,5 +1,6 @@ package org.panda_lang.language.architecture.type; +import org.panda_lang.language.architecture.module.TypeLoader; import org.panda_lang.utilities.commons.function.Result; import org.panda_lang.utilities.commons.text.ContentJoiner; @@ -13,11 +14,13 @@ public enum Relation { SUPER } + private final TypeLoader typeLoader; private final Result type; private final Signature[] generics; private final Relation relation; - public Signature(Result type, Signature[] generics, Relation relation) { + public Signature(TypeLoader typeLoader, Result type, Signature[] generics, Relation relation) { + this.typeLoader = typeLoader; this.type = type; this.generics = generics; this.relation = relation; @@ -96,6 +99,14 @@ public String toString() { return getType().map(Type::getSimpleName).getAny() + "<" + ContentJoiner.on(" & ").join(generics) + ">"; } + public Type getPrimaryType() { + return getType() + .orElseGet(abstractSignature -> abstractSignature.getExtendsSignature() + .orElse(abstractSignature::getSupersSignature) + .map(Signature::getPrimaryType) + .orElseGet(() -> typeLoader.requireType("panda::Object"))); + } + public Relation getRelation() { return relation; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/SignatureMatcher.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/SignatureMatcher.java index 04640536e..fcb518658 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/SignatureMatcher.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/SignatureMatcher.java @@ -152,26 +152,4 @@ public Object evaluate(ProcessStack stack, Object instance) throws Exception { return new ResultAdjustment<>(executable, fixedArguments); } - public static final class ResultAdjustment implements Adjustment { - - private final R executable; - private final Expression[] arguments; - - private ResultAdjustment(R executable, @Nullable Expression[] arguments) { - this.executable = executable; - this.arguments = arguments; - } - - @Override - public @Nullable Expression[] getArguments() { - return arguments; - } - - @Override - public R getExecutable() { - return executable; - } - - } - } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/State.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/State.java index 108db2f82..a855df05c 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/State.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/State.java @@ -16,6 +16,9 @@ package org.panda_lang.language.architecture.type; +import org.panda_lang.language.interpreter.parser.Context; +import org.panda_lang.language.interpreter.parser.PandaParserFailure; +import org.panda_lang.language.interpreter.token.Snippetable; import org.panda_lang.language.resource.syntax.keyword.Keywords; import java.lang.reflect.Modifier; @@ -101,4 +104,16 @@ public static State of(String state) { return state.equals(Keywords.CLASS.getValue()) ? State.DEFAULT : State.ABSTRACT; } + public static void requireInstantiation(Context context, Type type, Snippetable source) { + if (!type.getState().canBeInstantiated()) { + throw new PandaParserFailure(context, source, "Cannot create instance of abstract type"); + } + } + + public static void requireInheritance(Context context, Type type, Snippetable source) { + if (!type.getState().canBeInherited()) { + throw new PandaParserFailure(context, source, "Cannot inherit final type"); + } + } + } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/StateComparator.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/StateComparator.java deleted file mode 100644 index 845544e90..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/StateComparator.java +++ /dev/null @@ -1,43 +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.architecture.type; - -import org.panda_lang.language.interpreter.parser.Context; -import org.panda_lang.language.interpreter.parser.PandaParserFailure; -import org.panda_lang.language.interpreter.token.Snippetable; - -public final class StateComparator { - - private StateComparator() { } - - public static boolean requireInstantiation(Context context, Type type, Snippetable source) { - if (type.getState().canBeInstantiated()) { - return true; - } - - throw new PandaParserFailure(context, source, "Cannot create instance of abstract type"); - } - - public static boolean requireInheritance(Context context, Type type, Snippetable source) { - if (type.getState().canBeInherited()) { - return true; - } - - throw new PandaParserFailure(context, source, "Cannot inherit final type"); - } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Type.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Type.java index 5dcac106d..9d4d759bc 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Type.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/Type.java @@ -16,15 +16,14 @@ package org.panda_lang.language.architecture.type; -import org.jetbrains.annotations.Nullable; -import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.architecture.module.TypeLoader; -import org.panda_lang.language.architecture.type.member.constructor.Constructors; import org.panda_lang.language.architecture.type.member.Member; -import org.panda_lang.language.architecture.type.member.field.Fields; -import org.panda_lang.language.architecture.type.member.method.Methods; import org.panda_lang.language.architecture.type.member.Members; import org.panda_lang.language.architecture.type.member.Metadata; +import org.panda_lang.language.architecture.type.member.constructor.Constructors; +import org.panda_lang.language.architecture.type.member.field.Fields; +import org.panda_lang.language.architecture.type.member.method.Methods; +import org.panda_lang.utilities.commons.function.CompletableOption; import org.panda_lang.utilities.commons.function.Option; import java.util.Collection; @@ -39,20 +38,12 @@ public interface Type extends Metadata { */ void initialize(TypeLoader typeLoader); - /** - * Get type to the array type of this type - * - * @param typeLoader the loader to use - * @return the array type - */ - Type toArray(TypeLoader typeLoader); - /** * Inherit the given type * * @param baseType the type to inherit from */ - void addBase(Type baseType); + void addBase(Signature baseType); /** * Support automatic casting to other type @@ -75,14 +66,7 @@ public interface Type extends Metadata { * @param type to compare with * @return true if this type is assignable from the given declaration, otherwise false */ - boolean isAssignableFrom(@Nullable Type type); - - /** - * Check if the type represents array type - * - * @return true if the type represents array type, otherwise false - */ - boolean isArray(); + boolean isAssignableFrom(Type type); /** * Check if the type has been initialized @@ -119,7 +103,7 @@ public interface Type extends Metadata { * @param generic type that represents the property type * @return the properties */ - Option> getProperties(Class propertyType); + Option> getProperties(Class propertyType); /** * Get autocast for the given type @@ -127,28 +111,28 @@ public interface Type extends Metadata { * @param to the type to search for * @return the autocast */ - Option> getAutocast(Type to); + Option> getAutocast(Type to); /** * Get supertypes of type * * @return collection of supertypes */ - Collection getBases(); + Collection getBases(); /** * Get super class * * @return the superclass */ - Option getSuperclass(); + Option getSuperclass(); /** * Get Java class associated with the type * * @return the associated class */ - DynamicClass getAssociatedClass(); + CompletableOption> getAssociated(); /** * Get state of type @@ -162,33 +146,13 @@ public interface Type extends Metadata { * * @return the model that represents type */ - String getModel(); + String getKind(); /** * Get loader that loaded this type * * @return a type loader */ - Option getTypeLoader(); - - /** - * Get associated module - * - * @return the associated module - */ - @Override - Module getModule(); - - /** - * Get simple name of property (without extra data) - * - * @return the name - */ - String getSimpleName(); - - @Override - default String getName() { - return getModule().getName() + "::" + getSimpleName(); - } + Option getTypeLoader(); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeComponents.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeComponents.java deleted file mode 100644 index d1ed6b06e..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeComponents.java +++ /dev/null @@ -1,29 +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.architecture.type; - -import org.panda_lang.language.interpreter.parser.ContextComponent; - -public final class TypeComponents { - - public static final ContextComponent PROTOTYPE = ContextComponent.of("type", Type.class); - - public static final ContextComponent PROTOTYPE_SCOPE = ContextComponent.of("type-scope", TypeScope.class); - - private TypeComponents() { } - -} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeContext.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeContext.java new file mode 100644 index 000000000..d407208e6 --- /dev/null +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeContext.java @@ -0,0 +1,21 @@ +package org.panda_lang.language.architecture.type; + +public final class TypeContext { + + private final Type type; + private final TypeScope scope; + + public TypeContext(Type type, TypeScope scope) { + this.type = type; + this.scope = scope; + } + + public TypeScope getScope() { + return scope; + } + + public Type getType() { + return type; + } + +} diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeScope.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeScope.java index 68d6dbfdc..9a2bc3bd0 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeScope.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypeScope.java @@ -77,9 +77,9 @@ private Constructor getConstructor(Class[] parameterT parameterTypes = ArrayUtils.merge(TypeFrame.class, parameterTypes, Class[]::new); try { - return (Constructor) type.getAssociatedClass().fetchImplementation().getConstructor(parameterTypes); + return (Constructor) type.getAssociated().fetchImplementation().getConstructor(parameterTypes); } catch (NoSuchMethodException e) { - throw new PandaFrameworkException(type.getAssociatedClass().fetchImplementation() + " does not implement " + Arrays.toString(parameterTypes) + " constructor"); + throw new PandaFrameworkException(type.getAssociated().fetchImplementation() + " does not implement " + Arrays.toString(parameterTypes) + " constructor"); } } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypedUtils.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypedUtils.java index a54392548..eef0b5420 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypedUtils.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/TypedUtils.java @@ -44,7 +44,7 @@ public static Class[] toClasses(Signed... signed) { public static Class[] toClasses(Collection typed) { return toTypesStream(typed) - .map(type -> type.getAssociatedClass().fetchStructure()) + .map(type -> type.getAssociated().fetchStructure()) .toArray(Class[]::new); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/VisibilityComparator.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/VisibilityComparator.java index c1caeb1d8..f47bba582 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/VisibilityComparator.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/VisibilityComparator.java @@ -19,7 +19,6 @@ import org.jetbrains.annotations.Nullable; import org.panda_lang.language.architecture.module.Module; import org.panda_lang.language.architecture.type.member.Metadata; -import org.panda_lang.language.interpreter.parser.Components; import org.panda_lang.language.interpreter.parser.Context; import org.panda_lang.language.interpreter.parser.PandaParserFailure; import org.panda_lang.language.interpreter.source.Source; @@ -49,7 +48,7 @@ public static Option canAccess(Metadata requested, Module currentModule, if (requested.getVisibility() == Visibility.SHARED) { Module requestedModule = requested.getType().getModule(); - if (currentModule.equals(requestedModule) || requestedModule.isSubmodule(currentModule)) { + if (currentModule.equals(requestedModule) || requestedModule.hasSubmodule(currentModule)) { return Option.none(); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeConstants.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeConstants.java index 3f78e6ce2..2ea45f2a9 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeConstants.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeConstants.java @@ -33,14 +33,14 @@ final class ArrayClassTypeConstants { protected static final Function SIZE = loader -> PandaMethod.builder() .name("size") .location(LOCATION) - .returnType(loader.requireType(Integer.class)) + .returnType(loader.requireType("Int")) .customBody((typeMethod, branch, instance, arguments) -> ((Object[]) Objects.requireNonNull(instance)).length) .build(); protected static final Function AS_STRING = loader -> PandaMethod.builder() .name("asString") .location(LOCATION) - .returnType(loader.requireType(String.class)) + .returnType(loader.requireType("String")) .customBody((typeMethod, branch, instance, arguments) -> Arrays.toString((Object[]) instance)) .isNative(true) .build(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeFetcher.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeFetcher.java index 1c4764a1a..9d5546f17 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeFetcher.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayClassTypeFetcher.java @@ -45,7 +45,7 @@ public static Option fetch(TypeLoader typeLoader, String typeName) { return Option.of(ARRAY_PROTOTYPES.get(typeName)) .orElse(() -> { String arrayType = StringUtils.replace(typeName, PandaArray.IDENTIFIER, StringUtils.EMPTY); - return typeLoader.forName(arrayType); + return typeLoader.forType(arrayType); }) .map(type -> { int dimensions = StringUtils.countOccurrences(typeName, PandaArray.IDENTIFIER); @@ -54,7 +54,7 @@ public static Option fetch(TypeLoader typeLoader, String typeName) { } public static Type getArrayOf(TypeLoader typeLoader, Type baseType, int dimensions) { - Class componentType = ArrayUtils.getDimensionalArrayType(baseType.getAssociatedClass().fetchStructure(), dimensions); + Class componentType = ArrayUtils.getDimensionalArrayType(baseType.getAssociated().fetchStructure(), dimensions); Class arrayClass = ArrayUtils.getArrayClass(componentType); Module module = baseType.getModule(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayType.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayType.java index 02f19167a..f04de441e 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayType.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/array/ArrayType.java @@ -34,8 +34,8 @@ public ArrayType(Module module, String name, Class associated, Type type) { .module(module) .name(name) .location(associated) - .javaType(associated) - .model(type.getModel()) + .associatedType(associated) + .kind(type.getKind()) .state(type.getState()) .visibility(Visibility.OPEN) ); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/MethodGenerator.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/MethodGenerator.java index 211d9e086..0b47022a4 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/MethodGenerator.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/MethodGenerator.java @@ -21,7 +21,7 @@ import org.panda_lang.language.architecture.type.member.method.PandaMethod; import org.panda_lang.language.architecture.type.member.parameter.PropertyParameter; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.MemberInvoker; +import org.panda_lang.language.architecture.type.member.MemberInvoker; import org.panda_lang.language.architecture.type.member.method.TypeMethod; import org.panda_lang.language.runtime.PandaRuntimeException; diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/TypeGenerator.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/TypeGenerator.java index e48ab99da..1e6b04352 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/TypeGenerator.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/TypeGenerator.java @@ -22,7 +22,7 @@ import org.panda_lang.language.architecture.module.TypeLoader; import org.panda_lang.language.architecture.type.State; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.TypeModels; +import org.panda_lang.language.architecture.type.Kind; import org.panda_lang.language.architecture.type.Visibility; import org.panda_lang.language.architecture.type.PandaType; import org.panda_lang.language.interpreter.source.PandaClassSource; @@ -53,10 +53,10 @@ protected Type generate(Module module, String name, Class javaType) { Type type = PandaType.builder() .name(name) .module(module) - .javaType(javaType) + .associatedType(javaType) .isNative(true) .location(new PandaClassSource(javaType).toLocation()) - .model(TypeModels.of(javaType)) + .kind(Kind.of(javaType)) .state(State.of(javaType)) .visibility(Visibility.OPEN) .build(); diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/DynamicClassGenerator.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/DynamicClassGenerator.java index 887f0b38d..18a7cde17 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/DynamicClassGenerator.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/DynamicClassGenerator.java @@ -25,7 +25,7 @@ import org.panda_lang.language.architecture.type.Type; import org.panda_lang.language.architecture.type.member.constructor.TypeConstructor; import org.panda_lang.language.architecture.type.member.method.TypeMethod; -import org.panda_lang.language.architecture.type.TypeModels; +import org.panda_lang.language.architecture.type.Kind; import org.panda_lang.language.architecture.type.member.constructor.BaseCall; import org.panda_lang.language.architecture.type.TypeFrame; import org.panda_lang.language.architecture.type.TypeInstance; @@ -54,7 +54,7 @@ final class DynamicClassGenerator { DynamicClassGenerator(Type type, CtClass generatedStructure) { this.type = type; this.generatedStructure = generatedStructure; - this.isInterface = TypeModels.isInterface(type); + this.isInterface = Kind.isInterface(type); } protected void generateDeclaration() { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/PandaDynamicClass.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/PandaDynamicClass.java index 618cfb78f..7edf33cf5 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/PandaDynamicClass.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/generator/dynamic/PandaDynamicClass.java @@ -20,7 +20,7 @@ import javassist.CtClass; import org.panda_lang.language.architecture.type.DynamicClass; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.TypeModels; +import org.panda_lang.language.architecture.type.Kind; import org.panda_lang.language.architecture.type.TypeInstance; import org.panda_lang.utilities.commons.ClassPoolUtils; import org.panda_lang.utilities.commons.ClassUtils; @@ -61,7 +61,7 @@ public PandaDynamicClass(Type type, String name, String module, String model) { } public PandaDynamicClass(Type type, Class clazz, String customName, String module) { - this(type, customName, module, TypeModels.of(clazz)); + this(type, customName, module, Kind.of(clazz)); this.structure = clazz; this.implementation = clazz; this.frozen = true; @@ -90,7 +90,7 @@ private synchronized void recreateStructure() throws DynamicClassException { generatedStructure = ClassPoolUtils.getClassPool().makeInterface(className, PROTOTYPE_CLASS); for (Type base : type.getBases()) { - Class baseStructure = base.getAssociatedClass().fetchStructure(); + Class baseStructure = base.getAssociated().fetchStructure(); if (baseStructure.isInterface()) { generatedStructure.addInterface(ClassPoolUtils.get(baseStructure)); @@ -124,7 +124,7 @@ private synchronized void recreateImplementation() throws DynamicClassException String generatedClassName = "Panda_" + name.replace("::", "_") + "$" + ID.getAndIncrement(); CtClass generatedImplementation; - if (TypeModels.isInterface(type)) { + if (Kind.isInterface(type)) { generatedImplementation = ClassPoolUtils.getClassPool().makeInterface("I" + generatedClassName, superclassCt); } else if (superclassCt != null && superclassCt.isInterface()) { @@ -136,7 +136,7 @@ else if (superclassCt != null && superclassCt.isInterface()) { } for (Type base : type.getBases()) { - Class baseStructure = base.getAssociatedClass().fetchStructure(); + Class baseStructure = base.getAssociated().fetchStructure(); if (baseStructure.isInterface()) { generatedImplementation.addInterface(ClassPoolUtils.require(baseStructure)); @@ -163,11 +163,11 @@ else if (superclassCt != null && superclassCt.isInterface()) { @Override public DynamicClass append(Type toAppend) { - if (TypeModels.isInterface(toAppend)) { - return implementInterface(toAppend.getAssociatedClass()); + if (Kind.isInterface(toAppend)) { + return implementInterface(toAppend.getAssociated()); } else { - extendClass(toAppend.getAssociatedClass()); + extendClass(toAppend.getAssociated()); if (toAppend.getName().equals("java::Object")) { this.changedStructure = false; @@ -222,12 +222,12 @@ public boolean isAssignableTo(Class cls) { @Override public boolean isClass() { - return TypeModels.CLASS.equals(model); + return Kind.CLASS.equals(model); } @Override public boolean isInterface() { - return TypeModels.INTERFACE.equals(model); + return Kind.INTERFACE.equals(model); } @Override diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMember.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMember.java index ffba8cd38..a754ca9ed 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMember.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMember.java @@ -18,7 +18,6 @@ import org.panda_lang.language.architecture.type.Signature; import org.panda_lang.language.architecture.type.Type; -import org.panda_lang.language.architecture.type.MemberInvoker; import org.panda_lang.language.architecture.type.Visibility; import org.panda_lang.language.architecture.type.member.parameter.ParameterUtils; import org.panda_lang.language.architecture.type.member.parameter.PropertyParameter; @@ -63,7 +62,7 @@ public PropertyParameter[] getParameters() { } @Override - public Type getReturnType() { + public Signature getReturnType() { return returnType; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMetadata.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMetadata.java index 1a85136d3..b31dd3c4d 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMetadata.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/AbstractMetadata.java @@ -18,6 +18,7 @@ import org.panda_lang.language.architecture.type.Visibility; import org.panda_lang.language.interpreter.source.Location; +import org.panda_lang.utilities.commons.ValidationUtils; public abstract class AbstractMetadata implements Metadata { @@ -27,21 +28,9 @@ public abstract class AbstractMetadata implements Metadata { private final boolean isNative; protected AbstractMetadata(String name, Location location, Visibility visibility, boolean isNative) { - if (name == null) { - throw new IllegalArgumentException("Name is not defined"); - } - - if (location == null) { - throw new IllegalArgumentException("Missing location of type"); - } - - if (visibility == null) { - throw new IllegalArgumentException("Missing visibility of type"); - } - - this.name = name; - this.location = location; - this.visibility = visibility; + this.name = ValidationUtils.notNull(name, "Name is not defined"); + this.location = ValidationUtils.notNull(location, "Missing location of type"); + this.visibility = ValidationUtils.notNull(visibility, "Missing visibility of type"); this.isNative = isNative; } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Member.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Member.java index 22de201cd..df99b375b 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Member.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Member.java @@ -48,7 +48,7 @@ public interface Member extends Metadata { */ default Class[] getJavaParameterTypes() { return Arrays.stream(getParameterTypes()) - .map(parameterType -> parameterType.getType().getAssociatedClass().fetchStructure()) + .map(parameterType -> parameterType.getType().getAssociated()) .toArray(Class[]::new); } @@ -71,7 +71,7 @@ default Class[] getJavaParameterTypes() { * * @return the return type of property */ - Type getReturnType(); + Signature getReturnType(); @Override default String getName() { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/MemberInvoker.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/MemberInvoker.java similarity index 88% rename from panda-framework/src/main/java/org/panda_lang/language/architecture/type/MemberInvoker.java rename to panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/MemberInvoker.java index eaa9dff86..376075485 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/MemberInvoker.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/MemberInvoker.java @@ -14,10 +14,9 @@ * limitations under the License. */ -package org.panda_lang.language.architecture.type; +package org.panda_lang.language.architecture.type.member; import org.jetbrains.annotations.Nullable; -import org.panda_lang.language.architecture.type.member.Member; import org.panda_lang.language.runtime.ProcessStack; public interface MemberInvoker { diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Metadata.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Metadata.java index bb686aeb8..f65c1ce76 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Metadata.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/Metadata.java @@ -46,7 +46,7 @@ public interface Metadata extends Signed { * @return the module */ default Module getModule() { - return getSignature().getType().getModule(); + return getSignature().getType().get().getModule(); } /** diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/MethodScope.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/MethodScope.java index c5515c3be..98b51d3f9 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/MethodScope.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/MethodScope.java @@ -19,7 +19,7 @@ import org.jetbrains.annotations.Nullable; import org.panda_lang.language.architecture.dynamic.Frame; import org.panda_lang.language.architecture.dynamic.Frameable; -import org.panda_lang.language.architecture.type.MemberInvoker; +import org.panda_lang.language.architecture.type.member.MemberInvoker; import org.panda_lang.language.architecture.type.member.parameter.ParameterUtils; import org.panda_lang.language.architecture.type.member.parameter.PropertyParameter; import org.panda_lang.language.interpreter.source.Location; diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/Methods.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/Methods.java index 588ace856..269117396 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/Methods.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/Methods.java @@ -17,9 +17,8 @@ package org.panda_lang.language.architecture.type.member.method; import org.panda_lang.language.architecture.expression.Expression; - import org.panda_lang.language.architecture.type.Adjustment; -import org.panda_lang.language.architecture.type.Type; +import org.panda_lang.language.architecture.type.Signature; import org.panda_lang.language.architecture.type.member.Members; import org.panda_lang.utilities.commons.function.Option; @@ -43,6 +42,6 @@ public interface Methods extends Members { * @param parameterTypes the parameter types to search for * @return the found method */ - Option getMethod(String name, Type[] parameterTypes); + Option getMethod(String name, Signature[] parameterTypes); } diff --git a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/PandaMethod.java b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/PandaMethod.java index 52ddcb986..e2fc6a118 100644 --- a/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/PandaMethod.java +++ b/panda-framework/src/main/java/org/panda_lang/language/architecture/type/member/method/PandaMethod.java @@ -16,7 +16,7 @@ package org.panda_lang.language.architecture.type.member.method; -import org.panda_lang.language.architecture.type.MemberInvoker; +import org.panda_lang.language.architecture.type.member.MemberInvoker; import org.panda_lang.language.architecture.type.member.AbstractMember; import org.panda_lang.language.architecture.type.member.parameter.ParameterUtils; import org.panda_lang.language.runtime.ProcessStack; 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 deleted file mode 100644 index b9590b24d..000000000 --- a/panda-framework/src/main/java/org/panda_lang/language/interpreter/parser/Components.java +++ /dev/null @@ -1,115 +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.parser; - -import org.panda_lang.language.FrameworkController; -import org.panda_lang.language.architecture.Application; -import org.panda_lang.language.architecture.Environment; -import org.panda_lang.language.architecture.Script; -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.parser.expression.ExpressionParser; -import org.panda_lang.language.interpreter.parser.stage.StageManager; -import org.panda_lang.language.interpreter.parser.pool.ParserPoolService; -import org.panda_lang.language.interpreter.source.SourceSet; -import org.panda_lang.language.interpreter.token.Snippet; -import org.panda_lang.language.interpreter.token.SourceStream; - -/** - * The most common components available in the context - */ -public final class Components { - - /** - * Represents the framework controller - */ - public static final ContextComponent CONTROLLER = ContextComponent.of("controller", FrameworkController.class); - - /** - * Represents the application environment - */ - public static final ContextComponent ENVIRONMENT = ContextComponent.of("environment", Environment.class); - - /** - * Represents the generation - */ - public static final ContextComponent STAGE = ContextComponent.of("generation", StageManager.class); - - /** - * Represents the pipeline path with all registered pipelines - */ - public static final ContextComponent PIPELINE = ContextComponent.of("pipeline-path", ParserPoolService.class); - - /** - * Represents the main expression parser with all registered subparsers - */ - public static final ContextComponent EXPRESSION = ContextComponent.of("expression-parser", ExpressionParser.class); - - /** - * Represents the application module loader - */ - public static final ContextComponent TYPE_LOADER = ContextComponent.of("type-loader", TypeLoader.class); - - /** - * Represents the current application - */ - public static final ContextComponent APPLICATION = ContextComponent.of("application", Application.class); - - /** - * Represents all sources to parse - */ - public static final ContextComponent SOURCES = ContextComponent.of("source-set", SourceSet.class); - - /** - * Represents the current script - */ - public static final ContextComponent