Search in sources :

Example 11 with HighlightSeverity

use of com.intellij.lang.annotation.HighlightSeverity in project intellij-community by JetBrains.

the class SingleInspectionProfilePanel method updateOptionsAndDescriptionPanel.

private void updateOptionsAndDescriptionPanel(final TreePath... paths) {
    if (myProfile == null || paths == null || paths.length == 0) {
        return;
    }
    final TreePath path = paths[0];
    if (path == null)
        return;
    final List<InspectionConfigTreeNode> nodes = InspectionsAggregationUtil.getInspectionsNodes(paths);
    if (!nodes.isEmpty()) {
        final InspectionConfigTreeNode singleNode = paths.length == 1 && ((InspectionConfigTreeNode) paths[0].getLastPathComponent()).getDefaultDescriptor() != null ? ContainerUtil.getFirstItem(nodes) : null;
        if (singleNode != null) {
            final Descriptor descriptor = singleNode.getDefaultDescriptor();
            LOG.assertTrue(descriptor != null);
            if (descriptor.loadDescription() != null) {
                // need this in order to correctly load plugin-supplied descriptions
                final Descriptor defaultDescriptor = singleNode.getDefaultDescriptor();
                final String description = defaultDescriptor.loadDescription();
                try {
                    if (!readHTML(myBrowser, SearchUtil.markup(toHTML(myBrowser, description, false), myProfileFilter.getFilter()))) {
                        readHTML(myBrowser, toHTML(myBrowser, "<b>" + UNDER_CONSTRUCTION + "</b>", false));
                    }
                } catch (Throwable t) {
                    LOG.error("Failed to load description for: " + defaultDescriptor.getToolWrapper().getTool().getClass() + "; description: " + description, t);
                }
            } else {
                readHTML(myBrowser, toHTML(myBrowser, "Can't find inspection description.", false));
            }
        } else {
            readHTML(myBrowser, toHTML(myBrowser, "Multiple inspections are selected. You can edit them as a single inspection.", false));
        }
        myOptionsPanel.removeAll();
        final Project project = myProjectProfileManager.getProject();
        final JPanel severityPanel = new JPanel(new GridBagLayout());
        final JPanel configPanelAnchor = new JPanel(new GridLayout());
        final Set<String> scopesNames = new THashSet<>();
        for (final InspectionConfigTreeNode node : nodes) {
            final List<ScopeToolState> nonDefaultTools = myProfile.getNonDefaultTools(node.getDefaultDescriptor().getKey().toString(), project);
            for (final ScopeToolState tool : nonDefaultTools) {
                scopesNames.add(tool.getScopeName());
            }
        }
        final double severityPanelWeightY;
        if (scopesNames.isEmpty()) {
            final LevelChooserAction severityLevelChooser = new LevelChooserAction(myProfile.getProfileManager().getOwnSeverityRegistrar(), includeDoNotShow(nodes)) {

                @Override
                protected void onChosen(final HighlightSeverity severity) {
                    final HighlightDisplayLevel level = HighlightDisplayLevel.find(severity);
                    for (final InspectionConfigTreeNode node : nodes) {
                        final HighlightDisplayKey key = node.getDefaultDescriptor().getKey();
                        final NamedScope scope = node.getDefaultDescriptor().getScope();
                        final boolean toUpdate = myProfile.getErrorLevel(key, scope, project) != level;
                        myProfile.setErrorLevel(key, level, null, project);
                        if (toUpdate)
                            node.dropCache();
                    }
                    myTreeTable.updateUI();
                }
            };
            final HighlightSeverity severity = ScopesAndSeveritiesTable.getSeverity(ContainerUtil.map(nodes, node -> node.getDefaultDescriptor().getState()));
            severityLevelChooser.setChosen(severity);
            final ScopesChooser scopesChooser = new ScopesChooser(ContainerUtil.map(nodes, node -> node.getDefaultDescriptor()), myProfile, project, null) {

                @Override
                protected void onScopesOrderChanged() {
                    myTreeTable.updateUI();
                    updateOptionsAndDescriptionPanel();
                }

                @Override
                protected void onScopeAdded() {
                    myTreeTable.updateUI();
                    updateOptionsAndDescriptionPanel();
                }
            };
            severityPanel.add(new JLabel(InspectionsBundle.message("inspection.severity")), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, JBUI.insets(10, 0), 0, 0));
            final JComponent severityLevelChooserComponent = severityLevelChooser.createCustomComponent(severityLevelChooser.getTemplatePresentation());
            severityPanel.add(severityLevelChooserComponent, new GridBagConstraints(1, 0, 1, 1, 0, 1, GridBagConstraints.WEST, GridBagConstraints.BOTH, JBUI.insets(10, 0), 0, 0));
            final JComponent scopesChooserComponent = scopesChooser.createCustomComponent(scopesChooser.getTemplatePresentation());
            severityPanel.add(scopesChooserComponent, new GridBagConstraints(2, 0, 1, 1, 0, 1, GridBagConstraints.WEST, GridBagConstraints.BOTH, JBUI.insets(10, 0), 0, 0));
            final JLabel label = new JLabel("", SwingConstants.RIGHT);
            severityPanel.add(label, new GridBagConstraints(3, 0, 1, 1, 1, 0, GridBagConstraints.EAST, GridBagConstraints.BOTH, JBUI.insets(2, 0), 0, 0));
            severityPanelWeightY = 0.0;
            if (singleNode != null) {
                setConfigPanel(configPanelAnchor, myProfile.getToolDefaultState(singleNode.getDefaultDescriptor().getKey().toString(), project));
            }
        } else {
            if (singleNode != null) {
                for (final Descriptor descriptor : singleNode.getDescriptors().getNonDefaultDescriptors()) {
                    descriptor.loadConfig();
                }
            }
            final JTable scopesAndScopesAndSeveritiesTable = new ScopesAndSeveritiesTable(new ScopesAndSeveritiesTable.TableSettings(nodes, myProfile, project) {

                @Override
                protected void onScopeChosen(@NotNull final ScopeToolState state) {
                    setConfigPanel(configPanelAnchor, state);
                    configPanelAnchor.revalidate();
                    configPanelAnchor.repaint();
                }

                @Override
                protected void onSettingsChanged() {
                    update(false);
                }

                @Override
                protected void onScopeAdded() {
                    update(true);
                }

                @Override
                protected void onScopesOrderChanged() {
                    update(true);
                }

                @Override
                protected void onScopeRemoved(final int scopesCount) {
                    update(scopesCount == 1);
                }

                private void update(final boolean updateOptionsAndDescriptionPanel) {
                    Queue<InspectionConfigTreeNode> q = new Queue<>(nodes.size());
                    for (InspectionConfigTreeNode node : nodes) {
                        q.addLast(node);
                    }
                    while (!q.isEmpty()) {
                        final InspectionConfigTreeNode inspectionConfigTreeNode = q.pullFirst();
                        inspectionConfigTreeNode.dropCache();
                        final TreeNode parent = inspectionConfigTreeNode.getParent();
                        if (parent != null && parent.getParent() != null) {
                            q.addLast((InspectionConfigTreeNode) parent);
                        }
                    }
                    myTreeTable.updateUI();
                    if (updateOptionsAndDescriptionPanel) {
                        updateOptionsAndDescriptionPanel();
                    }
                }
            });
            final ToolbarDecorator wrappedTable = ToolbarDecorator.createDecorator(scopesAndScopesAndSeveritiesTable).disableUpDownActions().setRemoveActionUpdater(new AnActionButtonUpdater() {

                @Override
                public boolean isEnabled(AnActionEvent e) {
                    final int selectedRow = scopesAndScopesAndSeveritiesTable.getSelectedRow();
                    final int rowCount = scopesAndScopesAndSeveritiesTable.getRowCount();
                    return rowCount - 1 != selectedRow;
                }
            });
            final JPanel panel = wrappedTable.createPanel();
            panel.setMinimumSize(new Dimension(getMinimumSize().width, 3 * scopesAndScopesAndSeveritiesTable.getRowHeight()));
            severityPanel.add(new JBLabel("Severity by Scope"), new GridBagConstraints(0, 0, 1, 1, 1.0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, JBUI.insets(5, 0, 2, 10), 0, 0));
            severityPanel.add(panel, new GridBagConstraints(0, 1, 1, 1, 0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, JBUI.insets(0, 0, 0, 0), 0, 0));
            severityPanelWeightY = 0.3;
        }
        myOptionsPanel.add(severityPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, severityPanelWeightY, GridBagConstraints.WEST, GridBagConstraints.BOTH, JBUI.insets(0, 2, 0, 0), 0, 0));
        if (configPanelAnchor.getComponentCount() != 0) {
            configPanelAnchor.setBorder(IdeBorderFactory.createTitledBorder("Options", false, new JBInsets(7, 0, 0, 0)));
        }
        GuiUtils.enableChildren(myOptionsPanel, isThoughOneNodeEnabled(nodes));
        if (configPanelAnchor.getComponentCount() != 0 || scopesNames.isEmpty()) {
            myOptionsPanel.add(configPanelAnchor, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, JBUI.insets(0, 2, 0, 0), 0, 0));
        }
        myOptionsPanel.revalidate();
    } else {
        initOptionsAndDescriptionPanel();
    }
    myOptionsPanel.repaint();
}
Also used : JBInsets(com.intellij.util.ui.JBInsets) UIUtil(com.intellij.util.ui.UIUtil) com.intellij.codeInspection.ex(com.intellij.codeInspection.ex) AllIcons(com.intellij.icons.AllIcons) ScopesAndSeveritiesTable(com.intellij.profile.codeInspection.ui.table.ScopesAndSeveritiesTable) InspectionProfileManager(com.intellij.profile.codeInspection.InspectionProfileManager) HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) THashSet(gnu.trove.THashSet) ItemListener(java.awt.event.ItemListener) THashMap(gnu.trove.THashMap) JBLabel(com.intellij.ui.components.JBLabel) Queue(com.intellij.util.containers.Queue) JBUI(com.intellij.util.ui.JBUI) ProjectInspectionProfileManager(com.intellij.profile.codeInspection.ProjectInspectionProfileManager) Disposer(com.intellij.openapi.util.Disposer) SearchableOptionsRegistrar(com.intellij.ide.ui.search.SearchableOptionsRegistrar) Logger(com.intellij.openapi.diagnostic.Logger) InspectionsConfigTreeComparator(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeComparator) InspectionsFilter(com.intellij.profile.codeInspection.ui.filter.InspectionsFilter) DefaultTreeModel(javax.swing.tree.DefaultTreeModel) InspectionsConfigTreeRenderer(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeRenderer) ItemEvent(java.awt.event.ItemEvent) HintUtil(com.intellij.codeInsight.hint.HintUtil) TreePath(javax.swing.tree.TreePath) com.intellij.ide(com.intellij.ide) HighlightDisplayKey(com.intellij.codeInsight.daemon.HighlightDisplayKey) HighlightInfoType(com.intellij.codeInsight.daemon.impl.HighlightInfoType) com.intellij.ui(com.intellij.ui) SearchUtil(com.intellij.ide.ui.search.SearchUtil) BaseInspectionProfileManager(com.intellij.profile.codeInspection.BaseInspectionProfileManager) InspectionsBundle(com.intellij.codeInspection.InspectionsBundle) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) TextAttributes(com.intellij.openapi.editor.markup.TextAttributes) ApplicationManager(com.intellij.openapi.application.ApplicationManager) NotNull(org.jetbrains.annotations.NotNull) InspectionFilterAction(com.intellij.profile.codeInspection.ui.filter.InspectionFilterAction) Settings(com.intellij.openapi.options.ex.Settings) SeverityRegistrar(com.intellij.codeInsight.daemon.impl.SeverityRegistrar) java.util(java.util) TreeNode(javax.swing.tree.TreeNode) NonNls(org.jetbrains.annotations.NonNls) ContainerUtil(com.intellij.util.containers.ContainerUtil) InspectionConfigTreeNode(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionConfigTreeNode) Comparing(com.intellij.openapi.util.Comparing) NamedScope(com.intellij.psi.search.scope.packageSet.NamedScope) JDOMUtil(com.intellij.openapi.util.JDOMUtil) Project(com.intellij.openapi.project.Project) TreeUtil(com.intellij.util.ui.tree.TreeUtil) JBCheckBox(com.intellij.ui.components.JBCheckBox) StringUtil(com.intellij.openapi.util.text.StringUtil) Convertor(com.intellij.util.containers.Convertor) javax.swing.event(javax.swing.event) IOException(java.io.IOException) HighlightDisplayLevel(com.intellij.codeHighlighting.HighlightDisplayLevel) Disposable(com.intellij.openapi.Disposable) InspectionsConfigTreeTable(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeTable) java.awt(java.awt) com.intellij.openapi.actionSystem(com.intellij.openapi.actionSystem) TextAttributesKey(com.intellij.openapi.editor.colors.TextAttributesKey) DumbAwareAction(com.intellij.openapi.project.DumbAwareAction) StringReader(java.io.StringReader) Element(org.jdom.Element) Alarm(com.intellij.util.Alarm) javax.swing(javax.swing) HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) HighlightDisplayKey(com.intellij.codeInsight.daemon.HighlightDisplayKey) JBInsets(com.intellij.util.ui.JBInsets) NamedScope(com.intellij.psi.search.scope.packageSet.NamedScope) JBLabel(com.intellij.ui.components.JBLabel) TreeNode(javax.swing.tree.TreeNode) InspectionConfigTreeNode(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionConfigTreeNode) Queue(com.intellij.util.containers.Queue) HighlightDisplayLevel(com.intellij.codeHighlighting.HighlightDisplayLevel) ScopesAndSeveritiesTable(com.intellij.profile.codeInspection.ui.table.ScopesAndSeveritiesTable) THashSet(gnu.trove.THashSet) InspectionConfigTreeNode(com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionConfigTreeNode) Project(com.intellij.openapi.project.Project) TreePath(javax.swing.tree.TreePath)

