blob: c51ccc89d34f85b2cd65d363daa3490270913f8c [file] [log] [blame]
/*
* Copyright 2017 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.validation;
import com.google.idea.blaze.base.lang.buildfile.psi.LoadStatement;
import com.google.idea.blaze.base.lang.buildfile.psi.LoadedSymbol;
import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
import com.google.idea.blaze.base.lang.buildfile.quickfix.DeprecatedLoadQuickFix;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.lang.annotation.Annotation;
import javax.annotation.Nullable;
/** Adds warning/error annotations to load statements. */
public class LoadStatementAnnotator extends BuildAnnotator {
@Override
public void visitLoadStatement(LoadStatement node) {
validateImportTarget(node.getImportPsiElement());
}
@Override
public void visitLoadedSymbol(LoadedSymbol node) {
StringLiteral loadedString = node.getImport();
if (loadedString == null) {
return;
}
String name = loadedString.getStringContents();
if (name.startsWith("_")) {
markError(node, String.format("Symbol '%s' is private and cannot be imported.", name));
}
}
private void validateImportTarget(@Nullable StringLiteral target) {
if (target == null) {
return;
}
String targetString = target.getStringContents();
if (targetString == null
|| targetString.startsWith(":")
|| targetString.startsWith("//")
|| targetString.startsWith("@")
|| targetString.length() < 2) {
return;
}
if (targetString.startsWith("/")) {
Annotation annotation =
markWarning(
target, "Deprecated load syntax; loaded Skylark module should by in label format.");
InspectionManager inspectionManager = InspectionManager.getInstance(target.getProject());
ProblemDescriptor descriptor =
inspectionManager.createProblemDescriptor(
target,
annotation.getMessage(),
DeprecatedLoadQuickFix.INSTANCE,
ProblemHighlightType.LIKE_DEPRECATED,
true);
annotation.registerFix(DeprecatedLoadQuickFix.INSTANCE, null, null, descriptor);
return;
}
markError(target, "Invalid load syntax: missing Skylark module.");
}
}