Prevent JS AST nodes of several types to be shared

This commit is contained in:
Alexey Andreev
2017-05-05 17:42:43 +03:00
parent 3077a0f640
commit e9a2c8c0f1
73 changed files with 537 additions and 485 deletions
@@ -19,14 +19,14 @@ package org.jetbrains.kotlin.serialization.js.ast
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.*
import org.jetbrains.kotlin.protobuf.CodedInputStream
import org.jetbrains.kotlin.resolve.inline.InlineStrategy as KotlinInlineStrategy
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.*
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Expression.ExpressionCase
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.Statement.StatementCase
import java.io.InputStream
import java.util.*
import org.jetbrains.kotlin.resolve.inline.InlineStrategy as KotlinInlineStrategy
class JsAstDeserializer(private val program: JsProgram) {
class JsAstDeserializer(program: JsProgram) {
private val scope = JsRootScope(program)
private val stringTable = mutableListOf<String>()
private val nameTable = mutableListOf<Name>()
@@ -263,13 +263,13 @@ class JsAstDeserializer(private val program: JsProgram) {
}
private fun deserializeNoMetadata(proto: Expression): JsExpression = when (proto.expressionCase) {
ExpressionCase.THIS_LITERAL -> JsLiteral.THIS
ExpressionCase.NULL_LITERAL -> JsLiteral.NULL
ExpressionCase.TRUE_LITERAL -> JsLiteral.TRUE
ExpressionCase.FALSE_LITERAL -> JsLiteral.FALSE
ExpressionCase.STRING_LITERAL -> program.getStringLiteral(deserializeString(proto.stringLiteral))
ExpressionCase.INT_LITERAL -> program.getNumberLiteral(proto.intLiteral)
ExpressionCase.DOUBLE_LITERAL -> program.getNumberLiteral(proto.doubleLiteral)
ExpressionCase.THIS_LITERAL -> JsThisRef()
ExpressionCase.NULL_LITERAL -> JsNullLiteral()
ExpressionCase.TRUE_LITERAL -> JsBooleanLiteral(true)
ExpressionCase.FALSE_LITERAL -> JsBooleanLiteral(false)
ExpressionCase.STRING_LITERAL -> JsStringLiteral(deserializeString(proto.stringLiteral))
ExpressionCase.INT_LITERAL -> JsIntLiteral(proto.intLiteral)
ExpressionCase.DOUBLE_LITERAL -> JsDoubleLiteral(proto.doubleLiteral)
ExpressionCase.SIMPLE_NAME_REFERENCE -> JsNameRef(deserializeName(proto.simpleNameReference))
ExpressionCase.REG_EXP_LITERAL -> {
@@ -510,9 +510,7 @@ class JsAstDeserializer(private val program: JsProgram) {
}
val node = action()
if (deserializedLocation != null) {
if (node !is JsLiteral.JsBooleanLiteral && node !is JsLiteral.JsThisRef && node !is JsNullLiteral) {
node.source = deserializedLocation
}
node.source = deserializedLocation
}
if (shouldUpdateFile) {
fileStack.pop()
@@ -271,7 +271,7 @@ class JsAstSerializer {
val visitor = object : JsVisitor() {
val builder = Expression.newBuilder()
override fun visitThis(x: JsLiteral.JsThisRef) {
override fun visitThis(x: JsThisRef) {
builder.thisLiteral = ThisLiteral.newBuilder().build()
}
@@ -279,7 +279,7 @@ class JsAstSerializer {
builder.nullLiteral = NullLiteral.newBuilder().build()
}
override fun visitBoolean(x: JsLiteral.JsBooleanLiteral) {
override fun visitBoolean(x: JsBooleanLiteral) {
if (x.value) {
builder.trueLiteral = TrueLiteral.newBuilder().build()
}
@@ -299,11 +299,11 @@ class JsAstSerializer {
builder.regExpLiteral = regExpBuilder.build()
}
override fun visitInt(x: JsNumberLiteral.JsIntLiteral) {
override fun visitInt(x: JsIntLiteral) {
builder.intLiteral = x.value
}
override fun visitDouble(x: JsNumberLiteral.JsDoubleLiteral) {
override fun visitDouble(x: JsDoubleLiteral) {
builder.doubleLiteral = x.value
}