Disambiguate type alias declarations from type() calls
This commit is contained in:
parent
d82a9bb930
commit
c35efdc2ae
@ -565,6 +565,37 @@ class Compiler(
|
|||||||
return typeParams
|
return typeParams
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun looksLikeTypeAliasDeclaration(): Boolean {
|
||||||
|
val saved = cc.savePos()
|
||||||
|
try {
|
||||||
|
val nameTok = cc.nextNonWhitespace()
|
||||||
|
if (nameTok.type != Token.Type.ID) return false
|
||||||
|
val afterName = cc.savePos()
|
||||||
|
if (cc.skipTokenOfType(Token.Type.LT, isOptional = true)) {
|
||||||
|
var depth = 1
|
||||||
|
while (depth > 0) {
|
||||||
|
val t = cc.nextNonWhitespace()
|
||||||
|
when (t.type) {
|
||||||
|
Token.Type.LT -> depth += 1
|
||||||
|
Token.Type.GT -> depth -= 1
|
||||||
|
Token.Type.SHR -> {
|
||||||
|
cc.pushPendingGT()
|
||||||
|
depth -= 1
|
||||||
|
}
|
||||||
|
Token.Type.EOF -> return false
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cc.restorePos(afterName)
|
||||||
|
}
|
||||||
|
cc.skipWsTokens()
|
||||||
|
return cc.peekNextNonWhitespace().type == Token.Type.ASSIGN
|
||||||
|
} finally {
|
||||||
|
cc.restorePos(saved)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun parseTypeAliasDeclaration(): Statement {
|
private suspend fun parseTypeAliasDeclaration(): Statement {
|
||||||
if (codeContexts.lastOrNull() is CodeContext.ClassBody) {
|
if (codeContexts.lastOrNull() is CodeContext.ClassBody) {
|
||||||
throw ScriptError(cc.currentPos(), "type alias is not allowed in class body")
|
throw ScriptError(cc.currentPos(), "type alias is not allowed in class body")
|
||||||
@ -4667,6 +4698,7 @@ class Compiler(
|
|||||||
"type" -> {
|
"type" -> {
|
||||||
pendingDeclStart = id.pos
|
pendingDeclStart = id.pos
|
||||||
pendingDeclDoc = consumePendingDoc()
|
pendingDeclDoc = consumePendingDoc()
|
||||||
|
if (!looksLikeTypeAliasDeclaration()) return null
|
||||||
parseTypeAliasDeclaration()
|
parseTypeAliasDeclaration()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user