Example 12 with HighlightSeverity

use of com.intellij.lang.annotation.HighlightSeverity in project intellij-community by JetBrains.

the class SingleInspectionProfilePanel method copyUsedSeveritiesIfUndefined.

private static void copyUsedSeveritiesIfUndefined(InspectionProfileImpl selectedProfile, BaseInspectionProfileManager profileManager) {
    final SeverityRegistrar registrar = profileManager.getSeverityRegistrar();
    final Set<HighlightSeverity> severities = selectedProfile.getUsedSeverities();
    for (Iterator<HighlightSeverity> iterator = severities.iterator(); iterator.hasNext(); ) {
        HighlightSeverity severity = iterator.next();
        if (registrar.isSeverityValid(severity.getName())) {
            iterator.remove();
        }
    }
    if (!severities.isEmpty()) {
        final SeverityRegistrar oppositeRegister = selectedProfile.getProfileManager().getSeverityRegistrar();
        for (HighlightSeverity severity : severities) {
            final TextAttributesKey attributesKey = TextAttributesKey.find(severity.getName());
            final TextAttributes textAttributes = oppositeRegister.getTextAttributesBySeverity(severity);
            if (textAttributes == null) {
                continue;
            }
            HighlightInfoType.HighlightInfoTypeImpl info = new HighlightInfoType.HighlightInfoTypeImpl(severity, attributesKey);
            registrar.registerSeverity(new SeverityRegistrar.SeverityBasedTextAttributes(textAttributes.clone(), info), textAttributes.getErrorStripeColor());
        }
    }
}
Also used : HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) TextAttributes(com.intellij.openapi.editor.markup.TextAttributes) TextAttributesKey(com.intellij.openapi.editor.colors.TextAttributesKey) SeverityRegistrar(com.intellij.codeInsight.daemon.impl.SeverityRegistrar) HighlightInfoType(com.intellij.codeInsight.daemon.impl.HighlightInfoType)

