blob: 4c3e3c20e14b166aa748e074e203fbcf3b9a4456 [file] [log] [blame]
/*
* Copyright 2016 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.idea.blaze.base.lang.buildfile.psi.util;
import com.google.idea.blaze.base.lang.buildfile.language.BuildFileLanguage;
import com.google.idea.blaze.base.lang.buildfile.language.BuildFileType;
import com.google.idea.blaze.base.lang.buildfile.lexer.BuildToken;
import com.google.idea.blaze.base.lang.buildfile.lexer.TokenKind;
import com.google.idea.blaze.base.lang.buildfile.psi.Argument;
import com.google.idea.blaze.base.lang.buildfile.psi.Expression;
import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.impl.PsiFileFactoryImpl;
import com.intellij.testFramework.LightVirtualFile;
/** Creates dummy BuildElements, e.g. for renaming purposes. */
public class BuildElementGenerator {
public static BuildElementGenerator getInstance(Project project) {
return ServiceManager.getService(project, BuildElementGenerator.class);
}
private static final String DUMMY_FILENAME = "dummy.bzl";
private final Project project;
public BuildElementGenerator(Project project) {
this.project = project;
}
public PsiFile createDummyFile(String contents) {
PsiFileFactory factory = PsiFileFactory.getInstance(project);
LightVirtualFile virtualFile =
new LightVirtualFile(DUMMY_FILENAME, BuildFileType.INSTANCE, contents);
PsiFile psiFile =
((PsiFileFactoryImpl) factory)
.trySetupPsiForFile(virtualFile, BuildFileLanguage.INSTANCE, false, true);
assert psiFile != null;
return psiFile;
}
public ASTNode createNameIdentifier(String name) {
PsiFile dummyFile = createDummyFile(name);
ASTNode referenceNode = dummyFile.getNode().getFirstChildNode();
ASTNode nameNode = referenceNode.getFirstChildNode();
if (nameNode.getElementType() != BuildToken.IDENTIFIER) {
throw new RuntimeException(
"Expecting an IDENTIFIER node directly below the BuildFile PSI element");
}
return nameNode;
}
public ASTNode createStringNode(String contents) {
PsiFile dummyFile = createDummyFile('"' + contents + '"');
ASTNode literalNode = dummyFile.getNode().getFirstChildNode();
ASTNode stringNode = literalNode.getFirstChildNode();
assert (stringNode.getElementType() == BuildToken.fromKind(TokenKind.STRING));
return stringNode;
}
public Argument.Keyword createKeywordArgument(String keyword, String value) {
String dummyText = String.format("foo(%s = \"%s\")", keyword, value);
FuncallExpression funcall = (FuncallExpression) createExpressionFromText(dummyText);
return (Argument.Keyword) funcall.getArguments()[0];
}
public Expression createExpressionFromText(String text) {
PsiFile dummyFile = createDummyFile(text);
PsiElement element = dummyFile.getFirstChild();
if (element instanceof Expression) {
return (Expression) element;
}
throw new RuntimeException("Could not parse text as expression: '" + text + "'");
}
}