diff --git a/cli/src/main/kotlin/tools/samt/cli/TypePrinter.kt b/cli/src/main/kotlin/tools/samt/cli/TypePrinter.kt index 6c45402a..15fe1ea1 100644 --- a/cli/src/main/kotlin/tools/samt/cli/TypePrinter.kt +++ b/cli/src/main/kotlin/tools/samt/cli/TypePrinter.kt @@ -14,7 +14,7 @@ internal object TypePrinter { appendLine(" ${bold("record")} ${yellow(record.name)}") } for (alias in samtPackage.aliases) { - appendLine(" ${bold("alias")} ${yellow(alias.name)} = ${gray(alias.fullyResolvedType?.humanReadableName ?: "Unknown")}") + appendLine(" ${bold("typealias")} ${yellow(alias.name)} = ${gray(alias.fullyResolvedType?.humanReadableName ?: "Unknown")}") } for (service in samtPackage.services) { appendLine(" ${bold("service")} ${yellow(service.name)}") diff --git a/cli/src/test/kotlin/tools/samt/cli/ASTPrinterTest.kt b/cli/src/test/kotlin/tools/samt/cli/ASTPrinterTest.kt index 7bcd173b..41e34e08 100644 --- a/cli/src/test/kotlin/tools/samt/cli/ASTPrinterTest.kt +++ b/cli/src/test/kotlin/tools/samt/cli/ASTPrinterTest.kt @@ -26,7 +26,7 @@ class ASTPrinterTest { enum E { A, B, C } - alias B : E + typealias B = E @Description("This is a service") service MyService { @@ -92,9 +92,9 @@ class ASTPrinterTest { │ ├─IdentifierNode B <11:13> │ └─IdentifierNode C <11:16> ├─TypeAliasNode <13:1> - │ ├─IdentifierNode B <13:7> - │ └─BundleIdentifierNode E <13:11> - │ └─IdentifierNode E <13:11> + │ ├─IdentifierNode B <13:11> + │ └─BundleIdentifierNode E <13:15> + │ └─IdentifierNode E <13:15> ├─ServiceDeclarationNode <16:1> │ ├─IdentifierNode MyService <16:9> │ ├─RequestResponseOperationNode <17:3> diff --git a/lexer/src/main/kotlin/tools/samt/lexer/Lexer.kt b/lexer/src/main/kotlin/tools/samt/lexer/Lexer.kt index 8e935698..b017da3a 100644 --- a/lexer/src/main/kotlin/tools/samt/lexer/Lexer.kt +++ b/lexer/src/main/kotlin/tools/samt/lexer/Lexer.kt @@ -412,7 +412,7 @@ class Lexer private constructor( "record" to { RecordToken(it) }, "enum" to { EnumToken(it) }, "service" to { ServiceToken(it) }, - "alias" to { AliasToken(it) }, + "typealias" to { TypealiasToken(it) }, "package" to { PackageToken(it) }, "import" to { ImportToken(it) }, "provide" to { ProvideToken(it) }, diff --git a/lexer/src/main/kotlin/tools/samt/lexer/Tokens.kt b/lexer/src/main/kotlin/tools/samt/lexer/Tokens.kt index 17a37b39..5ac6145f 100644 --- a/lexer/src/main/kotlin/tools/samt/lexer/Tokens.kt +++ b/lexer/src/main/kotlin/tools/samt/lexer/Tokens.kt @@ -22,7 +22,7 @@ sealed interface StaticToken: Token data class RecordToken(override val location: Location): StaticToken data class EnumToken(override val location: Location): StaticToken data class ServiceToken(override val location: Location): StaticToken -data class AliasToken(override val location: Location): StaticToken +data class TypealiasToken(override val location: Location): StaticToken data class PackageToken(override val location: Location): StaticToken data class ImportToken(override val location: Location): StaticToken data class ProvideToken(override val location: Location): StaticToken @@ -79,7 +79,7 @@ fun getHumanReadableTokenName(key: KClass): String = when (key) { // StaticToken EnumToken::class -> "enum" ServiceToken::class -> "service" - AliasToken::class -> "alias" + TypealiasToken::class -> "typealias" PackageToken::class -> "package" ImportToken::class -> "import" ProvideToken::class -> "provide" diff --git a/lexer/src/test/kotlin/tools/samt/lexer/LexerTest.kt b/lexer/src/test/kotlin/tools/samt/lexer/LexerTest.kt index 6bca5998..b62154c4 100644 --- a/lexer/src/test/kotlin/tools/samt/lexer/LexerTest.kt +++ b/lexer/src/test/kotlin/tools/samt/lexer/LexerTest.kt @@ -296,7 +296,7 @@ SAMT!""", stream.next() record enum service - alias + typealias package import provide @@ -334,7 +334,7 @@ SAMT!""", stream.next() assertIs(stream.next()) assertIs(stream.next()) assertIs(stream.next()) - assertIs(stream.next()) + assertIs(stream.next()) assertIs(stream.next()) assertIs(stream.next()) assertIs(stream.next()) diff --git a/parser/src/main/kotlin/tools/samt/parser/Parser.kt b/parser/src/main/kotlin/tools/samt/parser/Parser.kt index e323303c..112771b4 100644 --- a/parser/src/main/kotlin/tools/samt/parser/Parser.kt +++ b/parser/src/main/kotlin/tools/samt/parser/Parser.kt @@ -78,7 +78,7 @@ class Parser private constructor( when (current) { is RecordToken -> parseRecordDeclaration(annotations) is EnumToken -> parseEnumDeclaration(annotations) - is AliasToken -> parseTypeAlias(annotations) + is TypealiasToken -> parseTypeAlias(annotations) is ServiceToken -> parseServiceDeclaration(annotations) else -> { @@ -100,7 +100,7 @@ class Parser private constructor( is PackageToken -> parsePackageDeclaration() is RecordToken -> parseRecordDeclaration() is EnumToken -> parseEnumDeclaration() - is AliasToken -> parseTypeAlias() + is TypealiasToken -> parseTypeAlias() is ServiceToken -> parseServiceDeclaration() is ProvideToken -> parseProviderDeclaration() is ConsumeToken -> parseConsumerDeclaration() @@ -214,9 +214,9 @@ class Parser private constructor( private fun parseTypeAlias(annotations: List = emptyList()): TypeAliasNode { val start = currentStart - expect() + expect() val name = parseIdentifier() - expect() + expect() val type = parseExpression() return TypeAliasNode(locationFromStart(start), name, type, annotations) } diff --git a/parser/src/test/kotlin/tools/samt/parser/ParserTest.kt b/parser/src/test/kotlin/tools/samt/parser/ParserTest.kt index f19d2d5f..dc4265fd 100644 --- a/parser/src/test/kotlin/tools/samt/parser/ParserTest.kt +++ b/parser/src/test/kotlin/tools/samt/parser/ParserTest.kt @@ -221,9 +221,9 @@ class ParserTest { val source = """ package aliases - alias A: String? ( foo(1..2.3..3) ) - alias B: List? - alias C: Map ( uniqueKeys((false)) ) + typealias A = String? ( foo(1..2.3..3) ) + typealias B = List? + typealias C = Map ( uniqueKeys((false)) ) """ val fileTree = parse(source) assertPackage("aliases", fileTree.packageDeclaration) @@ -266,8 +266,8 @@ class ParserTest { val source = """ package aliases - alias A: String? - alias B: List? + typealias A = String? + typealias B = List? """ val fileTree = parse(source) assertPackage("aliases", fileTree.packageDeclaration) @@ -293,7 +293,7 @@ class ParserTest { val source = """ package illegalAliases - alias A: List<> + typealias A = List<> """ val (fileTree, diagnostics) = parseWithRecoverableError(source) assertEquals( @@ -466,7 +466,7 @@ class ParserTest { val source = """ package a - alias A: List' but reached end of file", exception.message) @@ -477,7 +477,7 @@ class ParserTest { val source = """ package a - alias A: List'", exception.message) @@ -488,10 +488,10 @@ class ParserTest { val source = """ package a - alias A 42.0 + typealias A 42.0 """ val exception = parseWithFatalError(source) - assertEquals("Unexpected token '42.0', expected ':'", exception.message) + assertEquals("Unexpected token '42.0', expected '='", exception.message) } @Test @@ -693,7 +693,7 @@ class ParserTest { @Password @Encrypted - alias Password: String + typealias Password = String @Foo @Bar diff --git a/semantic/src/main/kotlin/tools/samt/semantic/SemanticModel.kt b/semantic/src/main/kotlin/tools/samt/semantic/SemanticModel.kt index 05490178..d586524d 100644 --- a/semantic/src/main/kotlin/tools/samt/semantic/SemanticModel.kt +++ b/semantic/src/main/kotlin/tools/samt/semantic/SemanticModel.kt @@ -51,8 +51,8 @@ class SemanticModelBuilder private constructor( for (unresolvableAlias in workingSet) { controller.getOrCreateContext(unresolvableAlias.declaration.location.source).error { - message("Could not resolve alias '${unresolvableAlias.name}', are there circular references?") - highlight("unresolved alias", unresolvableAlias.declaration.name.location) + message("Could not resolve type alias '${unresolvableAlias.name}', are there circular references?") + highlight("unresolved type alias", unresolvableAlias.declaration.name.location) } } } @@ -108,22 +108,22 @@ class SemanticModelBuilder private constructor( } is ServiceType -> { controller.getOrCreateContext(typeReference.typeNode.location.source).error { - message("Alias cannot reference service") - highlight("alias", typeReference.typeNode.location) + message("Type alias cannot reference service") + highlight("type alias", typeReference.typeNode.location) } typeReference } is ProviderType -> { controller.getOrCreateContext(typeReference.typeNode.location.source).error { - message("Alias cannot reference provider") - highlight("alias", typeReference.typeNode.location) + message("Type alias cannot reference provider") + highlight("type alias", typeReference.typeNode.location) } typeReference } is PackageType -> { controller.getOrCreateContext(typeReference.typeNode.location.source).error { - message("Alias cannot reference package") - highlight("alias", typeReference.typeNode.location) + message("Type alias cannot reference package") + highlight("type alias", typeReference.typeNode.location) } typeReference } diff --git a/semantic/src/test/kotlin/tools/samt/semantic/SemanticModelTest.kt b/semantic/src/test/kotlin/tools/samt/semantic/SemanticModelTest.kt index 7ff54400..43746def 100644 --- a/semantic/src/test/kotlin/tools/samt/semantic/SemanticModelTest.kt +++ b/semantic/src/test/kotlin/tools/samt/semantic/SemanticModelTest.kt @@ -79,7 +79,7 @@ class SemanticModelTest { } enum E { } - alias E : Int + typealias E = Int """.trimIndent() parseAndCheck( source to listOf( @@ -508,7 +508,7 @@ class SemanticModelTest { val source = """ package color - alias UShort: Int (0..256) + typealias UShort = Int (0..256) record Color { r: UShort @@ -526,18 +526,18 @@ class SemanticModelTest { val source = """ package color - alias A : Int - alias B : A // Int - alias C : B // Int - alias D : F // Cycle! - alias E : D // Cycle! - alias F : E // Cycle! + typealias A = Int + typealias B = A // Int + typealias C = B // Int + typealias D = F // Cycle! + typealias E = D // Cycle! + typealias F = E // Cycle! """.trimIndent() parseAndCheck( source to listOf( - "Error: Could not resolve alias 'D', are there circular references?", - "Error: Could not resolve alias 'E', are there circular references?", - "Error: Could not resolve alias 'F', are there circular references?", + "Error: Could not resolve type alias 'D', are there circular references?", + "Error: Could not resolve type alias 'E', are there circular references?", + "Error: Could not resolve type alias 'F', are there circular references?", ) ) } diff --git a/specification/ebnf.svg b/specification/ebnf.svg index 3392847f..76eb73c1 100644 --- a/specification/ebnf.svg +++ b/specification/ebnf.svg @@ -1 +1,2 @@ -FileTopLevelStatementTopLevelStatementImportStatementPackageDeclarationDeclarationImportStatementimportImportBundleIdentifierasIdentifierPackageDeclarationpackageBundleIdentifierDeclarationRecordDeclarationEnumDeclarationTypeAliasDeclarationServiceDeclarationProviderDeclarationConsumerDeclarationRecordDeclarationAnnotationrecordIdentifierextendsBundleIdentifier,BundleIdentifier{RecordField}RecordFieldAnnotationIdentifier:ExpressionEnumDeclarationAnnotationenumIdentifier{IdentifierList}TypeAliasDeclarationAnnotationaliasIdentifier:ExpressionServiceDeclarationAnnotationserviceIdentifier{OperationDeclarationOnewayOperationDeclaration}OperationDeclarationAnnotationasyncIdentifier(OperationParameterList):ExpressionraisesExpressionListOnewayOperationDeclarationAnnotationonewayIdentifier(OperationParameterList)OperationParameterListOperationParameter,OperationParameterOperationParameterAnnotationIdentifier:ExpressionProviderDeclarationprovideIdentifier{ProviderDeclarationStatement}ProviderDeclarationStatementProviderImplementsStatementProviderTransportStatementProviderImplementsStatementimplementsBundleIdentifier{IdentifierList}ProviderTransportStatementtransportIdentifierObjectConsumerDeclarationconsumeBundleIdentifier{ConsumerUsesStatement}ConsumerUsesStatementusesBundleIdentifier{IdentifierList}Annotation@Identifier(ExpressionList)ExpressionBundleIdentifierNumberBooleanStringRangeObjectArrayCallExpressionGenericSpecializationOptionalPostOperatorWildcard(Expression)CallExpressionExpression(ExpressionList)GenericSpecializationExpression<ExpressionList>OptionalPostOperatorExpression?RangeExpression..ExpressionObject{ObjectFieldDeclaration,ObjectFieldDeclaration}ObjectFieldDeclarationIdentifier:ExpressionArray[ExpressionList]ExpressionListExpression,ExpressionIdentifierListIdentifier,IdentifierWildcard*LetterA - Z | a - z | _Identifier^LetterLetterDigitBundleIdentifierIdentifier.IdentifierImportBundleIdentifierIdentifier.Identifier.*Number-IntegerFloatIntegerDigitDigitFloatDigitDigit.DigitDigitBooleantruefalseDigit0 - 9String"utf8 codepoints or escaped special characters" \ No newline at end of file + +FileTopLevelStatementTopLevelStatementImportStatementPackageDeclarationDeclarationImportStatementimportImportBundleIdentifierasIdentifierPackageDeclarationpackageBundleIdentifierDeclarationRecordDeclarationEnumDeclarationTypeAliasDeclarationServiceDeclarationProviderDeclarationConsumerDeclarationRecordDeclarationAnnotationrecordIdentifierextendsBundleIdentifier,BundleIdentifier{RecordField}RecordFieldAnnotationIdentifier:ExpressionEnumDeclarationAnnotationenumIdentifier{IdentifierList}TypeAliasDeclarationAnnotationtypealiasIdentifier=ExpressionServiceDeclarationAnnotationserviceIdentifier{OperationDeclarationOnewayOperationDeclaration}OperationDeclarationAnnotationasyncIdentifier(OperationParameterList):ExpressionraisesExpressionListOnewayOperationDeclarationAnnotationonewayIdentifier(OperationParameterList)OperationParameterListOperationParameter,OperationParameterOperationParameterAnnotationIdentifier:ExpressionProviderDeclarationprovideIdentifier{ProviderDeclarationStatement}ProviderDeclarationStatementProviderImplementsStatementProviderTransportStatementProviderImplementsStatementimplementsBundleIdentifier{IdentifierList}ProviderTransportStatementtransportIdentifierObjectConsumerDeclarationconsumeBundleIdentifier{ConsumerUsesStatement}ConsumerUsesStatementusesBundleIdentifier{IdentifierList}Annotation@Identifier(ExpressionList)ExpressionBundleIdentifierNumberBooleanStringRangeObjectArrayCallExpressionGenericSpecializationOptionalPostOperatorWildcard(Expression)CallExpressionExpression(ExpressionList)GenericSpecializationExpression<ExpressionList>OptionalPostOperatorExpression?RangeExpression..ExpressionObject{ObjectFieldDeclaration,ObjectFieldDeclaration}ObjectFieldDeclarationIdentifier:ExpressionArray[ExpressionList]ExpressionListExpression,ExpressionIdentifierListIdentifier,IdentifierWildcard*LetterA - Z | a - z | _Identifier^LetterLetterDigitBundleIdentifierIdentifier.IdentifierImportBundleIdentifierIdentifier.Identifier.*Number-IntegerFloatIntegerDigitDigitFloatDigitDigit.DigitDigitBooleantruefalseDigit0 - 9String"utf8 codepoints or escaped special characters" \ No newline at end of file diff --git a/specification/examples/greeter.samt b/specification/examples/greeter.samt index e7e48fa9..6f01a3f8 100644 --- a/specification/examples/greeter.samt +++ b/specification/examples/greeter.samt @@ -5,7 +5,7 @@ import samt.stuff.* package samt.greeter // define type alias for names -alias Name : String(size(20..100)) +typealias Name = String(size(20..100)) record GreetRequest { name: Name diff --git a/specification/examples/parser_errors.samt b/specification/examples/parser_errors.samt index 2814965a..b6acdb93 100644 --- a/specification/examples/parser_errors.samt +++ b/specification/examples/parser_errors.samt @@ -6,13 +6,13 @@ import package import foo -alias Test : Int(0..1000000000000000000000000) +typealias Test = Int(0..1000000000000000000000000) -alias ^foobar : String +typealias ^foobar = String -alias ^ : String +typealias ^ = String -alias test : String(pattern("\n\x")) +typealias test = String(pattern("\n\x")) package debug @@ -31,4 +31,4 @@ enum Foo { Baz } -alias foo = String \ No newline at end of file +typealias foo : String \ No newline at end of file diff --git a/specification/examples/todo-service/common.samt b/specification/examples/todo-service/common.samt index 0ba2a0cd..a0a898a4 100644 --- a/specification/examples/todo-service/common.samt +++ b/specification/examples/todo-service/common.samt @@ -1,6 +1,6 @@ package tools.samt.examples.common -alias UUID: String ( pattern("[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}") ) +typealias UUID = String ( pattern("[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}") ) record NotFoundFault extends Fault record MissingPermissionsFault extends Fault diff --git a/specification/grammar.md b/specification/grammar.md index 507b7522..df2127d0 100644 --- a/specification/grammar.md +++ b/specification/grammar.md @@ -29,7 +29,7 @@ RecordField = { Annotation }, Identifier, ":", Expression; EnumDeclaration = { Annotation }, "enum", Identifier, "{", [IdentifierList], "}"; -TypeAliasDeclaration = { Annotation }, "alias", Identifier, ":", Expression; +TypeAliasDeclaration = { Annotation }, "typealias", Identifier, "=", Expression; ServiceDeclaration = { Annotation }, "service", Identifier, "{", { OperationDeclaration | OnewayOperationDeclaration }, "}";