[JS IR] Drop StableNamesCollector.kt
This commit is contained in:
committed by
Space Team
parent
99e93258cd
commit
f1bce9fad4
+28
-1
@@ -5,13 +5,40 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
|
package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.RESERVED_IDENTIFIERS
|
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
import org.jetbrains.kotlin.js.common.isValidES5Identifier
|
import org.jetbrains.kotlin.js.common.isValidES5Identifier
|
||||||
import org.jetbrains.kotlin.serialization.js.ModuleKind
|
import org.jetbrains.kotlin.serialization.js.ModuleKind
|
||||||
|
|
||||||
object ModuleWrapperTranslation {
|
object ModuleWrapperTranslation {
|
||||||
object Namer {
|
object Namer {
|
||||||
|
private val RESERVED_IDENTIFIERS = setOf(
|
||||||
|
// keywords
|
||||||
|
"await", "break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if",
|
||||||
|
"in", "instanceof", "new", "return", "switch", "throw", "try", "typeof", "var", "void", "while", "with",
|
||||||
|
|
||||||
|
// future reserved words
|
||||||
|
"class", "const", "enum", "export", "extends", "import", "super",
|
||||||
|
|
||||||
|
// as future reserved words in strict mode
|
||||||
|
"implements", "interface", "let", "package", "private", "protected", "public", "static", "yield",
|
||||||
|
|
||||||
|
// additional reserved words
|
||||||
|
"null", "true", "false",
|
||||||
|
|
||||||
|
// disallowed as variable names in strict mode
|
||||||
|
"eval", "arguments",
|
||||||
|
|
||||||
|
// global identifiers usually declared in a typical JS interpreter
|
||||||
|
"NaN", "isNaN", "Infinity", "undefined",
|
||||||
|
|
||||||
|
"Error", "Object", "Number", "String",
|
||||||
|
|
||||||
|
"Math", "String", "Boolean", "Date", "Array", "RegExp", "JSON", "Map",
|
||||||
|
|
||||||
|
// global identifiers usually declared in know environments (node.js, browser, require.js, WebWorkers, etc)
|
||||||
|
"require", "define", "module", "window", "self", "globalThis"
|
||||||
|
)
|
||||||
|
|
||||||
fun requiresEscaping(name: String) =
|
fun requiresEscaping(name: String) =
|
||||||
!name.isValidES5Identifier() || name in RESERVED_IDENTIFIERS
|
!name.isValidES5Identifier() || name in RESERVED_IDENTIFIERS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrClassModel
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.js.backend.ast.JsCompositeBlock
|
import org.jetbrains.kotlin.js.backend.ast.JsCompositeBlock
|
||||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
|
||||||
|
|
||||||
|
|
||||||
class JsStaticContext(
|
class JsStaticContext(
|
||||||
@@ -21,7 +20,6 @@ class JsStaticContext(
|
|||||||
) : IrNamer by irNamer {
|
) : IrNamer by irNamer {
|
||||||
val intrinsics = JsIntrinsicTransformers(backendContext)
|
val intrinsics = JsIntrinsicTransformers(backendContext)
|
||||||
val classModels = mutableMapOf<IrClassSymbol, JsIrClassModel>()
|
val classModels = mutableMapOf<IrClassSymbol, JsIrClassModel>()
|
||||||
val coroutineImplDeclaration = backendContext.ir.symbols.coroutineImpl.owner
|
|
||||||
|
|
||||||
val initializerBlock = JsCompositeBlock()
|
val initializerBlock = JsCompositeBlock()
|
||||||
}
|
}
|
||||||
|
|||||||
-118
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.utils
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
|
||||||
|
|
||||||
class StableNamesCollector : IrElementVisitorVoid {
|
|
||||||
val staticNames = mutableSetOf<String>()
|
|
||||||
val memberNames = mutableSetOf<String>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
staticNames.addAll(RESERVED_IDENTIFIERS)
|
|
||||||
staticNames.add(Namer.IMPLICIT_RECEIVER_NAME)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitElement(element: IrElement) {
|
|
||||||
element.acceptChildrenVoid(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitDeclaration(declaration: IrDeclarationBase) {
|
|
||||||
super.visitDeclaration(declaration)
|
|
||||||
|
|
||||||
if (declaration !is IrDeclarationWithName)
|
|
||||||
return
|
|
||||||
|
|
||||||
val isStatic = declaration.hasStaticDispatch()
|
|
||||||
|
|
||||||
val scope =
|
|
||||||
if (isStatic)
|
|
||||||
staticNames
|
|
||||||
else
|
|
||||||
memberNames
|
|
||||||
|
|
||||||
val stableName =
|
|
||||||
if (declaration.isEffectivelyExternal())
|
|
||||||
stableNameForExternalDeclaration(declaration)
|
|
||||||
else
|
|
||||||
stableNameForNonExternalDeclaration(declaration, isStatic)
|
|
||||||
|
|
||||||
scope.addIfNotNull(stableName)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun stableNameForNonExternalDeclaration(declaration: IrDeclarationWithName, isStatic: Boolean): String? =
|
|
||||||
declaration.getJsName() ?: run {
|
|
||||||
// TODO: since following code affects local variable naming some weird behaviour of js("..") is possible
|
|
||||||
// Remove check once 1. `js` function is re-designed and re-implemented, 2. JsExport is properly implemented
|
|
||||||
if (!isStatic) {
|
|
||||||
// Make sure property defined on prototype has stable name
|
|
||||||
val simpleFunction = declaration as? IrSimpleFunction
|
|
||||||
val property = simpleFunction?.correspondingPropertySymbol?.owner
|
|
||||||
property?.getJsNameOrKotlinName()?.identifier
|
|
||||||
} else null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun stableNameForExternalDeclaration(declaration: IrDeclarationWithName): String? {
|
|
||||||
if (declaration.isPropertyAccessor ||
|
|
||||||
declaration.isPropertyField ||
|
|
||||||
declaration is IrConstructor
|
|
||||||
) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
val importedFromModuleOnly = declaration.isImportedFromModuleOnly()
|
|
||||||
|
|
||||||
val jsName = declaration.getJsName()
|
|
||||||
val jsQualifier = declaration.fileOrNull?.getJsQualifier()
|
|
||||||
|
|
||||||
return when {
|
|
||||||
importedFromModuleOnly ->
|
|
||||||
null
|
|
||||||
|
|
||||||
jsQualifier != null ->
|
|
||||||
jsQualifier.substringBefore('.')
|
|
||||||
|
|
||||||
jsName != null ->
|
|
||||||
jsName
|
|
||||||
|
|
||||||
else ->
|
|
||||||
declaration.name.identifier
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val RESERVED_IDENTIFIERS = setOf(
|
|
||||||
// keywords
|
|
||||||
"await", "break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if",
|
|
||||||
"in", "instanceof", "new", "return", "switch", "throw", "try", "typeof", "var", "void", "while", "with",
|
|
||||||
|
|
||||||
// future reserved words
|
|
||||||
"class", "const", "enum", "export", "extends", "import", "super",
|
|
||||||
|
|
||||||
// as future reserved words in strict mode
|
|
||||||
"implements", "interface", "let", "package", "private", "protected", "public", "static", "yield",
|
|
||||||
|
|
||||||
// additional reserved words
|
|
||||||
"null", "true", "false",
|
|
||||||
|
|
||||||
// disallowed as variable names in strict mode
|
|
||||||
"eval", "arguments",
|
|
||||||
|
|
||||||
// global identifiers usually declared in a typical JS interpreter
|
|
||||||
"NaN", "isNaN", "Infinity", "undefined",
|
|
||||||
|
|
||||||
"Error", "Object", "Number", "String",
|
|
||||||
|
|
||||||
"Math", "String", "Boolean", "Date", "Array", "RegExp", "JSON", "Map",
|
|
||||||
|
|
||||||
// global identifiers usually declared in know environments (node.js, browser, require.js, WebWorkers, etc)
|
|
||||||
"require", "define", "module", "window", "self", "globalThis"
|
|
||||||
)
|
|
||||||
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
|
|||||||
import org.jetbrains.kotlin.ir.util.isMethodOfAny
|
import org.jetbrains.kotlin.ir.util.isMethodOfAny
|
||||||
import org.jetbrains.kotlin.ir.util.isTopLevel
|
import org.jetbrains.kotlin.ir.util.isTopLevel
|
||||||
import org.jetbrains.kotlin.ir.util.isTopLevelDeclaration
|
import org.jetbrains.kotlin.ir.util.isTopLevelDeclaration
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
fun TODO(element: IrElement): Nothing = TODO(element::class.java.simpleName + " is not supported yet here")
|
fun TODO(element: IrElement): Nothing = TODO(element::class.java.simpleName + " is not supported yet here")
|
||||||
|
|||||||
Reference in New Issue
Block a user