From d46ea1e307be063c0f80a5753148ae69a4a6f10f Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 3 Sep 2023 23:15:21 -0700 Subject: [PATCH] Multi-module arrangement and the start of AST generation. --- README.md | 2 +- ast/build.gradle.kts | 5 ++ ast/src/main/ast/pork.yml | 38 +++++++++++++++ .../kotlin/gay/pizza/pork/ast}/Assignment.kt | 4 +- .../main/kotlin/gay/pizza/pork/ast}/Block.kt | 4 +- .../gay/pizza/pork/ast}/BooleanLiteral.kt | 3 +- .../gay/pizza/pork/ast}/CompilationUnit.kt | 4 +- .../kotlin/gay/pizza/pork/ast}/Declaration.kt | 2 +- .../kotlin/gay/pizza/pork/ast}/Definition.kt | 2 +- .../pizza/pork/ast}/DefinitionModifiers.kt | 2 +- .../kotlin/gay/pizza/pork/ast}/Expression.kt | 2 +- .../gay/pizza/pork/ast}/FunctionCall.kt | 4 +- .../gay/pizza/pork/ast}/FunctionDefinition.kt | 4 +- .../src/main/kotlin/gay/pizza/pork/ast}/If.kt | 4 +- .../gay/pizza/pork/ast}/ImportDeclaration.kt | 4 +- .../gay/pizza/pork/ast}/InfixOperation.kt | 4 +- .../gay/pizza/pork/ast}/InfixOperator.kt | 2 +- .../kotlin/gay/pizza/pork/ast}/IntLiteral.kt | 3 +- .../main/kotlin/gay/pizza/pork/ast}/Lambda.kt | 4 +- .../kotlin/gay/pizza/pork/ast}/ListLiteral.kt | 4 +- .../main/kotlin/gay/pizza/pork/ast/Node.kt | 9 ++++ .../gay/pizza/pork/ast/NodeCoalescer.kt | 2 - .../kotlin/gay/pizza/pork/ast/NodeType.kt | 0 .../kotlin/gay/pizza/pork/ast/NodeVisitor.kt | 2 - .../kotlin/gay/pizza/pork/ast}/Parentheses.kt | 4 +- .../gay/pizza/pork/ast}/PrefixOperation.kt | 4 +- .../gay/pizza/pork/ast}/PrefixOperator.kt | 2 +- .../gay/pizza/pork/ast}/StringLiteral.kt | 3 +- .../main/kotlin/gay/pizza/pork/ast}/Symbol.kt | 3 +- .../gay/pizza/pork/ast}/SymbolReference.kt | 4 +- build.gradle.kts | 48 ------------------- buildSrc/build.gradle.kts | 29 +++++++++++ .../gay/pizza/pork/gradle/GenerateAstCode.kt | 30 ++++++++++++ .../gay/pizza/pork/gradle/PorkAstPlugin.kt | 10 ++++ .../pizza/pork/gradle/ast/AstDescription.kt | 6 +++ .../gay/pizza/pork/gradle/ast/AstPrimitive.kt | 6 +++ .../gay/pizza/pork/gradle/ast/AstType.kt | 12 +++++ .../pork/gradle/ast/AstTypeDescription.kt | 6 +++ .../gay/pizza/pork/gradle/ast/AstTypeRef.kt | 31 ++++++++++++ .../pizza/pork/gradle/ast/AstTypeRefForm.kt | 6 +++ .../pizza/pork/gradle/ast/AstTypeRegistry.kt | 32 +++++++++++++ .../gay/pizza/pork/gradle/ast/AstTypeRole.kt | 8 ++++ .../gay/pizza/pork/gradle/ast/AstValue.kt | 7 +++ .../pork/gradle/ast/AstValueDescription.kt | 6 +++ .../gay/pizza/pork/gradle/ast/AstWorld.kt | 28 +++++++++++ .../src/main/kotlin/pork_module.gradle.kts | 25 ++++++++++ core/build.gradle.kts | 27 +++++++++++ .../kotlin/gay/pizza/pork/PorkLanguage.kt | 0 .../kotlin/gay/pizza/pork/cli/AstCommand.kt | 2 +- .../gay/pizza/pork/cli/AttributeCommand.kt | 0 .../kotlin/gay/pizza/pork/cli/FileTool.kt | 0 .../gay/pizza/pork/cli/HighlightCommand.kt | 0 .../gay/pizza/pork/cli/ReprintCommand.kt | 0 .../kotlin/gay/pizza/pork/cli/RootCommand.kt | 0 .../kotlin/gay/pizza/pork/cli/RunCommand.kt | 0 .../gay/pizza/pork/cli/TokenizeCommand.kt | 0 .../main/kotlin/gay/pizza/pork/cli/Tool.kt | 4 +- .../main/kotlin/gay/pizza/pork/cli/main.kt | 0 .../kotlin/gay/pizza/pork/eval/Arguments.kt | 0 .../gay/pizza/pork/eval/BlockFunction.kt | 0 .../gay/pizza/pork/eval/CallableFunction.kt | 0 .../gay/pizza/pork/eval/EvaluationContext.kt | 4 +- .../pork/eval/EvaluationContextProvider.kt | 0 .../gay/pizza/pork/eval/EvaluationVisitor.kt | 5 +- .../kotlin/gay/pizza/pork/eval/Evaluator.kt | 0 .../main/kotlin/gay/pizza/pork/eval/None.kt | 0 .../main/kotlin/gay/pizza/pork/eval/Scope.kt | 0 .../gay/pizza/pork/frontend/ContentSource.kt | 0 .../pizza/pork/frontend/FsContentSource.kt | 0 .../kotlin/gay/pizza/pork/frontend/World.kt | 4 +- .../pizza/pork/parse/AnsiHighlightScheme.kt | 0 .../kotlin/gay/pizza/pork/parse/CharSource.kt | 0 .../pork/parse/DiscardNodeAttribution.kt | 2 +- .../kotlin/gay/pizza/pork/parse/Highlight.kt | 0 .../gay/pizza/pork/parse/HighlightScheme.kt | 0 .../gay/pizza/pork/parse/Highlighter.kt | 0 .../gay/pizza/pork/parse/NodeAttribution.kt | 2 +- .../kotlin/gay/pizza/pork/parse/Parser.kt | 2 +- .../gay/pizza/pork/parse/PeekableSource.kt | 0 .../kotlin/gay/pizza/pork/parse}/Printer.kt | 6 +-- .../gay/pizza/pork/parse/StringCharSource.kt | 0 .../main/kotlin/gay/pizza/pork/parse/Token.kt | 0 .../gay/pizza/pork/parse/TokenFamily.kt | 0 .../pizza/pork/parse/TokenNodeAttribution.kt | 2 +- .../gay/pizza/pork/parse/TokenSource.kt | 0 .../gay/pizza/pork/parse/TokenStream.kt | 0 .../gay/pizza/pork/parse/TokenStreamSource.kt | 0 .../kotlin/gay/pizza/pork/parse/TokenType.kt | 0 .../gay/pizza/pork/parse/TokenTypeProperty.kt | 0 .../kotlin/gay/pizza/pork/parse/Tokenizer.kt | 0 .../gay/pizza/pork/util/IndentPrinter.kt | 0 .../gay/pizza/pork/util/StringEscape.kt | 0 settings.gradle.kts | 16 +++++++ .../kotlin/gay/pizza/pork/ast/nodes/Node.kt | 15 ------ 94 files changed, 377 insertions(+), 138 deletions(-) create mode 100644 ast/build.gradle.kts create mode 100644 ast/src/main/ast/pork.yml rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Assignment.kt (86%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Block.kt (85%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/BooleanLiteral.kt (88%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/CompilationUnit.kt (86%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Declaration.kt (73%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Definition.kt (83%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/DefinitionModifiers.kt (76%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Expression.kt (73%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/FunctionCall.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/FunctionDefinition.kt (89%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/If.kt (89%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/ImportDeclaration.kt (85%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/InfixOperation.kt (88%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/InfixOperator.kt (89%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/IntLiteral.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Lambda.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/ListLiteral.kt (85%) create mode 100644 ast/src/main/kotlin/gay/pizza/pork/ast/Node.kt rename {src => ast/src}/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt (97%) rename {src => ast/src}/main/kotlin/gay/pizza/pork/ast/NodeType.kt (100%) rename {src => ast/src}/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt (98%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Parentheses.kt (85%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/PrefixOperation.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/PrefixOperator.kt (85%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/StringLiteral.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/Symbol.kt (87%) rename {src/main/kotlin/gay/pizza/pork/ast/nodes => ast/src/main/kotlin/gay/pizza/pork/ast}/SymbolReference.kt (85%) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/GenerateAstCode.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/PorkAstPlugin.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstDescription.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstPrimitive.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstType.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeDescription.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRef.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRefForm.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRegistry.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRole.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValue.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValueDescription.kt create mode 100644 buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstWorld.kt create mode 100644 buildSrc/src/main/kotlin/pork_module.gradle.kts create mode 100644 core/build.gradle.kts rename {src => core/src}/main/kotlin/gay/pizza/pork/PorkLanguage.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/AstCommand.kt (95%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/AttributeCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/FileTool.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/RootCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/RunCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/Tool.kt (93%) rename {src => core/src}/main/kotlin/gay/pizza/pork/cli/main.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/Arguments.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/BlockFunction.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt (90%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/EvaluationContextProvider.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt (97%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/Evaluator.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/None.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/eval/Scope.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/frontend/ContentSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/frontend/FsContentSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/frontend/World.kt (93%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/AnsiHighlightScheme.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/CharSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt (84%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/Highlight.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/HighlightScheme.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/Highlighter.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt (78%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/Parser.kt (99%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/PeekableSource.kt (100%) rename {src/main/kotlin/gay/pizza/pork/ast => core/src/main/kotlin/gay/pizza/pork/parse}/Printer.kt (97%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/StringCharSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/Token.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenFamily.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt (96%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenStream.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenStreamSource.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenType.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/TokenTypeProperty.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/parse/Tokenizer.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/util/IndentPrinter.kt (100%) rename {src => core/src}/main/kotlin/gay/pizza/pork/util/StringEscape.kt (100%) delete mode 100644 src/main/kotlin/gay/pizza/pork/ast/nodes/Node.kt diff --git a/README.md b/README.md index ae836cc..3bb61a8 100644 --- a/README.md +++ b/README.md @@ -23,5 +23,5 @@ fn main() { ## Usage ``` -./gradlew -q run --args 'run examples/fib.pork' +./gradlew -q core:run --args 'run ../examples/fib.pork' ``` diff --git a/ast/build.gradle.kts b/ast/build.gradle.kts new file mode 100644 index 0000000..57e6d8c --- /dev/null +++ b/ast/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + pork_module + + id("gay.pizza.pork.ast") +} diff --git a/ast/src/main/ast/pork.yml b/ast/src/main/ast/pork.yml new file mode 100644 index 0000000..3f99d43 --- /dev/null +++ b/ast/src/main/ast/pork.yml @@ -0,0 +1,38 @@ +root: Node +types: + Expression: + parent: Node + Symbol: + parent: Node + Declaration: + parent: Node + Definition: + parent: Node + values: + - name: symbol + type: Symbol + - name: modifiers + type: DefinitionModifiers + DefinitionModifiers: + values: + - name: export + type: Boolean + Block: + parent: Node + values: + - name: expressions + type: List + CompilationUnit: + parent: Node + values: + - name: declarations + type: List + - name: definitions + type: List + Assignment: + parent: Expression + values: + - name: symbol + type: Symbol + - name: value + type: Expression diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Assignment.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Assignment.kt similarity index 86% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Assignment.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Assignment.kt index 2ed8adc..672a45d 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Assignment.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Assignment.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Block.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Block.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Block.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Block.kt index a1a433e..866798a 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Block.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Block.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/BooleanLiteral.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/BooleanLiteral.kt similarity index 88% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/BooleanLiteral.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/BooleanLiteral.kt index 86ce0a7..dafc4ad 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/BooleanLiteral.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/BooleanLiteral.kt @@ -1,6 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/CompilationUnit.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/CompilationUnit.kt similarity index 86% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/CompilationUnit.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/CompilationUnit.kt index 5903d5a..779f8cb 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/CompilationUnit.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/CompilationUnit.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Declaration.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Declaration.kt similarity index 73% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Declaration.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Declaration.kt index d439565..79dbdeb 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Declaration.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Declaration.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Definition.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Definition.kt similarity index 83% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Definition.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Definition.kt index 0213749..e321346 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Definition.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Definition.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/DefinitionModifiers.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/DefinitionModifiers.kt similarity index 76% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/DefinitionModifiers.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/DefinitionModifiers.kt index 5226749..62b31a7 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/DefinitionModifiers.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/DefinitionModifiers.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Expression.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Expression.kt similarity index 73% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Expression.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Expression.kt index 9e15fd5..a4c6a00 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Expression.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Expression.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionCall.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/FunctionCall.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionCall.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/FunctionCall.kt index e0ba161..1f26a6a 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionCall.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/FunctionCall.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionDefinition.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/FunctionDefinition.kt similarity index 89% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionDefinition.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/FunctionDefinition.kt index 530f5b6..bbf538a 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/FunctionDefinition.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/FunctionDefinition.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/If.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/If.kt similarity index 89% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/If.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/If.kt index 6cb010e..ab671d1 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/If.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/If.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/ImportDeclaration.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/ImportDeclaration.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/ImportDeclaration.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/ImportDeclaration.kt index 152c776..aaf61aa 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/ImportDeclaration.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/ImportDeclaration.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperation.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperation.kt similarity index 88% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperation.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperation.kt index 9fb9d47..22bc0fc 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperation.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperation.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperator.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperator.kt similarity index 89% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperator.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperator.kt index e5b971e..43ee975 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/InfixOperator.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/InfixOperator.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/IntLiteral.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/IntLiteral.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/IntLiteral.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/IntLiteral.kt index 541a214..c6c3e0c 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/IntLiteral.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/IntLiteral.kt @@ -1,6 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Lambda.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Lambda.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Lambda.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Lambda.kt index d23254b..0c3c849 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Lambda.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Lambda.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/ListLiteral.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/ListLiteral.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/ListLiteral.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/ListLiteral.kt index ae848f1..c384cca 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/ListLiteral.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/ListLiteral.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/ast/src/main/kotlin/gay/pizza/pork/ast/Node.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Node.kt new file mode 100644 index 0000000..54bb3fa --- /dev/null +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Node.kt @@ -0,0 +1,9 @@ +package gay.pizza.pork.ast + +import kotlinx.serialization.Serializable + +@Serializable +sealed class Node { + abstract val type: NodeType + open fun visitChildren(visitor: NodeVisitor): List = emptyList() +} diff --git a/src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt similarity index 97% rename from src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt index bfe1806..b7b4c87 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/NodeCoalescer.kt @@ -1,7 +1,5 @@ package gay.pizza.pork.ast -import gay.pizza.pork.ast.nodes.* - class NodeCoalescer(val handler: (Node) -> Unit) : NodeVisitor { override fun visitIntLiteral(node: IntLiteral): Unit = handle(node) override fun visitStringLiteral(node: StringLiteral): Unit = handle(node) diff --git a/src/main/kotlin/gay/pizza/pork/ast/NodeType.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/NodeType.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/ast/NodeType.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/NodeType.kt diff --git a/src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt similarity index 98% rename from src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt index eb4d3fe..af2b70a 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/NodeVisitor.kt @@ -1,7 +1,5 @@ package gay.pizza.pork.ast -import gay.pizza.pork.ast.nodes.* - interface NodeVisitor { fun visitIntLiteral(node: IntLiteral): T fun visitStringLiteral(node: StringLiteral): T diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Parentheses.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Parentheses.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Parentheses.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Parentheses.kt index 7e1f9b4..e9ecd79 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Parentheses.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Parentheses.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperation.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperation.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperation.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperation.kt index e025225..34dadf8 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperation.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperation.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperator.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperator.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperator.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperator.kt index 051b7cf..432daa0 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/PrefixOperator.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/PrefixOperator.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/StringLiteral.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/StringLiteral.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/StringLiteral.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/StringLiteral.kt index c7ee199..8af42e1 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/StringLiteral.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/StringLiteral.kt @@ -1,6 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Symbol.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/Symbol.kt similarity index 87% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/Symbol.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/Symbol.kt index 5d81b1f..b5622b8 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Symbol.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/Symbol.kt @@ -1,6 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/SymbolReference.kt b/ast/src/main/kotlin/gay/pizza/pork/ast/SymbolReference.kt similarity index 85% rename from src/main/kotlin/gay/pizza/pork/ast/nodes/SymbolReference.kt rename to ast/src/main/kotlin/gay/pizza/pork/ast/SymbolReference.kt index ab9deb7..d57496c 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/SymbolReference.kt +++ b/ast/src/main/kotlin/gay/pizza/pork/ast/SymbolReference.kt @@ -1,7 +1,5 @@ -package gay.pizza.pork.ast.nodes +package gay.pizza.pork.ast -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.NodeVisitor import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/build.gradle.kts b/build.gradle.kts index 08ca1d2..15c825c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,51 +1,3 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -plugins { - application - - kotlin("jvm") version "1.9.10" - kotlin("plugin.serialization") version "1.9.10" - - id("com.github.johnrengelman.shadow") version "8.1.1" - id("org.graalvm.buildtools.native") version "0.9.25" -} - -repositories { - mavenCentral() -} - -java { - val javaVersion = JavaVersion.toVersion(17) - sourceCompatibility = javaVersion - targetCompatibility = javaVersion -} - -dependencies { - implementation("org.jetbrains.kotlin:kotlin-bom") - implementation("com.github.ajalt.clikt:clikt:4.2.0") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") -} - -tasks.withType { - kotlinOptions.jvmTarget = "17" -} - tasks.withType { gradleVersion = "8.3" } - -application { - mainClass.set("gay.pizza.pork.cli.MainKt") -} - -graalvmNative { - binaries { - named("main") { - imageName.set("pork") - mainClass.set("gay.pizza.pork.cli.MainKt") - sharedLibrary.set(false) - } - } -} - -tasks.run.get().outputs.upToDateWhen { false } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..5420502 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10") + implementation("org.jetbrains.kotlin:kotlin-serialization:1.9.10") + + implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2") +} + +gradlePlugin { + plugins { + create("pork_ast") { + id = "gay.pizza.pork.ast" + implementationClass = "gay.pizza.pork.gradle.PorkAstPlugin" + + displayName = "Pork AST" + description = "AST generation code for pork" + } + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/GenerateAstCode.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/GenerateAstCode.kt new file mode 100644 index 0000000..d4c6603 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/GenerateAstCode.kt @@ -0,0 +1,30 @@ +package gay.pizza.pork.gradle + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory +import com.fasterxml.jackson.module.kotlin.KotlinModule +import gay.pizza.pork.gradle.ast.AstDescription +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.TaskAction +import gay.pizza.pork.gradle.ast.AstWorld +import java.io.File + +open class GenerateAstCode : DefaultTask() { + init { + outputs.upToDateWhen { false } + } + + @get:InputFile + val astDescriptionFile: File = project.file("src/main/ast/pork.yml") + + @TaskAction + fun generate() { + val astYamlText = astDescriptionFile.readText() + val mapper = ObjectMapper(YAMLFactory()) + mapper.registerModules(KotlinModule.Builder().build()) + val astDescription = mapper.readValue(astYamlText, AstDescription::class.java) + val world = AstWorld() + world.build(astDescription) + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/PorkAstPlugin.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/PorkAstPlugin.kt new file mode 100644 index 0000000..abfe960 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/PorkAstPlugin.kt @@ -0,0 +1,10 @@ +package gay.pizza.pork.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class PorkAstPlugin : Plugin { + override fun apply(target: Project) { + target.tasks.create("generateAstCode", GenerateAstCode::class.java) + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstDescription.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstDescription.kt new file mode 100644 index 0000000..a4239c1 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstDescription.kt @@ -0,0 +1,6 @@ +package gay.pizza.pork.gradle.ast + +data class AstDescription( + val root: String, + val types: Map +) diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstPrimitive.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstPrimitive.kt new file mode 100644 index 0000000..86c2ebb --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstPrimitive.kt @@ -0,0 +1,6 @@ +package gay.pizza.pork.gradle.ast + +enum class AstPrimitive(val id: kotlin.String) { + Boolean("Boolean"), + String("String") +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstType.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstType.kt new file mode 100644 index 0000000..55c0d22 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstType.kt @@ -0,0 +1,12 @@ +package gay.pizza.pork.gradle.ast + +class AstType(val name: String, var parent: AstType? = null) { + private val internalValues = mutableListOf() + + val values: List + get() = internalValues + + internal fun addValue(value: AstValue) { + internalValues.add(value) + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeDescription.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeDescription.kt new file mode 100644 index 0000000..1f30f05 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeDescription.kt @@ -0,0 +1,6 @@ +package gay.pizza.pork.gradle.ast + +data class AstTypeDescription( + val parent: String? = null, + val values: List = emptyList() +) diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRef.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRef.kt new file mode 100644 index 0000000..a06f798 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRef.kt @@ -0,0 +1,31 @@ +package gay.pizza.pork.gradle.ast + +class AstTypeRef( + val type: AstType? = null, + val primitive: AstPrimitive? = null, + val form: AstTypeRefForm +) { + companion object { + fun parse(input: String, registry: AstTypeRegistry): AstTypeRef { + if (input.startsWith("List<")) { + val underlyingType = input.substring(5, input.length - 1) + val underlyingRef = parse(underlyingType, registry) + return AstTypeRef( + type = underlyingRef.type, + primitive = underlyingRef.primitive, + form = AstTypeRefForm.List + ) + } + + val primitive = AstPrimitive.values().firstOrNull { it.name == input } + if (primitive != null) { + return AstTypeRef( + primitive = primitive, + form = AstTypeRefForm.Single + ) + } + + return AstTypeRef(type = registry.lookup(input), form = AstTypeRefForm.Single) + } + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRefForm.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRefForm.kt new file mode 100644 index 0000000..8e50f51 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRefForm.kt @@ -0,0 +1,6 @@ +package gay.pizza.pork.gradle.ast + +enum class AstTypeRefForm { + Single, + List +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRegistry.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRegistry.kt new file mode 100644 index 0000000..217c985 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRegistry.kt @@ -0,0 +1,32 @@ +package gay.pizza.pork.gradle.ast + +class AstTypeRegistry { + private val internalTypes = mutableSetOf() + + val types: Set + get() = internalTypes + + fun add(type: AstType): AstType { + internalTypes.add(type) + return type + } + + fun lookupOrNull(name: String): AstType? = + internalTypes.singleOrNull { it.name == name } + + fun lookup(name: String): AstType = lookupOrNull(name) + ?: throw RuntimeException("Unknown AstType: $name") + + fun roleOfType(type: AstType): AstTypeRole = + when { + type.parent == null && type.values.isNotEmpty() -> + AstTypeRole.RootNode + type.parent != null && type.values.all { it.abstract } -> + AstTypeRole.HierarchyNode + type.parent != null && type.values.none { it.abstract } -> + AstTypeRole.AstNode + type.parent == null && type.values.isNotEmpty() -> + AstTypeRole.ValueHolder + else -> throw RuntimeException("Unable to determine role of type ${type.name}") + } +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRole.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRole.kt new file mode 100644 index 0000000..671dd90 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstTypeRole.kt @@ -0,0 +1,8 @@ +package gay.pizza.pork.gradle.ast + +enum class AstTypeRole { + RootNode, + HierarchyNode, + AstNode, + ValueHolder +} diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValue.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValue.kt new file mode 100644 index 0000000..7f1f034 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValue.kt @@ -0,0 +1,7 @@ +package gay.pizza.pork.gradle.ast + +class AstValue( + val name: String, + val typeRef: AstTypeRef, + val abstract: Boolean = false +) diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValueDescription.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValueDescription.kt new file mode 100644 index 0000000..4481a95 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstValueDescription.kt @@ -0,0 +1,6 @@ +package gay.pizza.pork.gradle.ast + +data class AstValueDescription( + val name: String, + val type: String +) diff --git a/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstWorld.kt b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstWorld.kt new file mode 100644 index 0000000..aad6023 --- /dev/null +++ b/buildSrc/src/main/kotlin/gay/pizza/pork/gradle/ast/AstWorld.kt @@ -0,0 +1,28 @@ +package gay.pizza.pork.gradle.ast + +class AstWorld { + val typeRegistry: AstTypeRegistry = AstTypeRegistry() + + fun build(description: AstDescription) { + val rootType = typeRegistry.add(AstType(description.root)) + for (typeName in description.types.keys) { + if (typeName == rootType.name) { + throw RuntimeException("Cannot have type with the same name as the root type.") + } + + typeRegistry.add(AstType(typeName)) + } + + for ((typeName, typeDescription) in description.types) { + val type = typeRegistry.lookup(typeName) + if (typeDescription.parent != null) { + type.parent = typeRegistry.lookup(typeDescription.parent) + } + for (value in typeDescription.values) { + val typeRef = AstTypeRef.parse(value.type, typeRegistry) + val typeValue = AstValue(value.name, typeRef) + type.addValue(typeValue) + } + } + } +} diff --git a/buildSrc/src/main/kotlin/pork_module.gradle.kts b/buildSrc/src/main/kotlin/pork_module.gradle.kts new file mode 100644 index 0000000..332cd1e --- /dev/null +++ b/buildSrc/src/main/kotlin/pork_module.gradle.kts @@ -0,0 +1,25 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +repositories { + mavenCentral() +} + +java { + val javaVersion = JavaVersion.toVersion(17) + sourceCompatibility = javaVersion + targetCompatibility = javaVersion +} + +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-bom") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 0000000..f7f8b71 --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + application + pork_module + id("com.github.johnrengelman.shadow") version "8.1.1" + id("org.graalvm.buildtools.native") version "0.9.25" +} + +dependencies { + api(project(":ast")) + implementation(libs.clikt) +} + +application { + mainClass.set("gay.pizza.pork.cli.MainKt") +} + +graalvmNative { + binaries { + named("main") { + imageName.set("pork") + mainClass.set("gay.pizza.pork.cli.MainKt") + sharedLibrary.set(false) + } + } +} + +tasks.run.get().outputs.upToDateWhen { false } diff --git a/src/main/kotlin/gay/pizza/pork/PorkLanguage.kt b/core/src/main/kotlin/gay/pizza/pork/PorkLanguage.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/PorkLanguage.kt rename to core/src/main/kotlin/gay/pizza/pork/PorkLanguage.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt similarity index 95% rename from src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt index 8696f74..c890552 100644 --- a/src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt +++ b/core/src/main/kotlin/gay/pizza/pork/cli/AstCommand.kt @@ -3,7 +3,7 @@ package gay.pizza.pork.cli import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.types.path -import gay.pizza.pork.ast.nodes.Node +import gay.pizza.pork.ast.Node import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json diff --git a/src/main/kotlin/gay/pizza/pork/cli/AttributeCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/AttributeCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/AttributeCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/AttributeCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/FileTool.kt b/core/src/main/kotlin/gay/pizza/pork/cli/FileTool.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/FileTool.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/FileTool.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/HighlightCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/ReprintCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/RootCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/RunCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt b/core/src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/TokenizeCommand.kt diff --git a/src/main/kotlin/gay/pizza/pork/cli/Tool.kt b/core/src/main/kotlin/gay/pizza/pork/cli/Tool.kt similarity index 93% rename from src/main/kotlin/gay/pizza/pork/cli/Tool.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/Tool.kt index 7fb4d3d..abd0410 100644 --- a/src/main/kotlin/gay/pizza/pork/cli/Tool.kt +++ b/core/src/main/kotlin/gay/pizza/pork/cli/Tool.kt @@ -1,8 +1,8 @@ package gay.pizza.pork.cli import gay.pizza.pork.ast.NodeVisitor -import gay.pizza.pork.ast.Printer -import gay.pizza.pork.ast.nodes.CompilationUnit +import gay.pizza.pork.parse.Printer +import gay.pizza.pork.ast.CompilationUnit import gay.pizza.pork.eval.* import gay.pizza.pork.frontend.ContentSource import gay.pizza.pork.frontend.World diff --git a/src/main/kotlin/gay/pizza/pork/cli/main.kt b/core/src/main/kotlin/gay/pizza/pork/cli/main.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/cli/main.kt rename to core/src/main/kotlin/gay/pizza/pork/cli/main.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/Arguments.kt b/core/src/main/kotlin/gay/pizza/pork/eval/Arguments.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/Arguments.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/Arguments.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/BlockFunction.kt b/core/src/main/kotlin/gay/pizza/pork/eval/BlockFunction.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/BlockFunction.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/BlockFunction.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt b/core/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt b/core/src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt similarity index 90% rename from src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt index 8b0c818..dbf8fb1 100644 --- a/src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt +++ b/core/src/main/kotlin/gay/pizza/pork/eval/EvaluationContext.kt @@ -1,7 +1,7 @@ package gay.pizza.pork.eval -import gay.pizza.pork.ast.nodes.CompilationUnit -import gay.pizza.pork.ast.nodes.ImportDeclaration +import gay.pizza.pork.ast.CompilationUnit +import gay.pizza.pork.ast.ImportDeclaration class EvaluationContext( val compilationUnit: CompilationUnit, diff --git a/src/main/kotlin/gay/pizza/pork/eval/EvaluationContextProvider.kt b/core/src/main/kotlin/gay/pizza/pork/eval/EvaluationContextProvider.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/EvaluationContextProvider.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/EvaluationContextProvider.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt b/core/src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt similarity index 97% rename from src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt index 005e779..d70bed2 100644 --- a/src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt +++ b/core/src/main/kotlin/gay/pizza/pork/eval/EvaluationVisitor.kt @@ -1,7 +1,6 @@ package gay.pizza.pork.eval -import gay.pizza.pork.ast.NodeVisitor -import gay.pizza.pork.ast.nodes.* +import gay.pizza.pork.ast.* class EvaluationVisitor(root: Scope) : NodeVisitor { private var currentScope: Scope = root @@ -65,7 +64,7 @@ class EvaluationVisitor(root: Scope) : NodeVisitor { visit(node.thenExpression) } else { if (node.elseExpression != null) { - visit(node.elseExpression) + visit(node.elseExpression!!) } else { None } diff --git a/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt b/core/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/None.kt b/core/src/main/kotlin/gay/pizza/pork/eval/None.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/None.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/None.kt diff --git a/src/main/kotlin/gay/pizza/pork/eval/Scope.kt b/core/src/main/kotlin/gay/pizza/pork/eval/Scope.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/eval/Scope.kt rename to core/src/main/kotlin/gay/pizza/pork/eval/Scope.kt diff --git a/src/main/kotlin/gay/pizza/pork/frontend/ContentSource.kt b/core/src/main/kotlin/gay/pizza/pork/frontend/ContentSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/frontend/ContentSource.kt rename to core/src/main/kotlin/gay/pizza/pork/frontend/ContentSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/frontend/FsContentSource.kt b/core/src/main/kotlin/gay/pizza/pork/frontend/FsContentSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/frontend/FsContentSource.kt rename to core/src/main/kotlin/gay/pizza/pork/frontend/FsContentSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/frontend/World.kt b/core/src/main/kotlin/gay/pizza/pork/frontend/World.kt similarity index 93% rename from src/main/kotlin/gay/pizza/pork/frontend/World.kt rename to core/src/main/kotlin/gay/pizza/pork/frontend/World.kt index 6aa9dde..e371885 100644 --- a/src/main/kotlin/gay/pizza/pork/frontend/World.kt +++ b/core/src/main/kotlin/gay/pizza/pork/frontend/World.kt @@ -1,7 +1,7 @@ package gay.pizza.pork.frontend -import gay.pizza.pork.ast.nodes.CompilationUnit -import gay.pizza.pork.ast.nodes.ImportDeclaration +import gay.pizza.pork.ast.CompilationUnit +import gay.pizza.pork.ast.ImportDeclaration import gay.pizza.pork.parse.DiscardNodeAttribution import gay.pizza.pork.parse.Parser import gay.pizza.pork.parse.TokenStreamSource diff --git a/src/main/kotlin/gay/pizza/pork/parse/AnsiHighlightScheme.kt b/core/src/main/kotlin/gay/pizza/pork/parse/AnsiHighlightScheme.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/AnsiHighlightScheme.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/AnsiHighlightScheme.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/CharSource.kt b/core/src/main/kotlin/gay/pizza/pork/parse/CharSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/CharSource.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/CharSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt b/core/src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt similarity index 84% rename from src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt index d33ecce..4c8642e 100644 --- a/src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt +++ b/core/src/main/kotlin/gay/pizza/pork/parse/DiscardNodeAttribution.kt @@ -1,6 +1,6 @@ package gay.pizza.pork.parse -import gay.pizza.pork.ast.nodes.Node +import gay.pizza.pork.ast.Node object DiscardNodeAttribution : NodeAttribution { override fun enter() {} diff --git a/src/main/kotlin/gay/pizza/pork/parse/Highlight.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Highlight.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/Highlight.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Highlight.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/HighlightScheme.kt b/core/src/main/kotlin/gay/pizza/pork/parse/HighlightScheme.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/HighlightScheme.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/HighlightScheme.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/Highlighter.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Highlighter.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/Highlighter.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Highlighter.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt b/core/src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt similarity index 78% rename from src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt index 9bba5f9..6a58dec 100644 --- a/src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt +++ b/core/src/main/kotlin/gay/pizza/pork/parse/NodeAttribution.kt @@ -1,6 +1,6 @@ package gay.pizza.pork.parse -import gay.pizza.pork.ast.nodes.Node +import gay.pizza.pork.ast.Node interface NodeAttribution { fun enter() diff --git a/src/main/kotlin/gay/pizza/pork/parse/Parser.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Parser.kt similarity index 99% rename from src/main/kotlin/gay/pizza/pork/parse/Parser.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Parser.kt index 2dfd768..e23dccb 100644 --- a/src/main/kotlin/gay/pizza/pork/parse/Parser.kt +++ b/core/src/main/kotlin/gay/pizza/pork/parse/Parser.kt @@ -1,6 +1,6 @@ package gay.pizza.pork.parse -import gay.pizza.pork.ast.nodes.* +import gay.pizza.pork.ast.* import gay.pizza.pork.util.StringEscape class Parser(source: PeekableSource, val attribution: NodeAttribution) { diff --git a/src/main/kotlin/gay/pizza/pork/parse/PeekableSource.kt b/core/src/main/kotlin/gay/pizza/pork/parse/PeekableSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/PeekableSource.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/PeekableSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/ast/Printer.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Printer.kt similarity index 97% rename from src/main/kotlin/gay/pizza/pork/ast/Printer.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Printer.kt index 72d4492..87e9284 100644 --- a/src/main/kotlin/gay/pizza/pork/ast/Printer.kt +++ b/core/src/main/kotlin/gay/pizza/pork/parse/Printer.kt @@ -1,6 +1,6 @@ -package gay.pizza.pork.ast +package gay.pizza.pork.parse -import gay.pizza.pork.ast.nodes.* +import gay.pizza.pork.ast.* import gay.pizza.pork.util.IndentPrinter import gay.pizza.pork.util.StringEscape @@ -134,7 +134,7 @@ class Printer(buffer: StringBuilder) : NodeVisitor { append("else") out.increaseIndent() appendLine() - visit(node.elseExpression) + visit(node.elseExpression!!) out.decreaseIndent() } } diff --git a/src/main/kotlin/gay/pizza/pork/parse/StringCharSource.kt b/core/src/main/kotlin/gay/pizza/pork/parse/StringCharSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/StringCharSource.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/StringCharSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/Token.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Token.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/Token.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Token.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenFamily.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenFamily.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenFamily.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenFamily.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt similarity index 96% rename from src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt index 8d4867b..9c7ebfd 100644 --- a/src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt +++ b/core/src/main/kotlin/gay/pizza/pork/parse/TokenNodeAttribution.kt @@ -1,7 +1,7 @@ package gay.pizza.pork.parse import gay.pizza.pork.ast.NodeCoalescer -import gay.pizza.pork.ast.nodes.Node +import gay.pizza.pork.ast.Node import java.util.IdentityHashMap class TokenNodeAttribution : NodeAttribution { diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenSource.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenSource.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenStream.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenStream.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenStream.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenStream.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenStreamSource.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenStreamSource.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenStreamSource.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenStreamSource.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenType.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenType.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenType.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenType.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/TokenTypeProperty.kt b/core/src/main/kotlin/gay/pizza/pork/parse/TokenTypeProperty.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/TokenTypeProperty.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/TokenTypeProperty.kt diff --git a/src/main/kotlin/gay/pizza/pork/parse/Tokenizer.kt b/core/src/main/kotlin/gay/pizza/pork/parse/Tokenizer.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/parse/Tokenizer.kt rename to core/src/main/kotlin/gay/pizza/pork/parse/Tokenizer.kt diff --git a/src/main/kotlin/gay/pizza/pork/util/IndentPrinter.kt b/core/src/main/kotlin/gay/pizza/pork/util/IndentPrinter.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/util/IndentPrinter.kt rename to core/src/main/kotlin/gay/pizza/pork/util/IndentPrinter.kt diff --git a/src/main/kotlin/gay/pizza/pork/util/StringEscape.kt b/core/src/main/kotlin/gay/pizza/pork/util/StringEscape.kt similarity index 100% rename from src/main/kotlin/gay/pizza/pork/util/StringEscape.kt rename to core/src/main/kotlin/gay/pizza/pork/util/StringEscape.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 13c123b..3adf28a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1,17 @@ rootProject.name = "pork" + +include( + ":ast", + ":core" +) + +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + version("clikt", "4.2.0") + + library("clikt", "com.github.ajalt.clikt", "clikt") + .versionRef("clikt") + } + } +} diff --git a/src/main/kotlin/gay/pizza/pork/ast/nodes/Node.kt b/src/main/kotlin/gay/pizza/pork/ast/nodes/Node.kt deleted file mode 100644 index d98c56a..0000000 --- a/src/main/kotlin/gay/pizza/pork/ast/nodes/Node.kt +++ /dev/null @@ -1,15 +0,0 @@ -package gay.pizza.pork.ast.nodes - -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.ast.Printer -import gay.pizza.pork.ast.NodeVisitor -import kotlinx.serialization.Serializable - -@Serializable -sealed class Node { - abstract val type: NodeType - open fun visitChildren(visitor: NodeVisitor): List = emptyList() - - override fun toString(): String = - let { node -> buildString { Printer(this).visit(node) } } -}