Example 13 with HighlightSeverity

use of com.intellij.lang.annotation.HighlightSeverity in project intellij-community by JetBrains.

the class SingleInspectionProfilePanel method compoundPopup.

private JPopupMenu compoundPopup() {
    final DefaultActionGroup group = new DefaultActionGroup();
    final SeverityRegistrar severityRegistrar = myProfile.getProfileManager().getOwnSeverityRegistrar();
    for (HighlightSeverity severity : LevelChooserAction.getSeverities(severityRegistrar, includeDoNotShow())) {
        final HighlightDisplayLevel level = HighlightDisplayLevel.find(severity);
        group.add(new AnAction(renderSeverity(severity), renderSeverity(severity), level.getIcon()) {

            @Override
            public void actionPerformed(@NotNull AnActionEvent e) {
                setNewHighlightingLevel(level);
            }

            @Override
            public boolean isDumbAware() {
                return true;
            }
        });
    }
    group.add(Separator.getInstance());
    ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, group);
    return menu.getComponent();
}
Also used : HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) HighlightDisplayLevel(com.intellij.codeHighlighting.HighlightDisplayLevel) SeverityRegistrar(com.intellij.codeInsight.daemon.impl.SeverityRegistrar)

Example 14 with HighlightSeverity

use of com.intellij.lang.annotation.HighlightSeverity in project scss-lint-plugin by idok.

