diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java index ae859fc93d4..7716fc1cdaa 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java @@ -11,21 +11,21 @@ import org.jetbrains.annotations.Nullable; * possible operations a JsVisitor subclass can perform on the currently visited * node. */ -public interface JsContext { - boolean canInsert(); +public abstract class JsContext { + public abstract boolean canInsert(); - boolean canRemove(); + public abstract boolean canRemove(); - void insertAfter(JsNode node); + public abstract void insertAfter(R node); - void insertBefore(JsNode node); + public abstract void insertBefore(R node); - boolean isLvalue(); + public abstract boolean isLvalue(); - void removeMe(); + public abstract void removeMe(); - void replaceMe(JsNode node); + public abstract void replaceMe(R node); @Nullable - JsNode getCurrentNode(); + public abstract T getCurrentNode(); } diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.kt b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.kt index 01a409e27a0..2233a64af81 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.kt +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.kt @@ -10,7 +10,7 @@ public object JsEmpty : SourceInfoAwareJsNode(), JsStatement { v.visitEmpty(this) } - override fun traverse(v: JsVisitorWithContext, ctx: JsContext) { + override fun traverse(v: JsVisitorWithContext, ctx: JsContext<*>) { v.visit(this, ctx) v.endVisit(this, ctx) } diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContext.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContext.java index 6ff6b7d1c75..9d4224e686e 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContext.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContext.java @@ -47,7 +47,7 @@ public abstract class JsVisitorWithContext { return (T) doAcceptStatement(statement); } - public final void acceptStatementList(List statements) { + public final void acceptStatementList(List statements) { doAcceptStatementList(statements); } @@ -360,7 +360,7 @@ public abstract class JsVisitorWithContext { protected abstract JsStatement doAcceptStatement(T statement); - protected abstract void doAcceptStatementList(List statements); + protected abstract void doAcceptStatementList(List statements); protected abstract void doTraverse(T node, JsContext ctx) ; } diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContextImpl.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContextImpl.java index 2114ac86054..839b1a679ce 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContextImpl.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsVisitorWithContextImpl.java @@ -34,9 +34,9 @@ import java.util.Stack; */ public class JsVisitorWithContextImpl extends JsVisitorWithContext { - private final Stack statementContexts = new Stack(); + private final Stack> statementContexts = new Stack>(); - public class ListContext implements JsContext { + public class ListContext extends JsContext { private List collection; private int index; @@ -51,13 +51,13 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @Override - public void insertAfter(JsNode node) { + public void insertAfter(R node) { //noinspection unchecked collection.add(index + 1, (T) node); } @Override - public void insertBefore(JsNode node) { + public void insertBefore(R node) { //noinspection unchecked collection.add(index++, (T) node); } @@ -73,15 +73,14 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @Override - public void replaceMe(JsNode node) { + public void replaceMe(R node) { checkReplacement(collection.get(index), node); - //noinspection unchecked - collection.set(index, (T) node); + collection.set(index, node); } @Nullable @Override - public JsNode getCurrentNode() { + public T getCurrentNode() { if (index < collection.size()) { return collection.get(index); } @@ -105,8 +104,7 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } } - @SuppressWarnings("unchecked") - private class NodeContext implements JsContext { + private class NodeContext extends JsContext { protected T node; @Override @@ -120,12 +118,12 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @Override - public void insertAfter(JsNode node) { + public void insertAfter(R node) { throw new UnsupportedOperationException(); } @Override - public void insertBefore(JsNode node) { + public void insertBefore(R node) { throw new UnsupportedOperationException(); } @@ -140,14 +138,14 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @Override - public void replaceMe(JsNode node) { + public void replaceMe(R node) { checkReplacement(this.node, node); - this.node = (T) node; + this.node = node; } @Nullable @Override - public JsNode getCurrentNode() { + public T getCurrentNode() { return node; } @@ -185,8 +183,8 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @Override - protected void doAcceptStatementList(List statements) { - ListContext context = new ListContext(); + protected void doAcceptStatementList(List statements) { + ListContext context = new ListContext(); statementContexts.push(context); context.traverse(statements); statementContexts.pop(); @@ -198,7 +196,7 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext { } @NotNull - protected JsContext getLastStatementLevelContext() { + protected JsContext getLastStatementLevelContext() { return statementContexts.peek(); } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt index 8b69ecdb5b6..e9864b48957 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt @@ -149,7 +149,7 @@ private fun JsFunction.markInlineArguments(descriptor: CallableDescriptor) { } val visitor = object: JsVisitorWithContextImpl() { - override fun endVisit(x: JsInvocation?, ctx: JsContext?) { + override fun endVisit(x: JsInvocation?, ctx: JsContext<*>?) { if (x == null || ctx == null) return val qualifier: JsExpression? @@ -180,7 +180,7 @@ private fun replaceExternalNames(function: JsFunction, externalReplacements: Map if (replacements.isEmpty()) return val visitor = object: JsVisitorWithContextImpl() { - override fun endVisit(x: JsNameRef?, ctx: JsContext?) { + override fun endVisit(x: JsNameRef?, ctx: JsContext<*>?) { if (x == null || x.getQualifier() != null) return replacements[x.getIdent()]?.let { diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/NodeRemover.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/NodeRemover.kt index b38ba635de1..00423810be6 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/NodeRemover.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/NodeRemover.kt @@ -22,7 +22,7 @@ import com.google.dart.compiler.backend.js.ast.JsContext private class NodeRemover(val klass: Class, val predicate: (T) -> Boolean): JsVisitorWithContextImpl() { - override fun doTraverse(node: T?, ctx: JsContext?) { + override fun doTraverse(node: T?, ctx: JsContext<*>?) { if (node == null || ctx == null) return if (klass.isInstance(node)) { diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedFunctionDefinitions.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedFunctionDefinitions.kt index 1a3bc618f42..3af1c75e1bf 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedFunctionDefinitions.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedFunctionDefinitions.kt @@ -66,7 +66,7 @@ private class UnusedLocalFunctionsCollector(functions: Map) } } - override fun visit(x: JsPropertyInitializer?, ctx: JsContext?): Boolean { + override fun visit(x: JsPropertyInitializer?, ctx: JsContext<*>?): Boolean { val value = x?.getValueExpr() return when (value) { @@ -75,17 +75,17 @@ private class UnusedLocalFunctionsCollector(functions: Map) } } - override fun visit(x: JsFunction?, ctx: JsContext?): Boolean { + override fun visit(x: JsFunction?, ctx: JsContext<*>?): Boolean { return !(wasProcessed(x)) } - override fun endVisit(x: JsFunction?, ctx: JsContext?) { + override fun endVisit(x: JsFunction?, ctx: JsContext<*>?) { if (x == null) return processed.add(x) } - override fun endVisit(x: JsNameRef?, ctx: JsContext?) { + override fun endVisit(x: JsNameRef?, ctx: JsContext<*>?) { val name = x?.getName() if (isFunctionReference(x) && name != null) { tracker.markReachable(name) diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedLocalFunctionDeclarations.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedLocalFunctionDeclarations.kt index 7709fd75daa..349d4d7ef19 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedLocalFunctionDeclarations.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/removeUnusedLocalFunctionDeclarations.kt @@ -45,7 +45,7 @@ private class UnusedInstanceCollector : JsVisitorWithContextImpl() { public val removableDeclarations: List get() = tracker.removable - override fun visit(x: JsVars.JsVar?, ctx: JsContext?): Boolean { + override fun visit(x: JsVars.JsVar?, ctx: JsContext<*>?): Boolean { if (x == null) return false if (!isLocalFunctionDeclaration(x)) return super.visit(x, ctx) @@ -64,7 +64,7 @@ private class UnusedInstanceCollector : JsVisitorWithContextImpl() { return false } - override fun visit(x: JsNameRef?, ctx: JsContext?): Boolean { + override fun visit(x: JsNameRef?, ctx: JsContext<*>?): Boolean { val name = x?.getName() if (name != null) { diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectors/ReferenceNameCollector.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectors/ReferenceNameCollector.kt index d7844b3a8c1..cbef182a301 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectors/ReferenceNameCollector.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectors/ReferenceNameCollector.kt @@ -28,7 +28,7 @@ class ReferenceNameCollector : JsVisitorWithContextImpl() { public val references: List get() = referenceSet.toList() - override fun endVisit(x: JsNameRef?, ctx: JsContext?) { + override fun endVisit(x: JsNameRef?, ctx: JsContext<*>?) { val name = x?.getName() if (name != null) { referenceSet.add(name) diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/LabelNameRefreshingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/LabelNameRefreshingVisitor.kt index 1fde2d21ceb..ff22732ae44 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/LabelNameRefreshingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/LabelNameRefreshingVisitor.kt @@ -24,9 +24,9 @@ import com.google.dart.compiler.backend.js.ast.JsContext import com.google.dart.compiler.backend.js.ast.JsLabel class LabelNameRefreshingVisitor(val context: NamingContext, val functionScope: JsFunctionScope) : JsVisitorWithContextImpl() { - override fun visit(x: JsFunction?, ctx: JsContext?): Boolean = false + override fun visit(x: JsFunction?, ctx: JsContext<*>?): Boolean = false - override fun visit(x: JsLabel?, ctx: JsContext?): Boolean { + override fun visit(x: JsLabel?, ctx: JsContext<*>?): Boolean { val labelName = x!!.getName() val freshName = functionScope.enterLabel(labelName.getIdent()) @@ -37,7 +37,7 @@ class LabelNameRefreshingVisitor(val context: NamingContext, val functionScope: return super.visit(x, ctx) } - override fun endVisit(x: JsLabel?, ctx: JsContext?) { + override fun endVisit(x: JsLabel?, ctx: JsContext<*>?) { super.endVisit(x, ctx) functionScope.exitLabel() } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt index 2ca8a6809e5..274f8c61bda 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt @@ -27,7 +27,7 @@ import com.google.dart.compiler.backend.js.ast.JsLabel class NameReplacingVisitor(private val replaceMap: Map) : JsVisitorWithContextImpl() { - override fun endVisit(x: JsNameRef?, ctx: JsContext?) { + override fun endVisit(x: JsNameRef?, ctx: JsContext<*>?) { if (x == null || ctx == null) return val replacement = replaceMap[x.getName()] @@ -36,7 +36,7 @@ class NameReplacingVisitor(private val replaceMap: Map) : ctx.replaceMe(replacement) } - override fun endVisit(x: JsVars.JsVar?, ctx: JsContext?) { + override fun endVisit(x: JsVars.JsVar?, ctx: JsContext<*>?) { if (x == null || ctx == null) return val replacement = replaceMap[x.getName()] @@ -46,7 +46,7 @@ class NameReplacingVisitor(private val replaceMap: Map) : } } - override fun endVisit(x: JsLabel?, ctx: JsContext?) { + override fun endVisit(x: JsLabel?, ctx: JsContext<*>?) { if (x == null || ctx == null) return val replacement = replaceMap[x.getName()] diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt index c392140ed63..53abf072419 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt @@ -33,14 +33,14 @@ class ReturnReplacingVisitor(private val resultRef: JsNameRef?, private val brea /** * Prevents replacing returns in object literal */ - override fun visit(x: JsObjectLiteral?, ctx: JsContext?): Boolean = false + override fun visit(x: JsObjectLiteral?, ctx: JsContext<*>?): Boolean = false /** * Prevents replacing returns in inner function */ - override fun visit(x: JsFunction?, ctx: JsContext?): Boolean = false + override fun visit(x: JsFunction?, ctx: JsContext<*>?): Boolean = false - override fun endVisit(x: JsReturn?, ctx: JsContext?) { + override fun endVisit(x: JsReturn?, ctx: JsContext<*>?) { if (x == null || ctx == null) return if (breakLabel != null) { diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ThisReplacingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ThisReplacingVisitor.kt index 33ff54524ad..a3dfda47f89 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ThisReplacingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ThisReplacingVisitor.kt @@ -24,11 +24,11 @@ import com.google.dart.compiler.backend.js.ast.JsObjectLiteral import com.google.dart.compiler.backend.js.ast.JsVisitorWithContextImpl class ThisReplacingVisitor(private val thisReplacement: JsExpression) : JsVisitorWithContextImpl() { - override fun endVisit(x: JsLiteral.JsThisRef?, ctx: JsContext?) { + override fun endVisit(x: JsLiteral.JsThisRef?, ctx: JsContext<*>?) { ctx?.replaceMe(thisReplacement) } - override fun visit(x: JsFunction?, ctx: JsContext?) = false + override fun visit(x: JsFunction?, ctx: JsContext<*>?) = false - override fun visit(x: JsObjectLiteral?, ctx: JsContext?) = false + override fun visit(x: JsObjectLiteral?, ctx: JsContext<*>?) = false }