From 77033322cabd509943d7211abfaa8163573a1b27 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 10 May 2011 17:10:16 +0200 Subject: [PATCH] decouple LanguageFileType from EditorHighlighter --- .../MultilanguageCodeStyleAbstractPanel.java | 3 +- .../fileTypes/EditorHighlighterProvider.java | 40 ++++++++++++++ .../FileTypeEditorHighlighterProviders.java | 55 +++++++++++++++++++ .../openapi/fileTypes/LanguageFileType.java | 13 ----- .../EditorHighlighterFactoryImpl.java | 6 +- .../src/META-INF/PlatformExtensionPoints.xml | 1 + .../plugins/groovy/GroovyFileType.java | 14 +++-- .../xslt/run/HighlightingOutputConsole.java | 5 +- 8 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/openapi/fileTypes/EditorHighlighterProvider.java create mode 100644 platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeEditorHighlighterProviders.java diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java index 0a1a7a84a64a..60e283b5ed36 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java @@ -25,6 +25,7 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeEditorHighlighterProviders; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; @@ -150,7 +151,7 @@ public abstract class MultilanguageCodeStyleAbstractPanel extends CodeStyleAbstr @Nullable protected EditorHighlighter createHighlighter(final EditorColorsScheme scheme) { if (getFileType() instanceof LanguageFileType) { - return ((LanguageFileType)getFileType()).getEditorHighlighter(getCurrentProject(), null, scheme); + return FileTypeEditorHighlighterProviders.INSTANCE.forFileType(getFileType()).getEditorHighlighter(getCurrentProject(), null, scheme); } return null; } diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/EditorHighlighterProvider.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/EditorHighlighterProvider.java new file mode 100644 index 000000000000..f99365c22a89 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/EditorHighlighterProvider.java @@ -0,0 +1,40 @@ + /* + * Copyright 2000-2011 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 com.intellij.openapi.fileTypes; + +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.highlighter.EditorHighlighter; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author yole + */ +public interface EditorHighlighterProvider { + /** + * Lower level API for customizing language's file syntax highlighting in editor component. + * @param project The project in which the highlighter will work, or null if the highlighter is not tied to any project. + * @param virtualFile The file to be highlighted + * @param colors color scheme highlighter shall be initialized with. + * @return EditorHighlighter implementation + */ + + EditorHighlighter getEditorHighlighter(@Nullable Project project, + @Nullable final VirtualFile virtualFile, + @NotNull EditorColorsScheme colors); +} diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeEditorHighlighterProviders.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeEditorHighlighterProviders.java new file mode 100644 index 000000000000..8a37337d0d1f --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/FileTypeEditorHighlighterProviders.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2011 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 com.intellij.openapi.fileTypes; + +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.highlighter.EditorHighlighter; +import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * @author yole + */ +public class FileTypeEditorHighlighterProviders extends FileTypeExtension { + public static final FileTypeEditorHighlighterProviders INSTANCE = new FileTypeEditorHighlighterProviders(); + + private FileTypeEditorHighlighterProviders() { + super("com.intellij.editorHighlighter"); + } + + @Override + protected List buildExtensions(String stringKey, final FileType key) { + List fromEP = super.buildExtensions(stringKey, key); + if (fromEP.isEmpty()) { + EditorHighlighterProvider defaultProvider = new EditorHighlighterProvider() { + @Override + public EditorHighlighter getEditorHighlighter(@Nullable Project project, + @Nullable VirtualFile virtualFile, + @NotNull EditorColorsScheme colors) { + return EditorHighlighterFactory.getInstance().createEditorHighlighter(SyntaxHighlighter.PROVIDER.create(key, project, virtualFile), colors); + } + }; + return Collections.singletonList(defaultProvider); + } + return fromEP; + } +} diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java index e951c9a51519..051c315598f8 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/LanguageFileType.java @@ -50,19 +50,6 @@ public abstract class LanguageFileType implements FileType{ return myLanguage; } - /** - * Lower level API for customizing language's file syntax highlighting in editor component. - * @param project The project in which the highlighter will work, or null if the highlighter is not tied to any project. - * @param virtualFile The file to be highlighted - * @param colors color scheme highlighter shall be initialized with. - * @return EditorHighlighter implementation - */ - public EditorHighlighter getEditorHighlighter(@Nullable Project project, - @Nullable final VirtualFile virtualFile, - @NotNull EditorColorsScheme colors) { - return EditorHighlighterFactory.getInstance().createEditorHighlighter(SyntaxHighlighter.PROVIDER.create(this, project, virtualFile), colors); - } - public final boolean isBinary() { return false; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/highlighter/EditorHighlighterFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/highlighter/EditorHighlighterFactoryImpl.java index 47e2effd3961..e52209cb65f0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/highlighter/EditorHighlighterFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/highlighter/EditorHighlighterFactoryImpl.java @@ -39,7 +39,7 @@ public class EditorHighlighterFactoryImpl extends EditorHighlighterFactory { public EditorHighlighter createEditorHighlighter(final FileType fileType, final EditorColorsScheme settings, final Project project) { if (fileType instanceof LanguageFileType) { - return ((LanguageFileType)fileType).getEditorHighlighter(project, null, settings); + return FileTypeEditorHighlighterProviders.INSTANCE.forFileType(fileType).getEditorHighlighter(project, null, settings); } SyntaxHighlighter highlighter = SyntaxHighlighter.PROVIDER.create(fileType, project, null); @@ -55,14 +55,14 @@ public class EditorHighlighterFactoryImpl extends EditorHighlighterFactory { if (fileType instanceof LanguageFileType) { LanguageFileType substFileType = substituteFileType(((LanguageFileType)fileType).getLanguage(), vFile, project); if (substFileType != null) { - final EditorHighlighter editorHighlighter = substFileType.getEditorHighlighter(project, vFile, settings); + final EditorHighlighter editorHighlighter = FileTypeEditorHighlighterProviders.INSTANCE.forFileType(substFileType).getEditorHighlighter(project, vFile, settings); boolean isPlain = editorHighlighter.getClass() == LexerEditorHighlighter.class && ((LexerEditorHighlighter) editorHighlighter).isPlain(); if (!isPlain) { return editorHighlighter; } } - return ((LanguageFileType)fileType).getEditorHighlighter(project, vFile, settings); + return FileTypeEditorHighlighterProviders.INSTANCE.forFileType(fileType).getEditorHighlighter(project, vFile, settings); } final ContentBasedClassFileProcessor[] processors = Extensions.getExtensions(ContentBasedClassFileProcessor.EP_NAME); diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index 88a0541bc5fc..5878d6111650 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -116,4 +116,5 @@ + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java index c3c6633a94bc..cb97a0309478 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyFileType.java @@ -16,6 +16,8 @@ package org.jetbrains.plugins.groovy; +import com.intellij.openapi.fileTypes.EditorHighlighterProvider; +import com.intellij.openapi.fileTypes.FileTypeEditorHighlighterProviders; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.colors.EditorColorsScheme; @@ -42,6 +44,14 @@ public class GroovyFileType extends LanguageFileType { private GroovyFileType() { super(new GroovyLanguage()); + FileTypeEditorHighlighterProviders.INSTANCE.addExplicitExtension(this, new EditorHighlighterProvider() { + @Override + public EditorHighlighter getEditorHighlighter(@Nullable Project project, + @Nullable VirtualFile virtualFile, + @NotNull EditorColorsScheme colors) { + return new GroovyEditorHighlighter(colors, project, virtualFile); + } + }); } @NotNull @@ -69,8 +79,4 @@ public class GroovyFileType extends LanguageFileType { public boolean isJVMDebuggingSupported() { return true; } - - public EditorHighlighter getEditorHighlighter(@Nullable Project project, @Nullable VirtualFile virtualFile, @NotNull EditorColorsScheme colors) { - return new GroovyEditorHighlighter(colors, project, virtualFile); - } } diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/HighlightingOutputConsole.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/HighlightingOutputConsole.java index aadfcaca76ab..314b8d41f8dc 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/HighlightingOutputConsole.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/HighlightingOutputConsole.java @@ -23,7 +23,9 @@ import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; +import com.intellij.openapi.fileTypes.EditorHighlighterProvider; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeEditorHighlighterProviders; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; @@ -51,7 +53,8 @@ public class HighlightingOutputConsole extends AdditionalTabComponent implements assert editorEx != null; if (fileType != null) { - final EditorHighlighter highlighter = ((LanguageFileType)fileType).getEditorHighlighter(project, null, editorEx.getColorsScheme()); + EditorHighlighterProvider provider = FileTypeEditorHighlighterProviders.INSTANCE.forFileType(fileType); + final EditorHighlighter highlighter = provider.getEditorHighlighter(project, null, editorEx.getColorsScheme()); editorEx.setHighlighter(highlighter); } }