package com.intellij.flex.uiDesigner; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; public class ProblemsHolder { private static final Logger LOG = Logger.getInstance(ProblemsHolder.class.getName()); private final List<ProblemDescriptor> problems = new ArrayList<>(); private VirtualFile currentFile; private boolean logDisabled; public boolean isEmpty() { return problems.isEmpty(); } public void disableLog() { logDisabled = true; } private static int getLineNumber(PsiElement element) { InjectedLanguageManager manager = InjectedLanguageManager.getInstance(element.getProject()); final int elementTextOffset = manager.injectedToHost(element, element.getTextOffset()); final PsiFile psiFile = manager.getTopLevelFile(element); final Document document = PsiDocumentManager.getInstance(element.getProject()).getCachedDocument(psiFile); assert document != null; return document.getLineNumber(elementTextOffset) + 1; } public void setCurrentFile(@Nullable VirtualFile currentFile) { this.currentFile = currentFile; } public List<ProblemDescriptor> getProblems() { LOG.assertTrue(currentFile == null); return problems; } public void add(InvalidPropertyException e) { final ProblemDescriptor problemDescriptor = new ProblemDescriptor(e.getMessage(), currentFile, e.getPsiElement() == null ? -1 : getLineNumber(e.getPsiElement())); problems.add(problemDescriptor); if (e.getCause() != null && !logDisabled) { LOG.error(LogMessageUtil.createEvent(e.getMessage(), e.getCause(), problemDescriptor)); } } public void add(final PsiElement element, final RuntimeException e, final String propertyName) { String error; boolean dontLog = logDisabled; if (e instanceof NumberFormatException) { error = e.getMessage(); final String prefix = "For input string: \""; if (error.startsWith(prefix)) { error = FlashUIDesignerBundle.message("error.write.property.numeric.value", error.substring(prefix.length(), error.charAt(error.length() - 1) == '"' ? error.length() - 1 : error.length()), propertyName); dontLog = true; } } else { error = FlashUIDesignerBundle.message("error.write.property", propertyName); } final ProblemDescriptor problemDescriptor = new ProblemDescriptor(error, currentFile, getLineNumber(element)); if (!dontLog) { LOG.error(LogMessageUtil.createEvent(error, e, problemDescriptor)); } problems.add(problemDescriptor); } public void add(Throwable e) { if (e instanceof InvalidPropertyException) { add(((InvalidPropertyException)e)); } else { LogMessageUtil.processInternalError(e, currentFile); } } public void add(PsiElement element, String message) { add(message, getLineNumber(element)); } public void add(String message, int lineNumber) { problems.add(new ProblemDescriptor(message, currentFile, lineNumber)); } public void add(String message) { problems.add(new ProblemDescriptor(message, null, -1)); } }