blob: 58e540578f3373e70b887f252c5a408d879632e2 [file] [log] [blame]
/*
* Copyright 2000-2009 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.compiler;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
/**
* A "root" class in compiler subsystem - allows one to register a custom compiler or a compilation task, register/unregister a compilation listener
* and invoke various types of compilations (make, compile, rebuild)
*/
public abstract class CompilerManager {
@Deprecated
public static final Key<Key> CONTENT_ID_KEY = Key.create("COMPILATION_CONTENT_ID_CUSTOM_KEY");
public static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.logOnlyGroup("Compiler");
/**
* Returns the compiler manager instance for the specified project.
*
* @param project the project for which the manager is requested.
* @return the manager instance.
*/
public static CompilerManager getInstance(Project project) {
return ServiceManager.getService(project, CompilerManager.class);
}
public abstract boolean isCompilationActive();
/**
* Registers a custom compiler.
*
* @param compiler the compiler to register.
*/
public abstract void addCompiler(@NotNull Compiler compiler);
/**
* Registers a custom translating compiler. Input and output filetype sets allow compiler manager
* to sort translating compilers so that output of one compiler will be used as input for another one
*
* @param compiler compiler implementation
* @param inputTypes a set of filetypes that compiler accepts as input
* @param outputTypes a set of filetypes that compiler can generate
*
* @deprecated this method is part of the obsolete build system which runs as part of the IDE process. Since IDEA 12 plugins need to
* integrate into 'external build system' instead (http://confluence.jetbrains.com/display/IDEADEV/External+Builder+API+and+Plugins).
* Since IDEA 13 users cannot switch to the old build system via UI and it will be completely removed in IDEA 14.
*/
public abstract void addTranslatingCompiler(@NotNull TranslatingCompiler compiler, Set<FileType> inputTypes, Set<FileType> outputTypes);
/**
* Unregisters a custom compiler.
*
* @param compiler the compiler to unregister.
*/
public abstract void removeCompiler(@NotNull Compiler compiler);
/**
* Returns all registered compilers of the specified class.
*
* @param compilerClass the class for which the compilers should be returned.
* @return all registered compilers of the specified class.
*/
@NotNull
public abstract <T extends Compiler> T[] getCompilers(@NotNull Class<T> compilerClass);
/**
* Returns all registered compilers of the specified class that the filter accepts
*
* @param compilerClass the class for which the compilers should be returned.
* @param filter additional filter to restrict compiler instances
* @return all registered compilers of the specified class.
*/
@NotNull
public abstract <T extends Compiler> T[] getCompilers(@NotNull Class<T> compilerClass, CompilerFilter filter);
/**
* Registers the type as a compilable type so that Compile action will be enabled on files of this type.
*
* @param type the type for which the Compile action is enabled.
*/
public abstract void addCompilableFileType(@NotNull FileType type);
/**
* Unregisters the type as a compilable type so that Compile action will be disabled on files of this type.
*
* @param type the type for which the Compile action is disabled.
*/
public abstract void removeCompilableFileType(@NotNull FileType type);
/**
* Checks if files of the specified type can be compiled by one of registered compilers.
* If the compiler can process files of certain type, it should register this file type within
* the CompilerManager as a compilable file type.
*
* @param type the type to check.
* @return true if the file type is compilable, false otherwise.
* @see com.intellij.openapi.compiler.CompilerManager#addCompilableFileType(FileType)
*/
public abstract boolean isCompilableFileType(@NotNull FileType type);
/**
* Registers a compiler task that will be executed before the compilation.
*
* @param task the task to register.
*/
public abstract void addBeforeTask(@NotNull CompileTask task);
/**
* Registers a compiler task that will be executed after the compilation.
*
* @param task the task to register.
*/
public abstract void addAfterTask(@NotNull CompileTask task);
/**
* Returns the list of all tasks to be executed before compilation.
*
* @return all tasks to be executed before compilation.
*/
@NotNull
public abstract CompileTask[] getBeforeTasks();
/**
* Returns the list of all tasks to be executed after compilation.
*
* @return all tasks to be executed after compilation.
*/
@NotNull
public abstract CompileTask[] getAfterTasks();
/**
* Compile a set of files.
*
* @param files a list of files to compile. If a VirtualFile is a directory, all containing files are processed.
* Compiler excludes are not honored.
* @param callback a notification callback, or null if no notifications needed.
*/
public abstract void compile(@NotNull VirtualFile[] files, @Nullable CompileStatusNotification callback);
/**
* Compile all sources (including test sources) from the module. Compiler excludes are not honored.
*
* @param module a module which sources are to be compiled
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void compile(@NotNull Module module, @Nullable CompileStatusNotification callback);
/**
* Compile all files from the scope given. Compiler excludes are not honored.
*
* @param scope a scope to be compiled
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void compile(@NotNull CompileScope scope, @Nullable CompileStatusNotification callback);
/**
* Compile all modified files and all files that depend on them all over the project.
* Files are compiled according to dependencies between the modules they belong to. Compiler excludes are honored.
*
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void make(@Nullable CompileStatusNotification callback);
/**
* Compile all modified files and all files that depend on them from the given module and all modules this module depends on recursively.
* Files are compiled according to dependencies between the modules they belong to. Compiler excludes are honored.
*
* @param module a module which sources are to be compiled.
* @param callback a notification callback, or null if no notifications needed.
*/
public abstract void make(@NotNull Module module, @Nullable CompileStatusNotification callback);
/**
* Compile all modified files and all files that depend on them from the modules and all modules these modules depend on recursively.
* Files are compiled according to dependencies between the modules they belong to. Compiler excludes are honored. All modules must belong to the same project.
*
* @param project a project modules belong to
* @param modules modules to compile
* @param callback a notification callback, or null if no notifications needed.
*/
public abstract void make(@NotNull Project project, @NotNull Module[] modules, @Nullable CompileStatusNotification callback);
/**
* Compile all modified files and all files that depend on them from the scope given.
* Files are compiled according to dependencies between the modules they belong to. Compiler excludes are honored. All modules must belong to the same project
*
* @param scope a scope to be compiled
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void make(@NotNull CompileScope scope, @Nullable CompileStatusNotification callback);
/**
* Compile all modified files and all files that depend on them from the scope given.
* Files are compiled according to dependencies between the modules they belong to. Compiler excludes are honored. All modules must belong to the same project
*
* @param scope a scope to be compiled
* @param filter filter allowing choose what compilers should be executed
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void make(@NotNull CompileScope scope, CompilerFilter filter, @Nullable CompileStatusNotification callback);
/**
* Checks if compile scope given is up-to-date
* @param scope
* @return true if make on the scope specified wouldn't do anything or false if something is to be compiled or deleted
*/
public abstract boolean isUpToDate(@NotNull CompileScope scope);
/**
* Rebuild the whole project from scratch. Compiler excludes are honored.
*
* @param callback a notification callback, or null if no notifications needed
*/
public abstract void rebuild(@Nullable CompileStatusNotification callback);
/**
* Execute a custom compile task.
*
* @param task the task to execute.
* @param scope compile scope for which the task is executed.
* @param contentName the name of a tab in message view where the execution results will be displayed.
* @param onTaskFinished a runnable to be executed when the task finishes, null if nothing should be executed.
*/
public abstract void executeTask(@NotNull CompileTask task, @NotNull CompileScope scope, String contentName,
@Nullable Runnable onTaskFinished);
/**
* Register a listener to track compilation events.
*
* @param listener the listener to be registered.
*/
public abstract void addCompilationStatusListener(@NotNull CompilationStatusListener listener);
public abstract void addCompilationStatusListener(@NotNull CompilationStatusListener listener, @NotNull Disposable parentDisposable);
/**
* Unregister a compilation listener.
*
* @param listener the listener to be unregistered.
*/
public abstract void removeCompilationStatusListener(@NotNull CompilationStatusListener listener);
/**
* Checks if the specified file is excluded from compilation.
*
* @param file the file to check.
* @return true if the file is excluded from compilation, false otherwise
*/
public abstract boolean isExcludedFromCompilation(@NotNull VirtualFile file);
/*
* Convetience methods for creating frequently-used compile scopes
*/
@NotNull
public abstract CompileScope createFilesCompileScope(@NotNull VirtualFile[] files);
@NotNull
public abstract CompileScope createModuleCompileScope(@NotNull Module module, boolean includeDependentModules);
@NotNull
public abstract CompileScope createModulesCompileScope(@NotNull Module[] modules, boolean includeDependentModules);
@NotNull
public abstract CompileScope createModulesCompileScope(@NotNull Module[] modules, boolean includeDependentModules, boolean includeRuntimeDependencies);
@NotNull
public abstract CompileScope createModuleGroupCompileScope(@NotNull Project project, @NotNull Module[] modules, boolean includeDependentModules);
@NotNull
public abstract CompileScope createProjectCompileScope(@NotNull Project project);
public abstract void setValidationEnabled(ModuleType moduleType, boolean enabled);
public abstract boolean isValidationEnabled(Module moduleType);
}