the class ScssLintAnnotationResult method apply.

@Override
public void apply(@NotNull PsiFile file, ScssLintAnnotationResult annotationResult, @NotNull AnnotationHolder holder) {
    if (annotationResult == null) {
        return;
    }
    InspectionProjectProfileManager inspectionProjectProfileManager = InspectionProjectProfileManager.getInstance(file.getProject());
    SeverityRegistrar severityRegistrar = inspectionProjectProfileManager.getSeverityRegistrar();
    HighlightDisplayKey inspectionKey = getHighlightDisplayKeyByClass();
    EditorColorsScheme colorsScheme = annotationResult.input.colorsScheme;
    Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file);
    if (document == null) {
        return;
    }
    if (annotationResult.fileLevel != null) {
        Annotation annotation = holder.createWarningAnnotation(file, annotationResult.fileLevel);
        annotation.registerFix(new EditSettingsAction(new ScssLintSettingsPage(file.getProject())));
        annotation.setFileLevelAnnotation(true);
        return;
    }
    // TODO consider adding a fix to edit configuration file
    if (annotationResult.result == null || annotationResult.result.lint == null || annotationResult.result.lint.isEmpty()) {
        return;
    }
    // String relativeFile = FileUtils.makeRelative(file.getProject(), file.getVirtualFile());
    List<Lint.Issue> issues = annotationResult.result.lint.values().iterator().next();
    if (issues == null) {
        return;
    }
    ScssLintProjectComponent component = annotationResult.input.project.getComponent(ScssLintProjectComponent.class);
    int tabSize = 4;
    for (Lint.Issue issue : issues) {
        HighlightSeverity severity = getHighlightSeverity(issue, component.treatAsWarnings);
        TextAttributes forcedTextAttributes = AnnotatorUtils.getTextAttributes(colorsScheme, severityRegistrar, severity);
        Annotation annotation = createAnnotation(holder, file, document, issue, "SCSS Lint: ", tabSize, severity, forcedTextAttributes, inspectionKey, false);
        if (annotation != null) {
            int offset = StringUtil.lineColToOffset(document.getText(), issue.line - 1, issue.column);
            PsiElement lit = PsiUtil.getElementAtOffset(file, offset);
            BaseActionFix actionFix = Fixes.getFixForRule(issue.linter, lit);
            if (actionFix != null) {
                annotation.registerFix(actionFix, null, inspectionKey);
            }
        //                annotation.registerFix(new SuppressActionFix(issue.rule, lit), null, inspectionKey);
        }
    }
}
Also used : HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) HighlightDisplayKey(com.intellij.codeInsight.daemon.HighlightDisplayKey) Lint(com.scss.utils.scssLint.Lint) ScssLintSettingsPage(com.scss.settings.ScssLintSettingsPage) Document(com.intellij.openapi.editor.Document) Annotation(com.intellij.lang.annotation.Annotation) Lint(com.scss.utils.scssLint.Lint) TextAttributes(com.intellij.openapi.editor.markup.TextAttributes) EditorColorsScheme(com.intellij.openapi.editor.colors.EditorColorsScheme) InspectionProjectProfileManager(com.intellij.profile.codeInspection.InspectionProjectProfileManager) SeverityRegistrar(com.intellij.codeInsight.daemon.impl.SeverityRegistrar) PsiElement(com.intellij.psi.PsiElement) BaseActionFix(com.scss.annotator.BaseActionFix)

