/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* 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 jetbrains.mps.ide.editor;
import com.intellij.openapi.components.ProjectComponent;
import jetbrains.mps.ide.editor.checkers.ModelProblemsChecker;
import jetbrains.mps.ide.editor.suppresserrors.SuppressErrorsChecker;
import jetbrains.mps.nodeEditor.Highlighter;
import jetbrains.mps.nodeEditor.checking.DisposableEditorChecker;
import jetbrains.mps.nodeEditor.checking.EditorChecker;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.typesystem.checking.NonTypesystemEditorChecker;
import jetbrains.mps.typesystem.checking.TypesEditorChecker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.SRepository;
import typesystemIntegration.languageChecker.AutoResolver;
import typesystemIntegration.languageChecker.LanguageEditorChecker;
import java.util.Stack;
/**
* evgeny, 12/27/11
*/
public class MPSValidationComponent implements ProjectComponent {
private final MPSProject myProject;
private final Highlighter myHighlighter;
private Stack<EditorChecker> myCheckers = new Stack<EditorChecker>();
public MPSValidationComponent(MPSProject mpsProject, Highlighter highlighter) {
myProject = mpsProject;
myHighlighter = highlighter;
}
@Override
public void initComponent() {
}
private void addChecker(EditorChecker checker) {
myHighlighter.addChecker(myCheckers.push(checker));
}
@Override
public void disposeComponent() {
}
@NotNull
@Override
public String getComponentName() {
return "MPS Editor Validation";
}
@Override
public void projectOpened() {
// TODO: create editor-specific "core" component in editor-runtime module and register all common checkers from there
myProject.getModelAccess().runReadAction(new Runnable() {
@Override
public void run() {
addChecker(new TypesEditorChecker());
addChecker(new NonTypesystemEditorChecker());
addChecker(new AutoResolver(myProject));
final SRepository repositoryToTrack4Changes = myProject.getRepository();
addChecker(new LanguageEditorChecker(repositoryToTrack4Changes));
addChecker(new SuppressErrorsChecker());
addChecker(new ModelProblemsChecker(repositoryToTrack4Changes));
}
});
}
@Override
public void projectClosed() {
myProject.getModelAccess().runReadAction(new Runnable() {
@Override
public void run() {
while (!myCheckers.isEmpty()) {
EditorChecker checker = myCheckers.pop();
myHighlighter.removeChecker(checker);
if (checker instanceof DisposableEditorChecker) {
((DisposableEditorChecker) checker).dispose();
}
}
}
});
}
}