use of com.intellij.psi.PsiErrorElement in project intellij-community by JetBrains.
the class XmlTextContextType method isInContext.
@Override
public boolean isInContext(@NotNull PsiFile file, int offset) {
if (!XmlContextType.isInXml(file, offset))
return false;
PsiElement element = file.findElementAt(offset);
if (element == null)
return false;
if (PsiTreeUtil.getParentOfType(element, XmlText.class, false) != null) {
return true;
}
PsiElement parent = element.getParent();
if (parent instanceof PsiErrorElement) {
parent = parent.getParent();
}
return parent instanceof XmlDocument;
}
use of com.intellij.psi.PsiErrorElement in project intellij-community by JetBrains.
the class XmlWrongClosingTagNameInspection method annotate.
@Override
public void annotate(@NotNull final PsiElement psiElement, @NotNull final AnnotationHolder holder) {
if (psiElement instanceof XmlToken) {
final PsiElement parent = psiElement.getParent();
if (parent instanceof XmlTag) {
final XmlTag tag = (XmlTag) parent;
final XmlToken start = XmlTagUtil.getStartTagNameElement(tag);
XmlToken endTagName = XmlTagUtil.getEndTagNameElement(tag);
if (start == psiElement) {
if (endTagName != null && !(tag instanceof HtmlTag) && !tag.getName().equals(endTagName.getText())) {
registerProblemStart(holder, tag, start, endTagName);
} else if (endTagName == null && !(tag instanceof HtmlTag && HtmlUtil.isSingleHtmlTag(tag.getName()))) {
final PsiErrorElement errorElement = PsiTreeUtil.getChildOfType(tag, PsiErrorElement.class);
endTagName = findEndTagName(errorElement);
if (endTagName != null) {
registerProblemStart(holder, tag, start, endTagName);
}
}
} else if (endTagName == psiElement) {
if (!(tag instanceof HtmlTag) && !tag.getName().equals(endTagName.getText())) {
registerProblemEnd(holder, tag, endTagName);
}
}
} else if (parent instanceof PsiErrorElement) {
if (XmlTokenType.XML_NAME == ((XmlToken) psiElement).getTokenType()) {
final PsiFile psiFile = psiElement.getContainingFile();
if (psiFile != null && (HTMLLanguage.INSTANCE == psiFile.getViewProvider().getBaseLanguage() || HTMLLanguage.INSTANCE == parent.getLanguage())) {
final String message = XmlErrorMessages.message("xml.parsing.closing.tag.matches.nothing");
if (message.equals(((PsiErrorElement) parent).getErrorDescription()) && psiFile.getContext() == null) {
final Annotation annotation = holder.createWarningAnnotation(parent, message);
annotation.registerFix(new RemoveExtraClosingTagIntentionAction());
}
}
}
}
}
}
use of com.intellij.psi.PsiErrorElement in project kotlin by JetBrains.
the class CodegenTestFiles method create.
@NotNull
public static CodegenTestFiles create(@NotNull String fileName, @NotNull String contentWithDiagnosticMarkup, @NotNull Project project) {
String content = CheckerTestUtil.parseDiagnosedRanges(contentWithDiagnosticMarkup, new ArrayList<CheckerTestUtil.DiagnosedRange>());
KtFile file = KotlinTestUtils.createFile(fileName, content, project);
List<PsiErrorElement> ranges = AnalyzingUtils.getSyntaxErrorRanges(file);
assert ranges.isEmpty() : "Syntax errors found in " + file + ": " + ranges;
List<Pair<String, String>> expectedValues = Lists.newArrayList();
Matcher matcher = Pattern.compile("// expected: (\\S+): (.*)").matcher(content);
while (matcher.find()) {
String fieldName = matcher.group(1);
String expectedValue = matcher.group(2);
expectedValues.add(Pair.create(fieldName, expectedValue));
}
List<Object> scriptParameterValues = Lists.newArrayList();
if (file.isScript()) {
Pattern scriptParametersPattern = Pattern.compile("param: (\\S.*)");
Matcher scriptParametersMatcher = scriptParametersPattern.matcher(file.getText());
if (scriptParametersMatcher.find()) {
String valueString = scriptParametersMatcher.group(1);
String[] values = valueString.split(" ");
scriptParameterValues.add(values);
} else {
scriptParameterValues.add(ArrayUtil.EMPTY_STRING_ARRAY);
}
}
KotlinScriptDefinitionProvider.getInstance(project).addScriptDefinition(StandardScriptDefinition.INSTANCE);
return new CodegenTestFiles(Collections.singletonList(file), expectedValues, scriptParameterValues);
}
use of com.intellij.psi.PsiErrorElement in project intellij-community by JetBrains.
the class HtmlMissingClosingTagInspection method checkTag.
@Override
protected void checkTag(@NotNull XmlTag tag, @NotNull ProblemsHolder holder, boolean isOnTheFly) {
if (!(tag instanceof HtmlTag) || !XmlHighlightVisitor.shouldBeValidated(tag)) {
return;
}
final PsiElement child = tag.getLastChild();
if (child instanceof PsiErrorElement) {
return;
}
final XmlToken tagNameElement = XmlTagUtil.getStartTagNameElement(tag);
if (tagNameElement == null) {
return;
}
final String tagName = tagNameElement.getText();
if (HtmlUtil.isSingleHtmlTag(tagName) || XmlTagUtil.getEndTagNameElement(tag) != null) {
return;
}
holder.registerProblem(tagNameElement, XmlErrorMessages.message("element.missing.end.tag"), new MissingClosingTagFix(tagName));
}
use of com.intellij.psi.PsiErrorElement in project intellij-plugins by JetBrains.
the class CfmlTypedHandler method insertCloseTagIfNeeded.
public static boolean insertCloseTagIfNeeded(Editor editor, PsiFile file, Project project) {
final Document document = editor.getDocument();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
int offset = editor.getCaretModel().getOffset();
documentManager.commitDocument(document);
char charAtOffset = DocumentUtils.getCharAt(document, offset);
if (charAtOffset != '>') {
EditorModificationUtil.insertStringAtCaret(editor, ">", true, 0);
}
EditorModificationUtil.moveCaretRelatively(editor, 1);
++offset;
if (DocumentUtils.getCharAt(document, offset - 2) == '/') {
return false;
}
HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset - 2);
while (!iterator.atEnd() && !iterator.getTokenType().equals(CfmlTokenTypes.CF_TAG_NAME)) {
if (CfmlUtil.isControlToken(iterator.getTokenType())) {
return false;
}
iterator.retreat();
}
if (!iterator.atEnd()) {
iterator.retreat();
if (!iterator.atEnd() && iterator.getTokenType().equals(CfmlTokenTypes.LSLASH_ANGLEBRACKET)) {
return false;
}
iterator.advance();
}
if (iterator.atEnd()) {
return false;
}
String tagName = document.getCharsSequence().subSequence(iterator.getStart(), iterator.getEnd()).toString();
if (CfmlUtil.isSingleCfmlTag(tagName, project) || CfmlUtil.isUserDefined(tagName)) {
return false;
}
PsiElement tagElement = file.findElementAt(iterator.getStart());
while (tagElement != null && !(tagElement instanceof CfmlTag)) {
tagElement = tagElement.getParent();
}
if (tagElement == null) {
return false;
}
boolean doInsertion = false;
if (tagElement.getLastChild() instanceof PsiErrorElement) {
doInsertion = true;
} else {
iterator = ((EditorEx) editor).getHighlighter().createIterator(0);
while (!iterator.atEnd() && iterator.getStart() < offset) {
if (iterator.getTokenType() == CfmlTokenTypes.CF_TAG_NAME) {
String currentTagName = document.getCharsSequence().subSequence(iterator.getStart(), iterator.getEnd()).toString();
if (tagName.equals(currentTagName)) {
PsiElement currentTagElement = file.findElementAt(iterator.getStart());
currentTagElement = PsiTreeUtil.getParentOfType(currentTagElement, CfmlTag.class);
if (currentTagElement.getLastChild() instanceof PsiErrorElement) {
doInsertion = true;
break;
}
}
}
iterator.advance();
}
}
// tag name in lowercase
String tagNameFromPsi = ((CfmlTag) tagElement).getTagName();
if (doInsertion && CfmlUtil.isEndTagRequired(tagNameFromPsi, project)) {
if (!Comparing.equal(tagNameFromPsi, tagName, false)) {
// use tagName because it has proper case
tagName = tagNameFromPsi;
}
EditorModificationUtil.insertStringAtCaret(editor, "</" + tagName + ">", true, 0);
return true;
}
return false;
}
Aggregations