use of org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument in project android by JetBrains.
the class GradleDslLiteral method create.
@Override
@Nullable
public GroovyPsiElement create() {
if (!(myParent instanceof GradleDslExpressionMap)) {
return super.create();
}
// This is a value in the map element we need to create a named argument for it.
GroovyPsiElement parentPsiElement = myParent.create();
if (parentPsiElement == null) {
return null;
}
setPsiElement(parentPsiElement);
GrLiteral newLiteral = createLiteral();
if (newLiteral == null) {
return null;
}
GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(newLiteral.getProject());
GrNamedArgument namedArgument = factory.createNamedArgument(myName, newLiteral);
PsiElement added;
if (parentPsiElement instanceof GrArgumentList) {
added = ((GrArgumentList) parentPsiElement).addNamedArgument(namedArgument);
} else {
added = parentPsiElement.addAfter(namedArgument, parentPsiElement.getLastChild());
}
if (added instanceof GrNamedArgument) {
GrNamedArgument addedNameArgument = (GrNamedArgument) added;
GrLiteral literal = getChildOfType(addedNameArgument, GrLiteral.class);
if (literal != null) {
myExpression = literal;
setModified(false);
return getPsiElement();
}
}
return null;
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument in project android by JetBrains.
the class GradleDslParser method parse.
private static boolean parse(@NotNull GrApplicationStatement statement, @NotNull GradlePropertiesDslElement blockElement) {
GrReferenceExpression referenceExpression = getChildOfType(statement, GrReferenceExpression.class);
if (referenceExpression == null) {
return false;
}
GrCommandArgumentList argumentList = getNextSiblingOfType(referenceExpression, GrCommandArgumentList.class);
if (argumentList == null) {
return false;
}
GroovyPsiElement[] arguments = argumentList.getAllArguments();
if (arguments.length == 0) {
return false;
}
String name = referenceExpression.getText();
if (isEmpty(name)) {
return false;
}
List<String> nameSegments = Splitter.on('.').splitToList(name);
if (nameSegments.size() > 1) {
GradlePropertiesDslElement nestedElement = getBlockElement(nameSegments.subList(0, nameSegments.size() - 1), blockElement);
if (nestedElement != null) {
blockElement = nestedElement;
} else {
return false;
}
}
String propertyName = nameSegments.get(nameSegments.size() - 1);
GradleDslElement propertyElement = null;
if (arguments.length == 1) {
GroovyPsiElement element = arguments[0];
if (element instanceof GrExpression) {
propertyElement = getExpressionElement(blockElement, argumentList, propertyName, (GrExpression) element);
} else if (element instanceof GrNamedArgument) {
// ex: manifestPlaceholders activityLabel:"defaultName"
propertyElement = getExpressionMap(blockElement, argumentList, propertyName, (GrNamedArgument) element);
}
} else {
if (arguments[0] instanceof GrExpression) {
// ex: proguardFiles 'proguard-android.txt', 'proguard-rules.pro'
GrExpression[] expressions = new GrExpression[arguments.length];
for (int i = 0; i < expressions.length; i++) {
expressions[i] = (GrExpression) arguments[i];
}
propertyElement = getExpressionList(blockElement, argumentList, propertyName, expressions);
} else if (arguments[0] instanceof GrNamedArgument) {
// ex: manifestPlaceholders activityLabel1:"defaultName1", activityLabel2:"defaultName2"
GrNamedArgument[] namedArguments = new GrNamedArgument[arguments.length];
for (int i = 0; i < arguments.length; i++) {
namedArguments[i] = (GrNamedArgument) arguments[i];
}
propertyElement = getExpressionMap(blockElement, argumentList, propertyName, namedArguments);
}
}
if (propertyElement == null) {
return false;
}
GroovyPsiElement lastArgument = arguments[arguments.length - 1];
if (lastArgument instanceof GrClosableBlock) {
propertyElement.setParsedClosureElement(getClosureElement(propertyElement, (GrClosableBlock) lastArgument, name));
}
blockElement.addParsedElement(propertyName, propertyElement);
return true;
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument in project android by JetBrains.
the class GradleGroovyFile method getNamedArgumentValues.
/**
* If the given method takes named arguments, returns those arguments as a name:value map. Returns an empty map otherwise.
*/
@NotNull
protected static Map<String, Object> getNamedArgumentValues(@NotNull GrMethodCall gmc) {
GrArgumentList argumentList = gmc.getArgumentList();
Map<String, Object> values = Maps.newHashMap();
for (GrNamedArgument grNamedArgument : getTypedArguments(argumentList, GrNamedArgument.class)) {
values.put(grNamedArgument.getLabelName(), parseValueExpression(grNamedArgument.getExpression()));
}
return values;
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument in project android by JetBrains.
the class LintIdeGradleDetector method visitBuildScript.
@Override
public void visitBuildScript(@NonNull final Context context, Map<String, Object> sharedData) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
final PsiFile psiFile = LintIdeUtils.getPsiFile(context);
if (!(psiFile instanceof GroovyFile)) {
return;
}
GroovyFile groovyFile = (GroovyFile) psiFile;
groovyFile.accept(new GroovyRecursiveElementVisitor() {
@Override
public void visitClosure(GrClosableBlock closure) {
String parentName = getClosureName(closure);
String parentParentName = null;
if (parentName != null) {
GrClosableBlock block = PsiTreeUtil.getParentOfType(closure, GrClosableBlock.class, true);
if (block != null) {
parentParentName = getClosureName(block);
}
}
if (parentName != null && isInterestingBlock(parentName, parentParentName)) {
for (PsiElement element : closure.getChildren()) {
if (element instanceof GrApplicationStatement) {
GrApplicationStatement call = (GrApplicationStatement) element;
GrExpression propertyExpression = call.getInvokedExpression();
GrCommandArgumentList argumentList = call.getArgumentList();
if (propertyExpression instanceof GrReferenceExpression) {
GrReferenceExpression propertyRef = (GrReferenceExpression) propertyExpression;
String property = propertyRef.getReferenceName();
//noinspection ConstantConditions
if (property != null && isInterestingProperty(property, parentName, parentParentName) && argumentList != null) {
String value = argumentList.getText();
checkDslPropertyAssignment(context, property, value, parentName, parentParentName, argumentList, call);
}
}
} else if (element instanceof GrAssignmentExpression) {
GrAssignmentExpression assignment = (GrAssignmentExpression) element;
GrExpression lValue = assignment.getLValue();
if (lValue instanceof GrReferenceExpression) {
GrReferenceExpression propertyRef = (GrReferenceExpression) lValue;
String property = propertyRef.getReferenceName();
if (property != null && isInterestingProperty(property, parentName, parentParentName)) {
GrExpression rValue = assignment.getRValue();
if (rValue != null) {
String value = rValue.getText();
checkDslPropertyAssignment(context, property, value, parentName, parentParentName, rValue, assignment);
// handle it here.
if (property.equals(ATTR_MIN_SDK_VERSION) || property.equals(ATTR_TARGET_SDK_VERSION)) {
int lValueEnd = lValue.getTextRange().getEndOffset();
int rValueStart = rValue.getTextRange().getStartOffset();
assert lValueEnd <= rValueStart;
DefaultPosition startPosition = new DefaultPosition(-1, -1, lValueEnd);
DefaultPosition endPosition = new DefaultPosition(-1, -1, rValueStart);
Location location = Location.create(context.file, startPosition, endPosition);
String message = String.format("Do not use assignment with the %1$s property (remove the '=')", property);
context.report(GradleDetector.IDE_SUPPORT, location, message, null);
}
}
}
}
}
}
}
super.visitClosure(closure);
}
@Override
public void visitApplicationStatement(GrApplicationStatement applicationStatement) {
GrClosableBlock block = PsiTreeUtil.getParentOfType(applicationStatement, GrClosableBlock.class, true);
String parentName = block != null ? getClosureName(block) : null;
String statementName = applicationStatement.getInvokedExpression().getText();
if (isInterestingStatement(statementName, parentName)) {
GrCommandArgumentList argumentList = applicationStatement.getArgumentList();
Map<String, String> namedArguments = Maps.newHashMap();
List<String> unnamedArguments = Lists.newArrayList();
for (GroovyPsiElement groovyPsiElement : argumentList.getAllArguments()) {
if (groovyPsiElement instanceof GrNamedArgument) {
GrNamedArgument namedArgument = (GrNamedArgument) groovyPsiElement;
GrExpression expression = namedArgument.getExpression();
if (expression == null || !(expression instanceof GrLiteral)) {
continue;
}
Object value = ((GrLiteral) expression).getValue();
if (value == null) {
continue;
}
namedArguments.put(namedArgument.getLabelName(), value.toString());
} else if (groovyPsiElement instanceof GrExpression) {
unnamedArguments.add(groovyPsiElement.getText());
}
}
checkMethodCall(context, statementName, parentName, namedArguments, unnamedArguments, applicationStatement);
}
super.visitApplicationStatement(applicationStatement);
}
});
}
});
}
use of org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument in project android by JetBrains.
the class GradleDslExpressionList method createNamedArgumentList.
@Nullable
private GroovyPsiElement createNamedArgumentList() {
assert myParent instanceof GradleDslExpressionMap;
GroovyPsiElement parentPsiElement = myParent.create();
if (parentPsiElement == null) {
return null;
}
GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(parentPsiElement.getProject());
GrExpression expressionFromText = factory.createExpressionFromText("[]");
if (expressionFromText instanceof GrListOrMap) {
// Elements need to be added to the list before adding the list to the named argument.
GrListOrMap list = (GrListOrMap) expressionFromText;
for (GradleDslExpression expression : myToBeAddedExpressions) {
expression.setPsiElement(list);
expression.applyChanges();
myExpressions.add(expression);
}
myToBeAddedExpressions.clear();
}
GrNamedArgument namedArgument = factory.createNamedArgument(myName, expressionFromText);
PsiElement added;
if (parentPsiElement instanceof GrArgumentList) {
added = ((GrArgumentList) parentPsiElement).addNamedArgument(namedArgument);
} else {
added = parentPsiElement.addAfter(namedArgument, parentPsiElement.getLastChild());
}
if (added instanceof GrNamedArgument) {
GrNamedArgument addedNameArgument = (GrNamedArgument) added;
setPsiElement(addedNameArgument.getExpression());
return getPsiElement();
}
return null;
}
Aggregations