Example 15 with HighlightSeverity

use of com.intellij.lang.annotation.HighlightSeverity in project android by JetBrains.

the class AndroidLintExternalAnnotator method createAnnotation.

@SuppressWarnings("deprecation")
@NotNull
private Annotation createAnnotation(@NotNull AnnotationHolder holder, @NotNull String message, @NotNull TextRange range, @NotNull HighlightDisplayLevel displayLevel, @NotNull Issue issue) {
    // Convert from inspection severity to annotation severity
    HighlightSeverity severity;
    if (displayLevel == HighlightDisplayLevel.ERROR) {
        severity = HighlightSeverity.ERROR;
    } else if (displayLevel == HighlightDisplayLevel.WARNING) {
        severity = HighlightSeverity.WARNING;
    } else if (displayLevel == HighlightDisplayLevel.WEAK_WARNING) {
        severity = HighlightSeverity.WEAK_WARNING;
    } else if (displayLevel == HighlightDisplayLevel.INFO) {
        severity = HighlightSeverity.INFO;
    } else {
        severity = HighlightSeverity.WARNING;
    }
    String link = " <a " + "href=\"#lint/" + issue.getId() + "\"" + (UIUtil.isUnderDarcula() ? " color=\"7AB4C9\" " : "") + ">" + DaemonBundle.message("inspection.extended.description") + "</a> " + getShowMoreShortCut();
    String tooltip = XmlStringUtil.wrapInHtml(RAW.convertTo(message, HTML) + link);
    return holder.createAnnotation(severity, range, message, tooltip);
}
Also used : HighlightSeverity(com.intellij.lang.annotation.HighlightSeverity) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

