JS: added type parameter to JsContext

This commit is contained in:
Alexey Tsvetkov
2015-03-27 15:58:39 +03:00
parent efba2a2372
commit e94c79f838
13 changed files with 50 additions and 52 deletions
@@ -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<T extends JsNode> {
public abstract boolean canInsert();
boolean canRemove();
public abstract boolean canRemove();
void insertAfter(JsNode node);
public abstract <R extends T> void insertAfter(R node);
void insertBefore(JsNode node);
public abstract <R extends T> void insertBefore(R node);
boolean isLvalue();
public abstract boolean isLvalue();
void removeMe();
public abstract void removeMe();
void replaceMe(JsNode node);
public abstract <R extends T> void replaceMe(R node);
@Nullable
JsNode getCurrentNode();
public abstract T getCurrentNode();
}
@@ -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)
}
@@ -47,7 +47,7 @@ public abstract class JsVisitorWithContext {
return (T) doAcceptStatement(statement);
}
public final <T extends JsStatement> void acceptStatementList(List<T> statements) {
public final void acceptStatementList(List<JsStatement> statements) {
doAcceptStatementList(statements);
}
@@ -360,7 +360,7 @@ public abstract class JsVisitorWithContext {
protected abstract <T extends JsStatement> JsStatement doAcceptStatement(T statement);
protected abstract <T extends JsStatement> void doAcceptStatementList(List<T> statements);
protected abstract void doAcceptStatementList(List<JsStatement> statements);
protected abstract <T extends JsNode> void doTraverse(T node, JsContext ctx) ;
}
@@ -34,9 +34,9 @@ import java.util.Stack;
*/
public class JsVisitorWithContextImpl extends JsVisitorWithContext {
private final Stack<JsContext> statementContexts = new Stack<JsContext>();
private final Stack<JsContext<JsStatement>> statementContexts = new Stack<JsContext<JsStatement>>();
public class ListContext<T extends JsNode> implements JsContext {
public class ListContext<T extends JsNode> extends JsContext<T> {
private List<T> collection;
private int index;
@@ -51,13 +51,13 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext {
}
@Override
public void insertAfter(JsNode node) {
public <R extends T> void insertAfter(R node) {
//noinspection unchecked
collection.add(index + 1, (T) node);
}
@Override
public void insertBefore(JsNode node) {
public <R extends T> 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 <R extends T> 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<T extends JsNode> implements JsContext {
private class NodeContext<T extends JsNode> extends JsContext<T> {
protected T node;
@Override
@@ -120,12 +118,12 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext {
}
@Override
public void insertAfter(JsNode node) {
public <R extends T> void insertAfter(R node) {
throw new UnsupportedOperationException();
}
@Override
public void insertBefore(JsNode node) {
public <R extends T> void insertBefore(R node) {
throw new UnsupportedOperationException();
}
@@ -140,14 +138,14 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext {
}
@Override
public void replaceMe(JsNode node) {
public <R extends T> 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 <T extends JsStatement> void doAcceptStatementList(List<T> statements) {
ListContext<T> context = new ListContext<T>();
protected void doAcceptStatementList(List<JsStatement> statements) {
ListContext<JsStatement> context = new ListContext<JsStatement>();
statementContexts.push(context);
context.traverse(statements);
statementContexts.pop();
@@ -198,7 +196,7 @@ public class JsVisitorWithContextImpl extends JsVisitorWithContext {
}
@NotNull
protected JsContext getLastStatementLevelContext() {
protected JsContext<JsStatement> getLastStatementLevelContext() {
return statementContexts.peek();
}