/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.java2dart.processor;
import com.google.dart.engine.ast.AstNode;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.engine.ast.Expression;
import com.google.dart.engine.ast.MethodInvocation;
import com.google.dart.engine.ast.PrefixExpression;
import com.google.dart.engine.ast.visitor.GeneralizingAstVisitor;
import com.google.dart.engine.scanner.Keyword;
import com.google.dart.engine.scanner.TokenType;
import com.google.dart.java2dart.Context;
import static com.google.dart.java2dart.util.AstFactory.binaryExpression;
import static com.google.dart.java2dart.util.AstFactory.identifier;
import static com.google.dart.java2dart.util.AstFactory.instanceCreationExpression;
import static com.google.dart.java2dart.util.AstFactory.listLiteral;
import static com.google.dart.java2dart.util.AstFactory.mapLiteral;
import static com.google.dart.java2dart.util.AstFactory.propertyAccess;
import static com.google.dart.java2dart.util.AstFactory.typeName;
import static com.google.dart.java2dart.util.TokenFactory.token;
import java.util.List;
/**
* {@link SemanticProcessor} for Google Guava.
*/
public class GuavaSemanticProcessor extends SemanticProcessor {
private static boolean isNegationParent(AstNode node) {
if (node.getParent() instanceof PrefixExpression) {
PrefixExpression prefixExpression = (PrefixExpression) node.getParent();
return prefixExpression.getOperator().getType() == TokenType.BANG;
}
return false;
}
public GuavaSemanticProcessor(Context context) {
super(context);
}
@Override
public void process(final CompilationUnit unit) {
unit.accept(new GeneralizingAstVisitor<Void>() {
@Override
public Void visitMethodInvocation(MethodInvocation node) {
super.visitMethodInvocation(node);
List<Expression> args = node.getArgumentList().getArguments();
if (isMethodInClass(node, "equal", "com.google.common.base.Objects")) {
AstNode toReplace = node;
TokenType operator = TokenType.EQ_EQ;
if (isNegationParent(node)) {
operator = TokenType.BANG_EQ;
toReplace = node.getParent();
}
replaceNode(toReplace, binaryExpression(args.get(0), operator, args.get(1)));
return null;
}
if (isMethodInClass(node, "hashCode", "com.google.common.base.Objects")) {
replaceNode(node.getTarget(), identifier("JavaArrays"));
node.getMethodName().setToken(token("makeHashCode"));
return null;
}
if (isMethodInClass(node, "of", "com.google.common.collect.ImmutableList")) {
replaceNode(node, listLiteral());
return null;
}
if (isMethodInClass(node, "of", "com.google.common.collect.ImmutableMap")) {
replaceNode(node, instanceCreationExpression(Keyword.NEW, typeName("Map")));
return null;
}
if (isMethodInClass(node, "getLast", "com.google.common.collect.Iterables")) {
replaceNode(node, propertyAccess(args.get(0), identifier("last")));
return null;
}
if (isMethodInClass(node, "newArrayList", "com.google.common.collect.Lists")) {
replaceNode(node, listLiteral());
return null;
}
if (isMethodInClass(node, "newLinkedList", "com.google.common.collect.Lists")) {
replaceNode(node, instanceCreationExpression(Keyword.NEW, typeName("Queue")));
return null;
}
if (isMethodInClass(node, "newHashMap", "com.google.common.collect.Maps")) {
replaceNode(node, mapLiteral());
return null;
}
if (isMethodInClass(node, "newLinkedHashMap", "com.google.common.collect.Maps")) {
replaceNode(node, instanceCreationExpression(Keyword.NEW, typeName("LinkedHashMap")));
return null;
}
if (isMethodInClass(node, "difference", "com.google.common.collect.Sets")) {
node.setTarget(args.get(0));
args.remove(0);
return null;
}
if (isMethodInClass(node, "newHashSet", "com.google.common.collect.Sets")) {
replaceNode(node, instanceCreationExpression(Keyword.NEW, typeName("Set")));
return null;
}
if (isMethodInClass(node, "newLinkedHashSet", "com.google.common.collect.Sets")) {
replaceNode(node, instanceCreationExpression(Keyword.NEW, typeName("LinkedHashSet")));
return null;
}
return null;
}
});
}
}