HighlightSeverity (com.intellij.lang.annotation.HighlightSeverity)32 Element (org.jdom.Element)8 TextAttributes (com.intellij.openapi.editor.markup.TextAttributes)7 HighlightInfoType (com.intellij.codeInsight.daemon.impl.HighlightInfoType)6 NotNull (org.jetbrains.annotations.NotNull)6 HighlightDisplayLevel (com.intellij.codeHighlighting.HighlightDisplayLevel)5 SeverityRegistrar (com.intellij.codeInsight.daemon.impl.SeverityRegistrar)5 TextAttributesKey (com.intellij.openapi.editor.colors.TextAttributesKey)5 Annotation (com.intellij.lang.annotation.Annotation)4 Nullable (org.jetbrains.annotations.Nullable)4 TextRange (com.intellij.openapi.util.TextRange)3 HighlightDisplayKey (com.intellij.codeInsight.daemon.HighlightDisplayKey)2 IntentionAction (com.intellij.codeInsight.intention.IntentionAction)2 Document (com.intellij.openapi.editor.Document)2 DumbAwareAction (com.intellij.openapi.project.DumbAwareAction)2 Project (com.intellij.openapi.project.Project)2 JDOMExternalizableStringList (com.intellij.openapi.util.JDOMExternalizableStringList)2 PsiElement (com.intellij.psi.PsiElement)2 THashSet (gnu.trove.THashSet)2 NonNls (org.jetbrains.annotations.NonNls)2