/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * IBM Corporation - added the following constants: * COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE * COMPILER_PB_STATIC_ACCESS_RECEIVER * COMPILER_TASK_TAGS * CORE_CIRCULAR_CLASSPATH * CORE_INCOMPLETE_CLASSPATH * IBM Corporation - added run(IWorkspaceRunnable, IProgressMonitor) * IBM Corporation - added exclusion patterns to source includepath entries * IBM Corporation - added specific output location to source includepath entries * IBM Corporation - added the following constants: * CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER * CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER * CLEAN * IBM Corporation - added getJsGlobalScopeContainerInitializer(String) * IBM Corporation - added the following constants: * CODEASSIST_ARGUMENT_PREFIXES * CODEASSIST_ARGUMENT_SUFFIXES * CODEASSIST_FIELD_PREFIXES * CODEASSIST_FIELD_SUFFIXES * CODEASSIST_LOCAL_PREFIXES * CODEASSIST_LOCAL_SUFFIXES * CODEASSIST_STATIC_FIELD_PREFIXES * CODEASSIST_STATIC_FIELD_SUFFIXES * COMPILER_PB_CHAR_ARRAY_IN_STRING_CONCATENATION * IBM Corporation - added the following constants: * COMPILER_PB_LOCAL_VARIABLE_HIDING * COMPILER_PB_SPECIAL_PARAMETER_HIDING_FIELD * COMPILER_PB_FIELD_HIDING * COMPILER_PB_POSSIBLE_ACCIDENTAL_BOOLEAN_ASSIGNMENT * CORE_INCOMPATIBLE_JDK_LEVEL * VERSION_1_5 * COMPILER_PB_EMPTY_STATEMENT * IBM Corporation - added the following constants: * COMPILER_PB_INDIRECT_STATIC_ACCESS * COMPILER_PB_BOOLEAN_METHOD_THROWING_EXCEPTION * COMPILER_PB_UNNECESSARY_CAST * IBM Corporation - added the following constants: * COMPILER_PB_INVALID_JAVADOC * COMPILER_PB_INVALID_JAVADOC_TAGS * COMPILER_PB_INVALID_JAVADOC_TAGS_VISIBILITY * COMPILER_PB_MISSING_JAVADOC_TAGS * COMPILER_PB_MISSING_JAVADOC_TAGS_VISIBILITY * COMPILER_PB_MISSING_JAVADOC_TAGS_OVERRIDING * COMPILER_PB_MISSING_JAVADOC_COMMENTS * COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY * COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING * COMPILER_PB_DEPRECATION_WHEN_OVERRIDING_DEPRECATED_METHOD * COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING * IBM Corporation - added the following constants: * TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC * IBM Corporation - added the following constants: * COMPILER_PB_FALLTHROUGH_CASE * COMPILER_PB_PARAMETER_ASSIGNMENT * COMPILER_PB_NULL_REFERENCE * IBM Corporation - added the following constants: * CODEASSIST_DEPRECATION_CHECK *******************************************************************************/ package org.eclipse.wst.jsdt.core; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.wst.jsdt.core.compiler.CharOperation; import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchConstants; import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchScope; import org.eclipse.wst.jsdt.core.search.SearchEngine; import org.eclipse.wst.jsdt.core.search.SearchPattern; import org.eclipse.wst.jsdt.core.search.TypeNameRequestor; import org.eclipse.wst.jsdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.wst.jsdt.internal.compiler.impl.CompilerOptions; import org.eclipse.wst.jsdt.internal.compiler.util.SuffixConstants; import org.eclipse.wst.jsdt.internal.core.BatchOperation; import org.eclipse.wst.jsdt.internal.core.ClasspathAccessRule; import org.eclipse.wst.jsdt.internal.core.ClasspathAttribute; import org.eclipse.wst.jsdt.internal.core.ClasspathEntry; import org.eclipse.wst.jsdt.internal.core.CreateTypeHierarchyOperation; import org.eclipse.wst.jsdt.internal.core.DefaultWorkingCopyOwner; import org.eclipse.wst.jsdt.internal.core.JavaModel; import org.eclipse.wst.jsdt.internal.core.JavaModelManager; import org.eclipse.wst.jsdt.internal.core.JavaProject; import org.eclipse.wst.jsdt.internal.core.Region; import org.eclipse.wst.jsdt.internal.core.SetContainerOperation; import org.eclipse.wst.jsdt.internal.core.SetVariablesOperation; import org.eclipse.wst.jsdt.internal.core.UserLibraryManager; import org.eclipse.wst.jsdt.internal.core.builder.JavaBuilder; import org.eclipse.wst.jsdt.internal.core.builder.State; import org.eclipse.wst.jsdt.internal.core.util.MementoTokenizer; import org.eclipse.wst.jsdt.internal.core.util.Messages; import org.eclipse.wst.jsdt.internal.core.util.Util; import org.osgi.framework.BundleContext; /** * The plug-in runtime class for the JavaScript model plug-in containing the core * (UI-free) support for JavaScript projects. * <p> * Like all plug-in runtime classes (subclasses of <code>Plugin</code>), this * class is automatically instantiated by the platform when the plug-in gets * activated. Clients must not attempt to instantiate plug-in runtime classes * directly. * </p> * <p> * The single instance of this class can be accessed from any plug-in declaring * the JavaScript model plug-in as a prerequisite via * <code>JavaScriptCore.getJavaCore()</code>. The JavaScript model plug-in will be activated * automatically if not already active. * </p> * * Provisional API: This class/interface is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. */ public final class JavaScriptCore extends Plugin { public static final boolean IS_ECMASCRIPT4=false; private static final IResource[] NO_GENERATED_RESOURCES = new IResource[0]; private static Plugin JAVA_CORE_PLUGIN = null; /** * The plug-in identifier of the JavaScript core support * (value <code>"org.eclipse.wst.jsdt.core"</code>). */ public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.core" ; //$NON-NLS-1$ /** * The identifier for the JavaScript validator * (value <code>"org.eclipse.wst.jsdt.core.javascriptValidator"</code>). */ public static final String BUILDER_ID = PLUGIN_ID + ".javascriptValidator" ; //$NON-NLS-1$ /** * The identifier for the JavaScript model * (value <code>"org.eclipse.wst.jsdt.core.jsmodel"</code>). */ public static final String MODEL_ID = PLUGIN_ID + ".jsmodel" ; //$NON-NLS-1$ /** * The identifier for the JavaScript nature * (value <code>"org.eclipse.wst.jsdt.core.jsnature"</code>). * The presence of this nature on a project indicates that it is * JavaScript-capable. * * @see org.eclipse.core.resources.IProject#hasNature(java.lang.String) */ public static final String NATURE_ID = PLUGIN_ID + ".jsNature" ; //$NON-NLS-1$ /** * Name of the handle id attribute in a JavaScript marker. */ protected static final String ATT_HANDLE_ID = "org.eclipse.wst.jsdt.internal.core.JavaModelManager.handleId" ; //$NON-NLS-1$ /** * Name of the User Library Container id. */ public static final String USER_LIBRARY_CONTAINER_ID= "org.eclipse.wst.jsdt.USER_LIBRARY"; //$NON-NLS-1$ // *************** Possible IDs for configurable options. ******************** /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_LOCAL_VARIABLE_ATTR = PLUGIN_ID + ".compiler.debug.localVariable"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_LINE_NUMBER_ATTR = PLUGIN_ID + ".compiler.debug.lineNumber"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_SOURCE_FILE_ATTR = PLUGIN_ID + ".compiler.debug.sourceFile"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_CODEGEN_UNUSED_LOCAL = PLUGIN_ID + ".compiler.codegen.unusedLocal"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_CODEGEN_TARGET_PLATFORM = PLUGIN_ID + ".compiler.codegen.targetPlatform"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_CODEGEN_INLINE_JSR_BYTECODE = PLUGIN_ID + ".compiler.codegen.inlineJsrBytecode"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_DOC_COMMENT_SUPPORT = PLUGIN_ID + ".compiler.doc.comment.support"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() * @deprecated - discontinued since turning off would violate language specs */ public static final String COMPILER_PB_UNREACHABLE_CODE = PLUGIN_ID + ".compiler.problem.unreachableCode"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() * @deprecated - discontinued since turning off would violate language specs */ public static final String COMPILER_PB_INVALID_IMPORT = PLUGIN_ID + ".compiler.problem.invalidImport"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNDEFINED_FIELD = PLUGIN_ID + ".compiler.problem.undefinedField"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME = PLUGIN_ID + ".compiler.problem.methodWithConstructorName"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_DEPRECATION = PLUGIN_ID + ".compiler.problem.deprecation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE = PLUGIN_ID + ".compiler.problem.deprecationInDeprecatedCode"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_DEPRECATION_WHEN_OVERRIDING_DEPRECATED_METHOD = "org.eclipse.wst.jsdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_HIDDEN_CATCH_BLOCK = PLUGIN_ID + ".compiler.problem.hiddenCatchBlock"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_LOCAL = PLUGIN_ID + ".compiler.problem.unusedLocal"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_PARAMETER = PLUGIN_ID + ".compiler.problem.unusedParameter"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_PARAMETER_WHEN_IMPLEMENTING_ABSTRACT = PLUGIN_ID + ".compiler.problem.unusedParameterWhenImplementingAbstract"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_PARAMETER_WHEN_OVERRIDING_CONCRETE = PLUGIN_ID + ".compiler.problem.unusedParameterWhenOverridingConcrete"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE = PLUGIN_ID + ".compiler.problem.unusedParameterIncludeDocCommentReference"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_IMPORT = PLUGIN_ID + ".compiler.problem.unusedImport"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_NON_NLS_STRING_LITERAL = PLUGIN_ID + ".compiler.problem.nonExternalizedStringLiteral"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_ASSERT_IDENTIFIER = PLUGIN_ID + ".compiler.problem.assertIdentifier"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_STATIC_ACCESS_RECEIVER = PLUGIN_ID + ".compiler.problem.staticAccessReceiver"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INDIRECT_STATIC_ACCESS = PLUGIN_ID + ".compiler.problem.indirectStaticAccess"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_NO_EFFECT_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.noEffectAssignment"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_PRIVATE_MEMBER = PLUGIN_ID + ".compiler.problem.unusedPrivateMember"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_LOCAL_VARIABLE_HIDING = PLUGIN_ID + ".compiler.problem.localVariableHiding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_SPECIAL_PARAMETER_HIDING_FIELD = PLUGIN_ID + ".compiler.problem.specialParameterHidingField"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FIELD_HIDING = PLUGIN_ID + ".compiler.problem.fieldHiding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_TYPE_PARAMETER_HIDING = PLUGIN_ID + ".compiler.problem.typeParameterHiding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_POSSIBLE_ACCIDENTAL_BOOLEAN_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.possibleAccidentalBooleanAssignment"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FALLTHROUGH_CASE = PLUGIN_ID + ".compiler.problem.fallthroughCase"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_EMPTY_STATEMENT = PLUGIN_ID + ".compiler.problem.emptyStatement"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_BOOLEAN_METHOD_THROWING_EXCEPTION = PLUGIN_ID + ".compiler.problem.booleanMethodThrowingException"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNNECESSARY_TYPE_CHECK = PLUGIN_ID + ".compiler.problem.unnecessaryTypeCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNNECESSARY_ELSE = PLUGIN_ID + ".compiler.problem.unnecessaryElse"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNDOCUMENTED_EMPTY_BLOCK = PLUGIN_ID + ".compiler.problem.undocumentedEmptyBlock"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FINALLY_BLOCK_NOT_COMPLETING = PLUGIN_ID + ".compiler.problem.finallyBlockNotCompletingNormally"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION = PLUGIN_ID + ".compiler.problem.unusedDeclaredThrownException"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING = PLUGIN_ID + ".compiler.problem.unusedDeclaredThrownExceptionWhenOverriding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNQUALIFIED_FIELD_ACCESS = PLUGIN_ID + ".compiler.problem.unqualifiedFieldAccess"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() * @deprecated - got renamed into {@link #COMPILER_PB_UNCHECKED_TYPE_OPERATION} */ public static final String COMPILER_PB_UNSAFE_TYPE_OPERATION = PLUGIN_ID + ".compiler.problem.uncheckedTypeOperation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNCHECKED_TYPE_OPERATION = PLUGIN_ID + ".compiler.problem.uncheckedTypeOperation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_RAW_TYPE_REFERENCE = PLUGIN_ID + ".compiler.problem.rawTypeReference"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FINAL_PARAMETER_BOUND = PLUGIN_ID + ".compiler.problem.finalParameterBound"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_VARARGS_ARGUMENT_NEED_CAST = PLUGIN_ID + ".compiler.problem.varargsArgumentNeedCast"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_OVERRIDE_ANNOTATION = PLUGIN_ID + ".compiler.problem.missingOverrideAnnotation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_DEPRECATED_ANNOTATION = PLUGIN_ID + ".compiler.problem.missingDeprecatedAnnotation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNUSED_LABEL = PLUGIN_ID + ".compiler.problem.unusedLabel"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INVALID_JAVADOC = PLUGIN_ID + ".compiler.problem.invalidJavadoc"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INVALID_JAVADOC_TAGS = PLUGIN_ID + ".compiler.problem.invalidJavadocTags"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INVALID_JAVADOC_TAGS__DEPRECATED_REF = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsDeprecatedRef"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INVALID_JAVADOC_TAGS__NOT_VISIBLE_REF = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsNotVisibleRef"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_INVALID_JAVADOC_TAGS_VISIBILITY = PLUGIN_ID + ".compiler.problem.invalidJavadocTagsVisibility"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_TAGS = PLUGIN_ID + ".compiler.problem.missingJavadocTags"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_TAGS_VISIBILITY = PLUGIN_ID + ".compiler.problem.missingJavadocTagsVisibility"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_TAGS_OVERRIDING = PLUGIN_ID + ".compiler.problem.missingJavadocTagsOverriding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_COMMENTS = PLUGIN_ID + ".compiler.problem.missingJavadocComments"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY = PLUGIN_ID + ".compiler.problem.missingJavadocCommentsVisibility"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING = PLUGIN_ID + ".compiler.problem.missingJavadocCommentsOverriding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_MAX_PER_UNIT = PLUGIN_ID + ".compiler.maxProblemPerUnit"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FATAL_OPTIONAL_ERROR = PLUGIN_ID + ".compiler.problem.fatalOptionalError"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_PARAMETER_ASSIGNMENT = PLUGIN_ID + ".compiler.problem.parameterAssignment"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_SEMANTIC_VALIDATION = "semanticValidation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_SOURCE = PLUGIN_ID + ".compiler.source"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_COMPLIANCE = PLUGIN_ID + ".compiler.compliance"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_PRIORITIES = PLUGIN_ID + ".compiler.taskPriorities"; //$NON-NLS-1$ /** * Possible configurable option value for COMPILER_TASK_PRIORITIES. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_PRIORITY_HIGH = "HIGH"; //$NON-NLS-1$ /** * Possible configurable option value for COMPILER_TASK_PRIORITIES. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_PRIORITY_LOW = "LOW"; //$NON-NLS-1$ /** * Possible configurable option value for COMPILER_TASK_PRIORITIES. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_PRIORITY_NORMAL = "NORMAL"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_TAGS = PLUGIN_ID + ".compiler.taskTags"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_TASK_CASE_SENSITIVE = PLUGIN_ID + ".compiler.taskCaseSensitive"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_FORBIDDEN_REFERENCE = PLUGIN_ID + ".compiler.problem.forbiddenReference"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_DISCOURAGED_REFERENCE = PLUGIN_ID + ".compiler.problem.discouragedReference"; //$NON-NLS-1$ /* START -------------------------------- Bug 203292 Type/Method/Filed resolution error configuration --------------------- */ public static final String UNRESOLVED_TYPE_REFERENCE = PLUGIN_ID + ".compiler.problem.unresolvedTypeReference"; //$NON-NLS-1$ public static final String UNRESOLVED_FIELD_REFERENCE = PLUGIN_ID + ".compiler.problem.unresolvedFieldReference"; //$NON-NLS-1$ public static final String UNRESOLVED_METHOD_REFERENCE = PLUGIN_ID + ".compiler.problem.unresolvedMethodReference"; //$NON-NLS-1$ /* END -------------------------------- Bug 203292 Type/Method/Filed resolution error configuration --------------------- */ /* START -------------------------------- Bug 197884 Loosly defined var (for statement) and optional semi-colon --------------------- */ public static final String LOOSE_VAR_DECL = PLUGIN_ID + ".compiler.problem.looseVarDecleration"; //$NON-NLS-1$ public static final String OPTIONAL_SEMICOLON = PLUGIN_ID + ".compiler.problem.optionalSemicolon"; //$NON-NLS-1$ /* END -------------------------------- Bug 197884 Loosly defined var (for statement) and optional semi-colon --------------------- */ /** * * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_SUPPRESS_WARNINGS = PLUGIN_ID + ".compiler.problem.suppressWarnings"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNHANDLED_WARNING_TOKEN = PLUGIN_ID + ".compiler.problem.unhandledWarningToken"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_NULL_REFERENCE = PLUGIN_ID + ".compiler.problem.nullReference"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_POTENTIAL_NULL_REFERENCE = PLUGIN_ID + ".compiler.problem.potentialNullReference"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_DUPLICATE_LOCAL_VARIABLES = PLUGIN_ID + ".compiler.problem.duplicateLocalVariables"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_REDUNDANT_NULL_CHECK = PLUGIN_ID + ".compiler.problem.redundantNullCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNINITIALIZED_LOCAL_VARIABLE = PLUGIN_ID + ".compiler.problem.uninitializedLocalVariable"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_UNINITIALIZED_GLOBAL_VARIABLE = PLUGIN_ID + ".compiler.problem.uninitializedGlobalVariable"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String COMPILER_PB_OVERRIDING_METHOD_WITHOUT_SUPER_INVOCATION = PLUGIN_ID + ".compiler.problem.overridingMethodWithoutSuperInvocation"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_ORDER = PLUGIN_ID + ".computeJavaBuildOrder"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_RESOURCE_COPY_FILTER = PLUGIN_ID + ".builder.resourceCopyExclusionFilter"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_DUPLICATE_RESOURCE = PLUGIN_ID + ".builder.duplicateResourceTask"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER = PLUGIN_ID + ".builder.cleanOutputFolder"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER = PLUGIN_ID + ".builder.recreateModifiedClassFileInOutputFolder"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_INCOMPLETE_CLASSPATH = PLUGIN_ID + ".incompleteClasspath"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_CIRCULAR_CLASSPATH = PLUGIN_ID + ".circularClasspath"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_INCOMPATIBLE_JDK_LEVEL = PLUGIN_ID + ".incompatibleJDKLevel"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_JAVA_BUILD_INVALID_CLASSPATH = PLUGIN_ID + ".builder.invalidClasspath"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_ENCODING = PLUGIN_ID + ".encoding"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_ENABLE_CLASSPATH_EXCLUSION_PATTERNS = PLUGIN_ID + ".classpath.exclusionPatterns"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CORE_ENABLE_CLASSPATH_MULTIPLE_OUTPUT_LOCATIONS = PLUGIN_ID + ".classpath.multipleOutputLocations"; //$NON-NLS-1$ /** * Default task tag * @deprecated Use {@link #DEFAULT_TASK_TAGS} instead */ public static final String DEFAULT_TASK_TAG = "TODO"; //$NON-NLS-1$ /** * Default task priority * @deprecated Use {@link #DEFAULT_TASK_PRIORITIES} instead */ public static final String DEFAULT_TASK_PRIORITY = "NORMAL"; //$NON-NLS-1$ /** * Default task tag */ public static final String DEFAULT_TASK_TAGS = "TODO,FIXME,XXX"; //$NON-NLS-1$ /** * Default task priority */ public static final String DEFAULT_TASK_PRIORITIES = "NORMAL,HIGH,NORMAL"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_VISIBILITY_CHECK = PLUGIN_ID + ".codeComplete.visibilityCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_DEPRECATION_CHECK = PLUGIN_ID + ".codeComplete.deprecationCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_CAMEL_CASE_MATCH = PLUGIN_ID + ".codeComplete.camelCaseMatch"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_IMPLICIT_QUALIFICATION = PLUGIN_ID + ".codeComplete.forceImplicitQualification"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_FIELD_PREFIXES = PLUGIN_ID + ".codeComplete.fieldPrefixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_STATIC_FIELD_PREFIXES = PLUGIN_ID + ".codeComplete.staticFieldPrefixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_LOCAL_PREFIXES = PLUGIN_ID + ".codeComplete.localPrefixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_ARGUMENT_PREFIXES = PLUGIN_ID + ".codeComplete.argumentPrefixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_FIELD_SUFFIXES = PLUGIN_ID + ".codeComplete.fieldSuffixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_STATIC_FIELD_SUFFIXES = PLUGIN_ID + ".codeComplete.staticFieldSuffixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_LOCAL_SUFFIXES = PLUGIN_ID + ".codeComplete.localSuffixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_ARGUMENT_SUFFIXES = PLUGIN_ID + ".codeComplete.argumentSuffixes"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_FORBIDDEN_REFERENCE_CHECK= PLUGIN_ID + ".codeComplete.forbiddenReferenceCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_DISCOURAGED_REFERENCE_CHECK= PLUGIN_ID + ".codeComplete.discouragedReferenceCheck"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String CODEASSIST_SUGGEST_STATIC_IMPORTS= PLUGIN_ID + ".codeComplete.suggestStaticImports"; //$NON-NLS-1$ /** * Possible configurable option ID. * @see #getDefaultOptions() */ public static final String TIMEOUT_FOR_PARAMETER_NAME_FROM_ATTACHED_JAVADOC = PLUGIN_ID + ".timeoutForParameterNameFromAttachedJavadoc"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String GENERATE = "generate"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String DO_NOT_GENERATE = "do not generate"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String PRESERVE = "preserve"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String OPTIMIZE_OUT = "optimize out"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_1 = "1.1"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_2 = "1.2"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_3 = "1.3"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_4 = "1.4"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_5 = "1.5"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_6 = "1.6"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String VERSION_1_7 = "1.7"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String ABORT = "abort"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String ERROR = "error"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String WARNING = "warning"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String IGNORE = "ignore"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String COMPUTE = "compute"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String INSERT = "insert"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String DO_NOT_INSERT = "do not insert"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String PRESERVE_ONE = "preserve one"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String CLEAR_ALL = "clear all"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String NORMAL = "normal"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String COMPACT = "compact"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String TAB = "tab"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String SPACE = "space"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String ENABLED = "enabled"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String DISABLED = "disabled"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String CLEAN = "clean"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String PUBLIC = "public"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String PROTECTED = "protected"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String DEFAULT = "default"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String PRIVATE = "private"; //$NON-NLS-1$ /** * Possible configurable option value. * @see #getDefaultOptions() */ public static final String NEVER = "never"; //$NON-NLS-1$ /** * Value of the content-type for JavaScript source files. Use this value to retrieve the JavaScript content type * from the content type manager, and to add new JavaScript-like extensions to this content type. * * @see org.eclipse.core.runtime.content.IContentTypeManager#getContentType(String) * @see #getJavaScriptLikeExtensions() */ public static final String JAVA_SOURCE_CONTENT_TYPE = JavaScriptCore.PLUGIN_ID+".jsSource" ; //$NON-NLS-1$ public static final String READ_ONLY_SOURCE_PROPERTY = "readOnlyResource" ; //$NON-NLS-1$ /** * Creates the JavaScript core plug-in. * <p> * The plug-in instance is created automatically by the * Eclipse platform. Clients must not call. * </p> * */ public JavaScriptCore() { super(); JAVA_CORE_PLUGIN = this; } /** * Adds the given listener for changes to JavaScript elements. * Has no effect if an identical listener is already registered. * * This listener will only be notified during the POST_CHANGE resource change notification * and any reconcile operation (POST_RECONCILE). * For finer control of the notification, use <code>addElementChangedListener(IElementChangedListener,int)</code>, * which allows to specify a different eventMask. * * @param listener the listener * @see ElementChangedEvent */ public static void addElementChangedListener(IElementChangedListener listener) { addElementChangedListener(listener, ElementChangedEvent.POST_CHANGE | ElementChangedEvent.POST_RECONCILE); } /** * Adds the given listener for changes to JavaScript elements. * Has no effect if an identical listener is already registered. * After completion of this method, the given listener will be registered for exactly * the specified events. If they were previously registered for other events, they * will be deregistered. * <p> * Once registered, a listener starts receiving notification of changes to * javaScript elements in the model. The listener continues to receive * notifications until it is replaced or removed. * </p> * <p> * Listeners can listen for several types of event as defined in <code>ElementChangeEvent</code>. * Clients are free to register for any number of event types however if they register * for more than one, it is their responsibility to ensure they correctly handle the * case where the same javaScript element change shows up in multiple notifications. * Clients are guaranteed to receive only the events for which they are registered. * </p> * * @param listener the listener * @param eventMask the bit-wise OR of all event types of interest to the listener * @see IElementChangedListener * @see ElementChangedEvent * @see #removeElementChangedListener(IElementChangedListener) */ public static void addElementChangedListener(IElementChangedListener listener, int eventMask) { JavaModelManager.getJavaModelManager().deltaState.addElementChangedListener(listener, eventMask); } /** * Configures the given marker attribute map for the given JavaScript element. * Used for markers, which denote a JavaScript element rather than a resource. * * @param attributes the mutable marker attribute map (key type: <code>String</code>, * value type: <code>String</code>) * @param element the JavaScript element for which the marker needs to be configured */ public static void addJavaScriptElementMarkerAttributes( Map attributes, IJavaScriptElement element) { if (element instanceof IMember) element = ((IMember) element).getClassFile(); if (attributes != null && element != null) attributes.put(ATT_HANDLE_ID, element.getHandleIdentifier()); } /** * Adds the given listener for resource change events of the given types to the JavaScript core. * The listener is guaranteed to be notified of the resource change event before * the JavaScript core starts processing the resource change event itself. * <p> * If an identical listener is already registered, the given event types are added to the event types * of interest to the listener. * </p> * <p> * Supported event types are: * <ul> * <li>{@link IResourceChangeEvent#PRE_BUILD}</li> * <li>{@link IResourceChangeEvent#POST_BUILD}</li> * <li>{@link IResourceChangeEvent#POST_CHANGE}</li> * <li>{@link IResourceChangeEvent#PRE_DELETE}</li> * <li>{@link IResourceChangeEvent#PRE_CLOSE}</li> * </ul> * This list may increase in the future. * </p> * * @param listener the listener * @param eventMask the bit-wise OR of all event types of interest to the * listener * @see #removePreProcessingResourceChangedListener(IResourceChangeListener) * @see IResourceChangeEvent */ public static void addPreProcessingResourceChangedListener(IResourceChangeListener listener, int eventMask) { JavaModelManager.getJavaModelManager().deltaState.addPreResourceChangedListener(listener, eventMask); } /** * Configures the given marker for the given JavaScript element. * Used for markers, which denote a JavaScript element rather than a resource. * * @param marker the marker to be configured * @param element the JavaScript element for which the marker needs to be configured * @exception CoreException if the <code>IMarker.setAttribute</code> on the marker fails */ public void configureJavaScriptElementMarker(IMarker marker, IJavaScriptElement element) throws CoreException { if (element instanceof IMember) element = ((IMember) element).getClassFile(); if (marker != null && element != null) marker.setAttribute(ATT_HANDLE_ID, element.getHandleIdentifier()); } /** * Returns the JavaScript model element corresponding to the given handle identifier * generated by <code>IJavaScriptElement.getHandleIdentifier()</code>, or * <code>null</code> if unable to create the associated element. * * @param handleIdentifier the given handle identifier * @return the JavaScript element corresponding to the handle identifier */ public static IJavaScriptElement create(String handleIdentifier) { return create(handleIdentifier, DefaultWorkingCopyOwner.PRIMARY); } /** * Returns the JavaScript model element corresponding to the given handle identifier * generated by <code>IJavaScriptElement.getHandleIdentifier()</code>, or * <code>null</code> if unable to create the associated element. * If the returned JavaScript element is an <code>IJavaScriptUnit</code>, its owner * is the given owner if such a working copy exists, otherwise the javaScript unit * is a primary javaScript unit. * * @param handleIdentifier the given handle identifier * @param owner the owner of the returned javaScript unit, ignored if the returned * element is not a javaScript unit * @return the JavaScript element corresponding to the handle identifier */ public static IJavaScriptElement create(String handleIdentifier, WorkingCopyOwner owner) { if (handleIdentifier == null) { return null; } MementoTokenizer memento = new MementoTokenizer(handleIdentifier); JavaModel model = JavaModelManager.getJavaModelManager().getJavaModel(); return model.getHandleFromMemento(memento, owner); } /** * Returns the JavaScript element corresponding to the given file, or * <code>null</code> if unable to associate the given file * with a JavaScript element. * * <p>The file must be one of:<ul> * <li>a file with one of the {@link JavaScriptCore#getJavaScriptLikeExtensions() * JavaScript-like extensions} - the element returned is the corresponding <code>IJavaScriptUnit</code></li> * <li>a <code>.class</code> file - the element returned is the corresponding <code>IClassFile</code></li> * <li>a <code>.jar</code> file - the element returned is the corresponding <code>IPackageFragmentRoot</code></li> * </ul> * <p> * Creating a JavaScript element has the side effect of creating and opening all of the * element's parents if they are not yet open. * * @param file the given file * @return the JavaScript element corresponding to the given file, or * <code>null</code> if unable to associate the given file * with a JavaScript element */ public static IJavaScriptElement create(IFile file) { return JavaModelManager.create(file, null/*unknown javaScript project*/); } /** * Returns the source folder (package fragment or package fragment root) corresponding to the given folder, or * <code>null</code> if unable to associate the given folder with a JavaScript element. * <p> * Note that a package fragment root is returned rather than a default package. * <p> * Creating a JavaScript element has the side effect of creating and opening all of the * element's parents if they are not yet open. * * @param folder the given folder * @return the package fragment or package fragment root corresponding to the given folder, or * <code>null</code> if unable to associate the given folder with a JavaScript element */ public static IJavaScriptElement create(IFolder folder) { return JavaModelManager.create(folder, null/*unknown javaScript project*/); } /** * Returns the JavaScript project corresponding to the given project. * <p> * Creating a JavaScript Project has the side effect of creating and opening all of the * project's parents if they are not yet open. * <p> * Note that no check is done at this time on the existence or the javaScript nature of this project. * * @param project the given project * @return the JavaScript project corresponding to the given project, null if the given project is null */ public static IJavaScriptProject create(IProject project) { if (project == null) { return null; } JavaModel javaModel = JavaModelManager.getJavaModelManager().getJavaModel(); return javaModel.getJavaProject(project); } /** * Returns the JavaScript element corresponding to the given resource, or * <code>null</code> if unable to associate the given resource * with a JavaScript element. * <p> * The resource must be one of:<ul> * <li>a project - the element returned is the corresponding <code>IJavaScriptProject</code></li> * <li>a file with one of the {@link JavaScriptCore#getJavaScriptLikeExtensions() * JavaScript-like extensions} - the element returned is the corresponding <code>IJavaScriptUnit</code></li> * <li>a folder - the element returned is the corresponding <code>IPackageFragmentRoot</code> * or <code>IPackageFragment</code></li> * <li>the workspace root resource - the element returned is the <code>IJavaScriptModel</code></li> * </ul> * <p> * Creating a JavaScript element has the side effect of creating and opening all of the * element's parents if they are not yet open. * * @param resource the given resource * @return the JavaScript element corresponding to the given resource, or * <code>null</code> if unable to associate the given resource * with a JavaScript element */ public static IJavaScriptElement create(IResource resource) { return JavaModelManager.create(resource, null/*unknown javaScript project*/); } /** * Returns the JavaScript element corresponding to the given file, its project being the given * project. Returns <code>null</code> if unable to associate the given resource * with a JavaScript element. *<p> * The resource must be one of:<ul> * <li>a project - the element returned is the corresponding <code>IJavaScriptProject</code></li> * <li>a file with one of the {@link JavaScriptCore#getJavaScriptLikeExtensions() * JavaScript-like extensions} - the element returned is the corresponding <code>IJavaScriptUnit</code></li> * <li>a folder - the element returned is the corresponding <code>IPackageFragmentRoot</code> * or <code>IPackageFragment</code></li> * <li>the workspace root resource - the element returned is the <code>IJavaScriptModel</code></li> * </ul> * <p> * Creating a JavaScript element has the side effect of creating and opening all of the * element's parents if they are not yet open. * * @param resource the given resource * @return the JavaScript element corresponding to the given file, or * <code>null</code> if unable to associate the given file * with a JavaScript element */ public static IJavaScriptElement create(IResource resource, IJavaScriptProject project) { return JavaModelManager.create(resource, project); } /** * Returns the JavaScript model. * * @param root the given root * @return the JavaScript model, or <code>null</code> if the root is null */ public static IJavaScriptModel create(IWorkspaceRoot root) { if (root == null) { return null; } return JavaModelManager.getJavaModelManager().getJavaModel(); } /* * Creates and returns a class file element for * the given <code>.class</code> file. Returns <code>null</code> if unable * to recognize the class file. * * @param file the given <code>.class</code> file * @return a class file element for the given <code>.class</code> file, or <code>null</code> if unable * to recognize the class file */ public static IClassFile createClassFileFrom(IFile file) { return JavaModelManager.createClassFileFrom(file, null); } /** * Creates and returns a javaScript unit element for * the given source file (i.e. a file with one of the {@link JavaScriptCore#getJavaScriptLikeExtensions() * JavaScript-like extensions}). Returns <code>null</code> if unable * to recognize the javaScript unit. * * @param file the given source file * @return a javaScript unit element for the given source file, or <code>null</code> if unable * to recognize the javaScript unit */ public static IJavaScriptUnit createCompilationUnitFrom(IFile file) { return JavaModelManager.createCompilationUnitFrom(file, null/*unknown javaScript project*/); } /* * Creates and returns a handle for the given JAR file. * The JavaScript model associated with the JAR's project may be * created as a side effect. * * @param file the given JAR file * @return a handle for the given JAR file, or <code>null</code> if unable to create a JAR package fragment root. * (for example, if the JAR file represents a non-JavaScript resource) */ public static IPackageFragmentRoot createJarPackageFragmentRootFrom(IFile file) { return JavaModelManager.createJarPackageFragmentRootFrom(file, null/*unknown javaScript project*/); } /** * Answers the project specific value for a given includepath container. * In case this container path could not be resolved, then will answer <code>null</code>. * Both the container path and the project context are supposed to be non-null. * <p> * The containerPath is a formed by a first ID segment followed with extra segments, which can be * used as additional hints for resolution. If no container was ever recorded for this container path * onto this project (using <code>setJsGlobalScopeContainer</code>, then a * <code>JsGlobalScopeContainerInitializer</code> will be activated if any was registered for this container * ID onto the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer". * <p> * There is no assumption that the returned container must answer the exact same containerPath * when requested <code>IJsGlobalScopeContainer#getPath</code>. * Indeed, the containerPath is just an indication for resolving it to an actual container object. * <p> * Includepath container values are persisted locally to the workspace, but * are not preserved from a session to another. It is thus highly recommended to register a * <code>JsGlobalScopeContainerInitializer</code> for each referenced container * (through the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer"). * <p> * @param containerPath the name of the container, which needs to be resolved * @param project a specific project in which the container is being resolved * @return the corresponding includepath container or <code>null</code> if unable to find one. * * @exception JavaScriptModelException if an exception occurred while resolving the container, or if the resolved container * contains illegal entries (contains CPE_CONTAINER entries or null entries). * * @see JsGlobalScopeContainerInitializer * @see IJsGlobalScopeContainer * @see #setJsGlobalScopeContainer(IPath, IJavaScriptProject[], IJsGlobalScopeContainer[], IProgressMonitor) */ public static IJsGlobalScopeContainer getJsGlobalScopeContainer(IPath containerPath, IJavaScriptProject project) throws JavaScriptModelException { JavaModelManager manager = JavaModelManager.getJavaModelManager(); IJsGlobalScopeContainer container = manager.getJsGlobalScopeContainer(containerPath, project); if (container == JavaModelManager.CONTAINER_INITIALIZATION_IN_PROGRESS) { return manager.getPreviousSessionContainer(containerPath, project); } return container; } /** * Helper method finding the includepath container initializer registered for a given includepath container ID * or <code>null</code> if none was found while iterating over the contributions to extension point to * the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer". * <p> * A containerID is the first segment of any container path, used to identify the registered container initializer. * <p> * @param containerID - a containerID identifying a registered initializer * @return JsGlobalScopeContainerInitializer - the registered includepath container initializer or <code>null</code> if * none was found. */ public static JsGlobalScopeContainerInitializer getJsGlobalScopeContainerInitializer(String containerID) { HashMap containerInitializersCache = JavaModelManager.getJavaModelManager().containerInitializersCache; JsGlobalScopeContainerInitializer initializer = (JsGlobalScopeContainerInitializer) containerInitializersCache.get(containerID); if (initializer == null) { initializer = computeJsGlobalScopeContainerInitializer(containerID); if (initializer == null) return null; containerInitializersCache.put(containerID, initializer); } return initializer; } private static JsGlobalScopeContainerInitializer computeJsGlobalScopeContainerInitializer(String containerID) { Plugin jdtCorePlugin = JavaScriptCore.getPlugin(); if (jdtCorePlugin == null) return null; IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(JavaScriptCore.PLUGIN_ID, JavaModelManager.CPCONTAINER_INITIALIZER_EXTPOINT_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); for(int i = 0; i < extensions.length; i++){ IConfigurationElement [] configElements = extensions[i].getConfigurationElements(); for(int j = 0; j < configElements.length; j++){ IConfigurationElement configurationElement = configElements[j]; String initializerID = configurationElement.getAttribute("id"); //$NON-NLS-1$ if (initializerID != null && initializerID.equals(containerID)){ if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED) verbose_found_container_initializer(containerID, configurationElement); try { Object execExt = configurationElement.createExecutableExtension("class"); //$NON-NLS-1$ if (execExt instanceof JsGlobalScopeContainerInitializer){ return (JsGlobalScopeContainerInitializer)execExt; } } catch(CoreException e) { // executable extension could not be created: ignore this initializer if (JavaModelManager.CP_RESOLVE_VERBOSE) { verbose_failed_to_instanciate_container_initializer(containerID, configurationElement); e.printStackTrace(); } } } } } } return null; } private static void verbose_failed_to_instanciate_container_initializer(String containerID, IConfigurationElement configurationElement) { Util.verbose( "CPContainer INIT - failed to instanciate initializer\n" + //$NON-NLS-1$ " container ID: " + containerID + '\n' + //$NON-NLS-1$ " class: " + configurationElement.getAttribute("class"), //$NON-NLS-1$ //$NON-NLS-2$ System.err); } private static void verbose_found_container_initializer(String containerID, IConfigurationElement configurationElement) { Util.verbose( "CPContainer INIT - found initializer\n" + //$NON-NLS-1$ " container ID: " + containerID + '\n' + //$NON-NLS-1$ " class: " + configurationElement.getAttribute("class")); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Returns the path held in the given includepath variable. * Returns <code>null</code> if unable to bind. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * Note that includepath variables can be contributed registered initializers for, * using the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeVariableInitializer". * If an initializer is registered for a variable, its persisted value will be ignored: * its initializer will thus get the opportunity to rebind the variable differently on * each session. * * @param variableName the name of the includepath variable * @return the path, or <code>null</code> if none * @see #setClasspathVariable(String, IPath) */ /** * Returns the path held in the given includepath variable. * Returns <code>null</code> if unable to bind. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * Note that includepath variables can be contributed registered initializers for, * using the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeVariableInitializer". * If an initializer is registered for a variable, its persisted value will be ignored: * its initializer will thus get the opportunity to rebind the variable differently on * each session. * * @param variableName the name of the includepath variable * @return the path, or <code>null</code> if none * @see #setIncludepathVariable(String, IPath) */ public static IPath getIncludepathVariable(final String variableName) { JavaModelManager manager = JavaModelManager.getJavaModelManager(); IPath variablePath = manager.variableGet(variableName); if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS){ return manager.getPreviousSessionVariable(variableName); } if (variablePath != null) { if (variablePath == JavaModelManager.CP_ENTRY_IGNORE_PATH) return null; return variablePath; } // even if persisted value exists, initializer is given priority, only if no initializer is found the persisted value is reused final JsGlobalScopeVariableInitializer initializer = JavaScriptCore.getJsGlobalScopeVariableInitializer(variableName); if (initializer != null){ if (JavaModelManager.CP_RESOLVE_VERBOSE) verbose_triggering_variable_initialization(variableName, initializer); if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED) verbose_triggering_variable_initialization_invocation_trace(); manager.variablePut(variableName, JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS); // avoid initialization cycles boolean ok = false; try { // let OperationCanceledException go through // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=59363) initializer.initialize(variableName); variablePath = manager.variableGet(variableName); // initializer should have performed side-effect if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS) return null; // break cycle (initializer did not init or reentering call) if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED) verbose_variable_value_after_initialization(variableName, variablePath); manager.variablesWithInitializer.add(variableName); ok = true; } catch (RuntimeException e) { if (JavaModelManager.CP_RESOLVE_VERBOSE) e.printStackTrace(); throw e; } catch (Error e) { if (JavaModelManager.CP_RESOLVE_VERBOSE) e.printStackTrace(); throw e; } finally { if (!ok) JavaModelManager.getJavaModelManager().variablePut(variableName, null); // flush cache } } else { if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED) verbose_no_variable_initializer_found(variableName); } return variablePath; } private static void verbose_no_variable_initializer_found(String variableName) { Util.verbose( "CPVariable INIT - no initializer found\n" + //$NON-NLS-1$ " variable: " + variableName); //$NON-NLS-1$ } private static void verbose_variable_value_after_initialization(String variableName, IPath variablePath) { Util.verbose( "CPVariable INIT - after initialization\n" + //$NON-NLS-1$ " variable: " + variableName +'\n' + //$NON-NLS-1$ " variable path: " + variablePath); //$NON-NLS-1$ } private static void verbose_triggering_variable_initialization(String variableName, JsGlobalScopeVariableInitializer initializer) { Util.verbose( "CPVariable INIT - triggering initialization\n" + //$NON-NLS-1$ " variable: " + variableName + '\n' + //$NON-NLS-1$ " initializer: " + initializer); //$NON-NLS-1$ } private static void verbose_triggering_variable_initialization_invocation_trace() { Util.verbose( "CPVariable INIT - triggering initialization\n" + //$NON-NLS-1$ " invocation trace:"); //$NON-NLS-1$ new Exception("<Fake exception>").printStackTrace(System.out); //$NON-NLS-1$ } /** * Returns deprecation message of a given includepath variable. * * @param variableName * @return A string if the includepath variable is deprecated, <code>null</code> otherwise. */ public static String getIncludepathVariableDeprecationMessage(String variableName) { return (String) JavaModelManager.getJavaModelManager().deprecatedVariables.get(variableName); } /** * Helper method finding the includepath variable initializer registered for a given includepath variable name * or <code>null</code> if none was found while iterating over the contributions to extension point to * the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeVariableInitializer". * <p> * @param variable the given variable * @return JsGlobalScopeVariableInitializer - the registered includepath variable initializer or <code>null</code> if * none was found. */ public static JsGlobalScopeVariableInitializer getJsGlobalScopeVariableInitializer(String variable){ Plugin jdtCorePlugin = JavaScriptCore.getPlugin(); if (jdtCorePlugin == null) return null; IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(JavaScriptCore.PLUGIN_ID, JavaModelManager.CPVARIABLE_INITIALIZER_EXTPOINT_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); for(int i = 0; i < extensions.length; i++){ IConfigurationElement [] configElements = extensions[i].getConfigurationElements(); for(int j = 0; j < configElements.length; j++){ IConfigurationElement configElement = configElements[j]; try { String varAttribute = configElement.getAttribute("variable"); //$NON-NLS-1$ if (variable.equals(varAttribute)) { if (JavaModelManager.CP_RESOLVE_VERBOSE_ADVANCED) verbose_found_variable_initializer(variable, configElement); Object execExt = configElement.createExecutableExtension("class"); //$NON-NLS-1$ if (execExt instanceof JsGlobalScopeVariableInitializer){ JsGlobalScopeVariableInitializer initializer = (JsGlobalScopeVariableInitializer)execExt; String deprecatedAttribute = configElement.getAttribute("deprecated"); //$NON-NLS-1$ if (deprecatedAttribute != null) { JavaModelManager.getJavaModelManager().deprecatedVariables.put(variable, deprecatedAttribute); } String readOnlyAttribute = configElement.getAttribute("readOnly"); //$NON-NLS-1$ if (JavaModelManager.TRUE.equals(readOnlyAttribute)) { JavaModelManager.getJavaModelManager().readOnlyVariables.add(variable); } return initializer; } } } catch(CoreException e){ // executable extension could not be created: ignore this initializer if (JavaModelManager.CP_RESOLVE_VERBOSE) { verbose_failed_to_instanciate_variable_initializer(variable, configElement); e.printStackTrace(); } } } } } return null; } private static void verbose_failed_to_instanciate_variable_initializer(String variable, IConfigurationElement configElement) { Util.verbose( "CPContainer INIT - failed to instanciate initializer\n" + //$NON-NLS-1$ " variable: " + variable + '\n' + //$NON-NLS-1$ " class: " + configElement.getAttribute("class"), //$NON-NLS-1$ //$NON-NLS-2$ System.err); } private static void verbose_found_variable_initializer(String variable, IConfigurationElement configElement) { Util.verbose( "CPVariable INIT - found initializer\n" + //$NON-NLS-1$ " variable: " + variable + '\n' + //$NON-NLS-1$ " class: " + configElement.getAttribute("class")); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Returns the names of all known includepath variables. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * * @return the list of includepath variable names * @see #setIncludepathVariable(String, IPath) */ public static String[] getIncludepathVariableNames() { return JavaModelManager.getJavaModelManager().variableNames(); } /** * Returns a table of all known configurable options with their default values. * These options allow to configure the behaviour of the underlying components. * The client may safely use the result as a template that they can modify and * then pass to <code>setOptions</code>. * * Helper constants have been defined on JavaScriptCore for each of the option ID and * their possible constant values. * * Note: more options might be added in further releases. * <pre> * RECOGNIZED OPTIONS: * * VALIDATOR / Setting Compliance Level * Select the compliance level for the validator. In "1.3" mode, source and target settings * should not go beyond "1.3" level. * - option id: "org.eclipse.wst.jsdt.core.compiler.compliance" * - possible values: { "1.3", "1.4", "1.5", "1.6", "1.7" } * - default: "1.4" * * VALIDATOR / Setting Source Compatibility Mode * Specify whether which source level compatibility is used. From 1.4 on, 'assert' is a keyword * reserved for assertion support. Also note, than when toggling to 1.4 mode, the target VM * level should be set to "1.4" and the compliance mode should be "1.4". * Source level 1.5 is necessary to enable generics, autoboxing, covariance, annotations, enumerations * enhanced for loop, static imports and varargs. Once toggled, the target VM level should be set to "1.5" * and the compliance mode should be "1.5". * Source level 1.6 is necessary to enable the computation of stack map tables. Once toggled, the target * VM level should be set to "1.6" and the compliance mode should be "1.6". * Once the source level 1.7 is toggled, the target VM level should be set to "1.7" and the compliance mode * should be "1.7". * - option id: "org.eclipse.wst.jsdt.core.compiler.source" * - possible values: { "1.3", "1.4", "1.5", "1.6", "1.7" } * - default: "1.3" * * * VALIDATOR / JSdoc Comment Support * When this support is disabled, the validator will ignore all jsdoc problems options settings * and will not report any jsdoc problem. It will also not find any reference in jsdoc comment and * DOM AST JSdoc node will be only a flat text instead of having structured tag elements. * - option id: "org.eclipse.wst.jsdt.core.compiler.doc.comment.support" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * VALIDATOR / Reporting Deprecation * When enabled, the validator will signal use of deprecated API either as an * error or a warning. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.deprecation" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Deprecation Inside Deprecated Code * When enabled, the validator will signal use of deprecated API inside deprecated code. * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.deprecation". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.deprecationInDeprecatedCode" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Deprecation When Overriding Deprecated Method * When enabled, the validator will signal the declaration of a method overriding a deprecated one. * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.deprecation". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Unused Local * When enabled, the validator will issue an error or a warning for unused local * variables (that is, variables never read from) * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedLocal" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Unused Parameter * When enabled, the validator will issue an error or a warning for unused method * parameters (that is, parameters never read from) * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Unused Parameter if Implementing Abstract Method * When enabled, the validator will signal unused parameters in abstract method implementations. * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterWhenImplementingAbstract" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Unused Parameter if Overriding Concrete Method * When enabled, the validator will signal unused parameters in methods overriding concrete ones. * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterWhenOverridingConcrete" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Consider Reference in Doc Comment for Unused Parameter Check * When enabled, the validator will consider doc comment references to parameters (i.e. @param clauses) for the unused * parameter check. Thus, documented parameters will be considered as mandated as per doc contract. * The severity of the unused parameter problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter". * Note: this option has no effect until the doc comment support is enabled according to the * option "org.eclipse.wst.jsdt.core.compiler.doc.comment.support". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterIncludeDocReference" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * VALIDATOR / Reporting Unused Import * When enabled, the validator will issue an error or a warning for unused import * reference * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedImport" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Unused Private Members * When enabled, the validator will issue an error or a warning whenever a private * method or field is declared but never used within the same unit. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedPrivateMember" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Assignment with no Effect * When enabled, the validator will issue an error or a warning whenever an assignment * has no effect (e.g 'x = x'). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.noEffectAssignment" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Empty Statements and Unnecessary Semicolons * When enabled, the validator will issue an error or a warning if an empty statement or a * unnecessary semicolon is encountered. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.emptyStatement" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Unnecessary Type Check * When enabled, the validator will issue an error or a warning when a cast or an instanceof operation * is unnecessary. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unnecessaryTypeCheck" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Unnecessary Else * When enabled, the validator will issue an error or a warning when a statement is unnecessarily * nested within an else clause (in situation where then clause is not completing normally). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unnecessaryElse" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Non-Externalized String Literal * When enabled, the validator will issue an error or a warning for non externalized * String literal (that is, not tagged with //$NON-NLS-<n>$). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.nonExternalizedStringLiteral" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Non-Static Reference to a Static Member * When enabled, the validator will issue an error or a warning whenever a static field * or method is accessed with an expression receiver. A reference to a static member should * be qualified with a type name. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.staticAccessReceiver" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Indirect Reference to a Static Member * When enabled, the validator will issue an error or a warning whenever a static field * or method is accessed in an indirect way. A reference to a static member should * preferably be qualified with its declaring type name. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.indirectStaticAccess" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Local Variable Declaration Hiding another Variable * When enabled, the validator will issue an error or a warning whenever a local variable * declaration is hiding some field or local variable (either locally, inherited or defined in enclosing type). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.localVariableHiding" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Field Declaration Hiding another Variable * When enabled, the validator will issue an error or a warning whenever a field * declaration is hiding some field or local variable (either locally, inherited or defined in enclosing type). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.fieldHiding" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Type Declaration Hiding another Type * When enabled, the validator will issue an error or a warning in situations where a type parameter * declaration is hiding some type, when a nested type is hiding some type parameter, or when * a nested type is hiding another nested type defined in same unit. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.typeParameterHiding" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Possible Accidental Boolean Assignment * When enabled, the validator will issue an error or a warning if a boolean assignment is acting as the condition * of a control statement (where it probably was meant to be a boolean comparison). * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.possibleAccidentalBooleanAssignment" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Undocumented Empty Block * When enabled, the validator will issue an error or a warning when an empty block is detected and it is not * documented with any comment. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.undocumentedEmptyBlock" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Finally Blocks Not Completing Normally * When enabled, the validator will issue an error or a warning when a finally block does not complete normally. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.finallyBlockNotCompletingNormally" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Unused Declared Thrown Exception * When enabled, the validator will issue an error or a warning when a method or a constructor is declaring a * thrown checked exception, but never actually raises it in its body. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedDeclaredThrownException" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Unused Declared Thrown Exception in Overridind Method * When disabled, the validator will not include overriding methods in its diagnosis for unused declared * thrown exceptions. * <br> * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.unusedDeclaredThrownException". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Unqualified Access to Field * When enabled, the validator will issue an error or a warning when a field is access without any qualification. * In order to improve code readability, it should be qualified, e.g. 'x' should rather be written 'this.x'. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unqualifiedFieldAccess" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Null Dereference * When enabled, the validator will issue an error or a warning whenever a * variable that is statically known to hold a null value is used to * access a field or method. * * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.nullReference" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Potential Null Dereference * When enabled, the validator will issue an error or a warning whenever a * variable that has formerly been tested against null but is not (no more) * statically known to hold a non-null value is used to access a field or * method. * * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.potentialNullReference" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Duplicate Local Variables * When enabled, the validator will issue an error or a warning whenever a * two local variables with the same name have been declared. * * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.duplicateLocalVariables" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Redundant Null Check * When enabled, the validator will issue an error or a warning whenever a * variable that is statically known to hold a null or a non-null value * is tested against null. * * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.redundantNullCheck" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Use of Annotation Type as Super Interface * When enabled, the validator will issue an error or a warning whenever an annotation type is used * as a super-interface. Though legal, this is discouraged. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.annotationSuperInterface" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Invalid Jsdoc Comment * This is the generic control for the severity of JSdoc problems. * When enabled, the validator will issue an error or a warning for a problem in JSdoc. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadoc" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Visibility Level For Invalid JSdoc Tags * Set the minimum visibility level for JSdoc tag problems. Below this level problems will be ignored. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsVisibility" * - possible values: { "public", "protected", "default", "private" } * - default: "public" * * VALIDATOR / Reporting Invalid JSdoc Tags * When enabled, the validator will signal unbound or unexpected reference tags in JSdoc. * A 'throws' tag referencing an undeclared exception would be considered as unexpected. * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the JSDoc; * also see the setting "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsVisibility". * <br> * The severity of the problem is controlled with option "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadoc". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTags" * - possible values: { "disabled", "enabled" } * - default: "disabled" * * VALIDATOR / Reporting Invalid JSdoc Tags with Deprecated References * Specify whether the validator will report deprecated references used in JSdoc tags. * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the JSDoc; * also see the setting "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsVisibility". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Invalid JSdoc Tags with Not Visible References * Specify whether the validator will report non-visible references used in JSDoc tags. * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the JSDoc; * also see the setting "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsVisibility". * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Missing JSDoc Tags * This is the generic control for the severity of JSDoc missing tag problems. * When enabled, the validator will issue an error or a warning when tags are missing in JSDoc comments. * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the JSDoc; * also see the setting "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocTagsVisibility". * <br> * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocTags" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Visibility Level For Missing JSDoc Tags * Set the minimum visibility level for JSDoc missing tag problems. Below this level problems will be ignored. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocTagsVisibility" * - possible values: { "public", "protected", "default", "private" } * - default: "public" * * VALIDATOR / Reporting Missing JSDoc Tags on Overriding Methods * Specify whether the validator will verify overriding methods in order to report JSDoc missing tag problems. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocTagsOverriding" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Reporting Missing JSDoc Comments * This is the generic control for the severity of missing JSDoc comment problems. * When enabled, the validator will issue an error or a warning when JSDoc comments are missing. * <br>Note that this diagnosis can be enabled based on the visibility of the construct associated with the expected JSDoc; * also see the setting "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocCommentsVisibility". * <br> * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocComments" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Visibility Level For Missing JSDoc Comments * Set the minimum visibility level for missing JSDoc problems. Below this level problems will be ignored. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocCommentsVisibility" * - possible values: { "public", "protected", "default", "private" } * - default: "public" * * VALIDATOR / Reporting Missing JSDoc Comments on Overriding Methods * Specify whether the validator will verify overriding methods in order to report missing JSDoc comment problems. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.missingJavadocCommentsOverriding" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * VALIDATOR / Maximum Number of Problems Reported per JavaScript Unit * Specify the maximum number of problems reported on each javaScript unit. * - option id: "org.eclipse.wst.jsdt.core.compiler.maxProblemPerUnit" * - possible values: "<n>" where <n> is zero or a positive integer (if zero then all problems are reported). * - default: "100" * * VALIDATOR / Treating Optional Error as Fatal * When enabled, optional errors (i.e. optional problems which severity is set to "error") will be treated as standard * validator errors, yielding problem methods/types preventing from running offending code until the issue got resolved. * When disabled, optional errors are only considered as warnings, still carrying an error indication to make them more * severe. Note that by default, errors are fatal, whether they are optional or not. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.fatalOptionalError" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * VALIDATOR / Defining the Automatic Task Tags * When the tag list is not empty, the validator will issue a task marker whenever it encounters * one of the corresponding tags inside any comment in JavaScript source code. * Generated task messages will start with the tag, and range until the next line separator, * comment ending, or tag. * When a given line of code bears multiple tags, each tag will be reported separately. * Moreover, a tag immediately followed by another tag will be reported using the contents of the * next non-empty tag of the line, if any. * Note that tasks messages are trimmed. If a tag is starting with a letter or digit, then it cannot be leaded by * another letter or digit to be recognized ("fooToDo" will not be recognized as a task for tag "ToDo", but "foo#ToDo" * will be detected for either tag "ToDo" or "#ToDo"). Respectively, a tag ending with a letter or digit cannot be followed * by a letter or digit to be recognized ("ToDofoo" will not be recognized as a task for tag "ToDo", but "ToDo:foo" will * be detected either for tag "ToDo" or "ToDo:"). * - option id: "org.eclipse.wst.jsdt.core.compiler.taskTags" * - possible values: { "<tag>[,<tag>]*" } where <tag> is a String without any wild-card or leading/trailing spaces * - default: "TODO,FIXME,XXX" * * VALIDATOR / Defining the Automatic Task Priorities * In parallel with the Automatic Task Tags, this list defines the priorities (high, normal or low) * of the task markers issued by the validator. * If the default is specified, the priority of each task marker is "NORMAL". * - option id: "org.eclipse.wst.jsdt.core.compiler.taskPriorities" * - possible values: { "<priority>[,<priority>]*" } where <priority> is one of "HIGH", "NORMAL" or "LOW" * - default: "NORMAL,HIGH,NORMAL" * * VALIDATOR / Determining whether task tags are case-sensitive * When enabled, task tags are considered in a case-sensitive way. * - option id: "org.eclipse.wst.jsdt.core.compiler.taskCaseSensitive" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * VALIDATOR / Reporting Discouraged Reference to Type with Restricted Access * When enabled, the validator will issue an error or a warning when referring to a type with discouraged access, as defined according * to the access rule specifications. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.discouragedReference" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Unreferenced Label * When enabled, the validator will issue an error or a warning when encountering a labeled statement which label * is never explicitly referenced. A label is considered to be referenced if its name explicitly appears behind a break * or continue statement; for instance the following label would be considered unreferenced; LABEL: { break; } * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.unusedLabel" * - possible values: { "error", "warning", "ignore" } * - default: "warning" * * VALIDATOR / Reporting Parameter Assignment * When enabled, the validator will issue an error or a warning if a parameter is * assigned to. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.parameterAssignment" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Switch Fall-Through Case * When enabled, the validator will issue an error or a warning if a case may be * entered by falling through previous case. Empty cases are allowed. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.fallthroughCase" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * VALIDATOR / Reporting Overriding method that doesn't call the super method invocation * When enabled, the validator will issue an error or a warning if a method is overriding a method without calling * the super invocation. * - option id: "org.eclipse.wst.jsdt.core.compiler.problem.overridingMethodWithoutSuperInvocation" * - possible values: { "error", "warning", "ignore" } * - default: "ignore" * * BUILDER / Specifying Filters for Resource Copying Control * Allow to specify some filters to control the resource copy process. * - option id: "org.eclipse.wst.jsdt.core.builder.resourceCopyExclusionFilter" * - possible values: { "<name>[,<name>]* } where <name> is a file name pattern (* and ? wild-cards allowed) * or the name of a folder which ends with '/' * - default: "" * * BUILDER / Abort if Invalid Includepath * Allow to toggle the builder to abort if the includepath is invalid * - option id: "org.eclipse.wst.jsdt.core.builder.invalidClasspath" * - possible values: { "abort", "ignore" } * - default: "abort" * * BUILDER / Reporting Duplicate Resources * Indicate the severity of the problem reported when more than one occurrence * of a resource is to be copied into the output location. * - option id: "org.eclipse.wst.jsdt.core.builder.duplicateResourceTask" * - possible values: { "error", "warning" } * - default: "warning" * * JAVACORE / Computing Project Build Order * Indicate whether JavaScriptCore should enforce the project build order to be based on * the includepath prerequisite chain. When requesting to compute, this takes over * the platform default order (based on project references). * - option id: "org.eclipse.wst.jsdt.core.computeJavaBuildOrder" * - possible values: { "compute", "ignore" } * - default: "ignore" * * JAVACORE / Default Source Encoding Format * Get the default encoding format of source files. This value is * immutable and preset to the result of ResourcesPlugin.getEncoding(). * It is offered as a convenience shortcut only. * - option id: "org.eclipse.wst.jsdt.core.encoding" * - value: <immutable, platform default value> * * JAVACORE / Reporting Incomplete Includepath * Indicate the severity of the problem reported when an entry on the includepath does not exist, * is not legite or is not visible (for example, a referenced project is closed). * - option id: "org.eclipse.wst.jsdt.core.incompleteClasspath" * - possible values: { "error", "warning"} * - default: "error" * * JAVACORE / Reporting Includepath Cycle * Indicate the severity of the problem reported when a project is involved in a cycle. * - option id: "org.eclipse.wst.jsdt.core.circularClasspath" * - possible values: { "error", "warning" } * - default: "error" * JAVACORE / Enabling Usage of Includepath Exclusion Patterns * When disabled, no entry on a project includepath can be associated with * an exclusion pattern. * - option id: "org.eclipse.wst.jsdt.core.includepath.exclusionPatterns" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * JAVACORE / Enabling Usage of Includepath Multiple Output Locations * When disabled, no entry on a project includepath can be associated with * a specific output location, preventing thus usage of multiple output locations. * - option id: "org.eclipse.wst.jsdt.core.includepath.multipleOutputLocations" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * JAVACORE / Set the timeout value for retrieving the method's parameter names from jsdoc * Timeout in milliseconds to retrieve the method's parameter names from jsdoc. * If the value is 0, the parameter names are not fetched and the raw names are returned. * - option id: "org.eclipse.wst.jsdt.core.timeoutForParameterNameFromAttachedJavadoc" * - possible values: "<n>", where n is an integer greater than or equal to 0 * - default: "50" * * DEPRECATED SEE DefaultCodeFormatterOptions: FORMATTER / Inserting New Line Before Opening Brace * When Insert, a new line is inserted before an opening brace, otherwise nothing * is inserted * - option id: "org.eclipse.wst.jsdt.core.formatter.newline.openingBrace" * - possible values: { "insert", "do not insert" } * - default: "do not insert" * * DEPRECATED SEE DefaultCodeFormatterOptions: FORMATTER / Inserting New Line Inside Control Statement * When Insert, a new line is inserted between } and following else, catch, finally * - option id: "org.eclipse.wst.jsdt.core.formatter.newline.controlStatement" * - possible values: { "insert", "do not insert" } * - default: "do not insert" * * DEPRECATED SEE DefaultCodeFormatterOptions: Clearing Blank Lines * When Clear all, all blank lines are removed. When Preserve one, only one is kept * and all others removed. * - option id: "org.eclipse.wst.jsdt.core.formatter.newline.clearAll" * - possible values: { "clear all", "preserve one" } * - default: "preserve one" * * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting New Line Between Else/If * When Insert, a blank line is inserted between an else and an if when they are * contiguous. When choosing to not insert, else-if will be kept on the same * line when possible. * - option id: "org.eclipse.wst.jsdt.core.formatter.newline.elseIf" * - possible values: { "insert", "do not insert" } * - default: "do not insert" * * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting New Line In Empty Block * When insert, a line break is inserted between contiguous { and }, if } is not followed * by a keyword. * - option id: "org.eclipse.wst.jsdt.core.formatter.newline.emptyBlock" * - possible values: { "insert", "do not insert" } * - default: "insert" * * DEPRECATED SEE DefaultCodeFormatterOptions: Splitting Lines Exceeding Length * Enable splitting of long lines (exceeding the configurable length). Length of 0 will * disable line splitting * - option id: "org.eclipse.wst.jsdt.core.formatter.lineSplit" * - possible values: "<n>", where n is zero or a positive integer * - default: "80" * * DEPRECATED SEE DefaultCodeFormatterOptions: Compacting Assignment * Assignments can be formatted asymmetrically, for example 'int x= 2;', when Normal, a space * is inserted before the assignment operator * - option id: "org.eclipse.wst.jsdt.core.formatter.style.assignment" * - possible values: { "compact", "normal" } * - default: "normal" * * DEPRECATED SEE DefaultCodeFormatterOptions: Defining Indentation Character * Either choose to indent with tab characters or spaces * - option id: "org.eclipse.wst.jsdt.core.formatter.tabulation.char" * - possible values: { "tab", "space" } * - default: "tab" * * DEPRECATED SEE DefaultCodeFormatterOptions: Defining Space Indentation Length * When using spaces, set the amount of space characters to use for each * indentation mark. * - option id: "org.eclipse.wst.jsdt.core.formatter.tabulation.size" * - possible values: "<n>", where n is a positive integer * - default: "4" * * DEPRECATED SEE DefaultCodeFormatterOptions: Inserting space in cast expression * When Insert, a space is added between the type and the expression in a cast expression. * - option id: "org.eclipse.wst.jsdt.core.formatter.space.castexpression" * - possible values: { "insert", "do not insert" } * - default: "insert" * * CODEASSIST / Activate Visibility Sensitive Completion * When active, completion doesn't show that you can not see * (for example, you can not see private methods of a super class). * - option id: "org.eclipse.wst.jsdt.core.codeComplete.visibilityCheck" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * CODEASSIST / Activate Deprecation Sensitive Completion * When enabled, completion doesn't propose deprecated members and types. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.deprecationCheck" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * CODEASSIST / Automatic Qualification of Implicit Members * When active, completion automatically qualifies completion on implicit * field references and message expressions. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.forceImplicitQualification" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * CODEASSIST / Define the Prefixes for Field Name * When the prefixes is non empty, completion for field name will begin with * one of the proposed prefixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.fieldPrefixes" * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Prefixes for Static Field Name * When the prefixes is non empty, completion for static field name will begin with * one of the proposed prefixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.staticFieldPrefixes" * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Prefixes for Local Variable Name * When the prefixes is non empty, completion for local variable name will begin with * one of the proposed prefixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.localPrefixes" * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Prefixes for Argument Name * When the prefixes is non empty, completion for argument name will begin with * one of the proposed prefixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.argumentPrefixes" * - possible values: { "<prefix>[,<prefix>]*" } where <prefix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Suffixes for Field Name * When the suffixes is non empty, completion for field name will end with * one of the proposed suffixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.fieldSuffixes" * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Suffixes for Static Field Name * When the suffixes is non empty, completion for static field name will end with * one of the proposed suffixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.staticFieldSuffixes" * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Suffixes for Local Variable Name * When the suffixes is non empty, completion for local variable name will end with * one of the proposed suffixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.localSuffixes" * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card * - default: "" * * CODEASSIST / Define the Suffixes for Argument Name * When the suffixes is non empty, completion for argument name will end with * one of the proposed suffixes. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.argumentSuffixes" * - possible values: { "<suffix>[,<suffix>]*" } where <suffix> is a String without any wild-card * - default: "" * * CODEASSIST / Activate Forbidden Reference Sensitive Completion * When enabled, completion doesn't propose elements which match a * forbidden reference rule. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.forbiddenReferenceCheck" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * CODEASSIST / Activate Discouraged Reference Sensitive Completion * When enabled, completion doesn't propose elements which match a * discouraged reference rule. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.discouragedReferenceCheck" * - possible values: { "enabled", "disabled" } * - default: "disabled" * * CODEASSIST / Activate Camel Case Sensitive Completion * When enabled, completion shows proposals whose name match the CamelCase * pattern. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.camelCaseMatch" * - possible values: { "enabled", "disabled" } * - default: "enabled" * * CODEASSIST / Activate Suggestion of Static Import * When enabled, completion proposals can contain static import * pattern. * - option id: "org.eclipse.wst.jsdt.core.codeComplete.suggestStaticImports" * - possible values: { "enabled", "disabled" } * - default: "enabled" * </pre> */ public static Hashtable getDefaultOptions(){ return JavaModelManager.getJavaModelManager().getDefaultOptions(); } /** * Returns the workspace root default charset encoding. * * @return the name of the default charset encoding for workspace root. * @see IContainer#getDefaultCharset() * @see ResourcesPlugin#getEncoding() */ public static String getEncoding() { // Verify that workspace is not shutting down (see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=60687) IWorkspace workspace = ResourcesPlugin.getWorkspace(); if (workspace != null) { try { return workspace.getRoot().getDefaultCharset(); } catch (CoreException e) { // fails silently and return plugin global encoding if core exception occurs } } return ResourcesPlugin.getEncoding(); } /** * Returns an array that contains the resources generated by the JavaScript builder when building the * javaScript units contained in the given region. * <p>The contents of the array is accurate only if the elements of the given region have been built.</p> * <p>The given region can contain instances of:</p> * <ul> * <li><code>org.eclipse.wst.jsdt.core.IJavaScriptUnit</code></li> * <li><code>org.eclipse.wst.jsdt.core.IPackageFragment</code></li> * <li><code>org.eclipse.wst.jsdt.core.IPackageFragmentRoot</code></li> * <li><code>org.eclipse.wst.jsdt.core.IJavaScriptProject</code></li> * </ul> * <p>All other types of <code>org.eclipse.wst.jsdt.core.IJavaScriptElement</code> are ignored.</p> * * @param region the given region * @param includesNonJavaResources a flag that indicates if non-javaScript resources should be included * * @return an array that contains the resources generated by the JavaScript builder when building the * javaScript units contained in the given region, an empty array if none * @exception IllegalArgumentException if the given region is <code>null</code> */ public static IResource[] getGeneratedResources(IRegion region, boolean includesNonJavaResources) { if (region == null) throw new IllegalArgumentException("region cannot be null"); //$NON-NLS-1$ IJavaScriptElement[] elements = region.getElements(); HashMap projectsStates = new HashMap(); ArrayList collector = new ArrayList(); for (int i = 0, max = elements.length; i < max; i++) { // collect all the javaScript project IJavaScriptElement element = elements[i]; IJavaScriptProject javaProject = element.getJavaScriptProject(); IProject project = javaProject.getProject(); State state = null; State currentState = (State) projectsStates.get(project); if (currentState != null) { state = currentState; } else { state = (State) JavaModelManager.getJavaModelManager().getLastBuiltState(project, null); if (state != null) { projectsStates.put(project, state); } } if (state == null) continue; if (element.getElementType() == IJavaScriptElement.JAVASCRIPT_PROJECT) { IPackageFragmentRoot[] roots = null; try { roots = javaProject.getPackageFragmentRoots(); } catch (JavaScriptModelException e) { // ignore } if (roots == null) continue; IRegion region2 = JavaScriptCore.newRegion(); for (int j = 0; j < roots.length; j++) { region2.add(roots[j]); } IResource[] res = getGeneratedResources(region2, includesNonJavaResources); for (int j = 0, max2 = res.length; j < max2; j++) { collector.add(res[j]); } continue; } IJavaScriptElement root = element; while (root != null && root.getElementType() != IJavaScriptElement.PACKAGE_FRAGMENT_ROOT) { root = root.getParent(); } if (root == null) continue; } int size = collector.size(); if (size != 0) { IResource[] result = new IResource[size]; collector.toArray(result); return result; } return NO_GENERATED_RESOURCES; } /** * Returns the single instance of the JavaScript core plug-in runtime class. * Equivalent to <code>(JavaScriptCore) getPlugin()</code>. * * @return the single instance of the JavaScript core plug-in runtime class */ public static JavaScriptCore getJavaScriptCore() { return (JavaScriptCore) getPlugin(); } /** * Returns the list of known JavaScript-like extensions. * JavaScript like extension are defined in the {@link org.eclipse.core.runtime.Platform#getContentTypeManager() * content type manager} for the {@link #JAVA_SOURCE_CONTENT_TYPE}. * Note that a JavaScript-like extension doesn't include the leading dot ('.'). * Also note that the "js" extension is always defined as a JavaScript-like extension. * * @return the list of known JavaScript-like extensions. */ public static String[] getJavaScriptLikeExtensions() { return CharOperation.toStrings(Util.getJavaLikeExtensions()); } /** * Helper method for returning one option value only. Equivalent to <code>(String)JavaScriptCore.getOptions().get(optionName)</code> * Note that it may answer <code>null</code> if this option does not exist. * <p> * For a complete description of the configurable options, see <code>getDefaultOptions</code>. * </p> * * @param optionName the name of an option * @return the String value of a given option * @see JavaScriptCore#getDefaultOptions() * @see org.eclipse.wst.jsdt.internal.core.JavaCorePreferenceInitializer for changing default settings */ public static String getOption(String optionName) { return JavaModelManager.getJavaModelManager().getOption(optionName); } /** * Returns the table of the current options. Initially, all options have their default values, * and this method returns a table that includes all known options. * <p>For a complete description of the configurable options, see <code>getDefaultOptions</code>.</p> * <p>Returns a default set of options even if the platform is not running.</p> * * @return table of current settings of all options * (key type: <code>String</code>; value type: <code>String</code>) * @see #getDefaultOptions() * @see org.eclipse.wst.jsdt.internal.core.JavaCorePreferenceInitializer for changing default settings */ public static Hashtable getOptions() { return JavaModelManager.getJavaModelManager().getOptions(); } /** * Returns the single instance of the JavaScript core plug-in runtime class. * * @return the single instance of the JavaScript core plug-in runtime class */ public static Plugin getPlugin() { return JAVA_CORE_PLUGIN; } /** * This is a helper method, which returns the resolved includepath entry denoted * by a given entry (if it is a variable entry). It is obtained by resolving the variable * reference in the first segment. Returns <code>null</code> if unable to resolve using * the following algorithm: * <ul> * <li> if variable segment cannot be resolved, returns <code>null</code></li> * <li> finds a project, JAR or binary folder in the workspace at the resolved path location</li> * <li> if none finds an external JAR file or folder outside the workspace at the resolved path location </li> * <li> if none returns <code>null</code></li> * </ul> * <p> * Variable source attachment path and root path are also resolved and recorded in the resulting includepath entry. * <p> * NOTE: This helper method does not handle includepath containers, for which should rather be used * <code>JavaScriptCore#getJsGlobalScopeContainer(IPath, IJavaScriptProject)</code>. * <p> * * @param entry the given variable entry * @return the resolved library or project includepath entry, or <code>null</code> * if the given variable entry could not be resolved to a valid includepath entry */ public static IIncludePathEntry getResolvedIncludepathEntry(IIncludePathEntry entry) { if (entry.getEntryKind() != IIncludePathEntry.CPE_VARIABLE) return entry; IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IPath resolvedPath = JavaScriptCore.getResolvedVariablePath(entry.getPath()); if (resolvedPath == null) return null; Object target = JavaModel.getTarget(workspaceRoot, resolvedPath, false); if (target == null) return null; // inside the workspace if (target instanceof IResource) { IResource resolvedResource = (IResource) target; switch (resolvedResource.getType()) { case IResource.PROJECT : // internal project return JavaScriptCore.newProjectEntry( resolvedPath, entry.getAccessRules(), entry.combineAccessRules(), entry.getExtraAttributes(), entry.isExported()); case IResource.FILE : if (org.eclipse.wst.jsdt.internal.compiler.util.Util.isArchiveFileName(resolvedResource.getName())) { // internal binary archive return JavaScriptCore.newLibraryEntry( resolvedPath, getResolvedVariablePath(entry.getSourceAttachmentPath()), getResolvedVariablePath(entry.getSourceAttachmentRootPath()), entry.getAccessRules(), entry.getExtraAttributes(), entry.isExported()); } break; case IResource.FOLDER : // internal binary folder return JavaScriptCore.newLibraryEntry( resolvedPath, getResolvedVariablePath(entry.getSourceAttachmentPath()), getResolvedVariablePath(entry.getSourceAttachmentRootPath()), entry.getAccessRules(), entry.getExtraAttributes(), entry.isExported()); } } // outside the workspace if (target instanceof File) { File externalFile = JavaModel.getFile(target); if (externalFile != null) { String fileName = externalFile.getName().toLowerCase(); if (fileName.endsWith(SuffixConstants.SUFFIX_STRING_java) || fileName.endsWith(SuffixConstants.SUFFIX_STRING_zip) ) { // external binary archive return JavaScriptCore.newLibraryEntry( resolvedPath, getResolvedVariablePath(entry.getSourceAttachmentPath()), getResolvedVariablePath(entry.getSourceAttachmentRootPath()), entry.getAccessRules(), entry.getExtraAttributes(), entry.isExported()); } } else { // external binary folder if (resolvedPath.isAbsolute()){ return JavaScriptCore.newLibraryEntry( resolvedPath, getResolvedVariablePath(entry.getSourceAttachmentPath()), getResolvedVariablePath(entry.getSourceAttachmentRootPath()), entry.getAccessRules(), entry.getExtraAttributes(), entry.isExported()); } } } return null; } /** * Resolve a variable path (helper method). * * @param variablePath the given variable path * @return the resolved variable path or <code>null</code> if none */ public static IPath getResolvedVariablePath(IPath variablePath) { if (variablePath == null) return null; int count = variablePath.segmentCount(); if (count == 0) return null; // lookup variable String variableName = variablePath.segment(0); IPath resolvedPath = JavaScriptCore.getIncludepathVariable(variableName); if (resolvedPath == null) return null; // append path suffix if (count > 1) { resolvedPath = resolvedPath.append(variablePath.removeFirstSegments(1)); } return resolvedPath; } /** * Returns the names of all defined user libraries. The corresponding includepath container path * is the name appended to the USER_LIBRARY_CONTAINER_ID. * @return Return an array containing the names of all known user defined. */ public static String[] getUserLibraryNames() { return UserLibraryManager.getUserLibraryNames(); } /** * Returns the working copies that have the given owner. * Only javaScript units in working copy mode are returned. * If the owner is <code>null</code>, primary working copies are returned. * * @param owner the given working copy owner or <code>null</code> for primary working copy owner * @return the list of working copies for a given owner */ public static IJavaScriptUnit[] getWorkingCopies(WorkingCopyOwner owner){ JavaModelManager manager = JavaModelManager.getJavaModelManager(); if (owner == null) owner = DefaultWorkingCopyOwner.PRIMARY; IJavaScriptUnit[] result = manager.getWorkingCopies(owner, false/*don't add primary WCs*/); if (result == null) return JavaModelManager.NO_WORKING_COPY; return result; } /** * Initializes JavaScriptCore internal structures to allow subsequent operations (such * as the ones that need a resolved classpath) to run full speed. A client may * choose to call this method in a background thread early after the workspace * has started so that the initialization is transparent to the user. * <p> * However calling this method is optional. Services will lazily perform * initialization when invoked. This is only a way to reduce initialization * overhead on user actions, if it can be performed before at some * appropriate moment. * </p><p> * This initialization runs accross all JavaScript projects in the workspace. Thus the * workspace root scheduling rule is used during this operation. * </p><p> * This method may return before the initialization is complete. The * initialization will then continue in a background thread. * </p><p> * This method can be called concurrently. * </p> * * @param monitor a progress monitor, or <code>null</code> if progress * reporting and cancellation are not desired * @exception CoreException if the initialization fails, * the status of the exception indicates the reason of the failure */ public static void initializeAfterLoad(IProgressMonitor monitor) throws CoreException { try { if (monitor != null) monitor.beginTask(Messages.javamodel_initialization, 100); // initialize all containers and variables JavaModelManager manager = JavaModelManager.getJavaModelManager(); try { if (monitor != null) { monitor.subTask(Messages.javamodel_configuring_classpath_containers); manager.batchContainerInitializationsProgress.set(new SubProgressMonitor(monitor, 50)); // 50% of the time is spent in initializing containers and variables } // all classpaths in the workspace are going to be resolved, ensure that containers are initialized in one batch manager.batchContainerInitializations = true; // avoid leaking source attachment properties (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=183413) IJavaScriptProject[] projects = manager.getJavaModel().getJavaScriptProjects(); for (int i = 0, length = projects.length; i < length; i++) { IIncludePathEntry[] classpath; try { classpath = ((JavaProject) projects[i]).getResolvedClasspath(); } catch (JavaScriptModelException e) { // project no longer exist: ignore continue; } if (classpath != null) { for (int j = 0, length2 = classpath.length; j < length2; j++) { IIncludePathEntry entry = classpath[j]; if (entry.getSourceAttachmentPath() != null) Util.setSourceAttachmentProperty(entry.getPath(), null); // else source might have been attached by IPackageFragmentRoot#attachSource(...), we keep it } } } // initialize delta state manager.deltaState.rootsAreStale = true; // in case it was already initialized before we cleaned up the source attachment proprties manager.deltaState.initializeRoots(); } finally { manager.batchContainerInitializationsProgress.set(null); } // dummy query for waiting until the indexes are ready SearchEngine engine = new SearchEngine(); IJavaScriptSearchScope scope = SearchEngine.createWorkspaceScope(); try { if (monitor != null) monitor.subTask(Messages.javamodel_configuring_searchengine); engine.searchAllTypeNames( null, SearchPattern.R_EXACT_MATCH, "!@$#!@".toCharArray(), //$NON-NLS-1$ SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE, IJavaScriptSearchConstants.CLASS, scope, new TypeNameRequestor() { public void acceptType( int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) { // no type to accept } }, // will not activate index query caches if indexes are not ready, since it would take to long // to wait until indexes are fully rebuild IJavaScriptSearchConstants.CANCEL_IF_NOT_READY_TO_SEARCH, monitor == null ? null : new SubProgressMonitor(monitor, 49) // 49% of the time is spent in the dummy search ); } catch (JavaScriptModelException e) { // /search failed: ignore } catch (OperationCanceledException e) { if (monitor != null && monitor.isCanceled()) throw e; // else indexes were not ready: catch the exception so that jars are still refreshed } // check if the build state version number has changed since last session // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=98969) if (monitor != null) monitor.subTask(Messages.javamodel_getting_build_state_number); QualifiedName qName = new QualifiedName(JavaScriptCore.PLUGIN_ID, "stateVersionNumber"); //$NON-NLS-1$ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); String versionNumber = null; try { versionNumber = root.getPersistentProperty(qName); } catch (CoreException e) { // could not read version number: consider it is new } final JavaModel model = manager.getJavaModel(); String newVersionNumber = Byte.toString(State.VERSION); if (!newVersionNumber.equals(versionNumber)) { // build state version number has changed: touch every projects to force a rebuild if (JavaBuilder.DEBUG) System.out.println("Build state version number has changed"); //$NON-NLS-1$ IWorkspaceRunnable runnable = new IWorkspaceRunnable() { public void run(IProgressMonitor progressMonitor2) throws CoreException { IJavaScriptProject[] projects = null; try { projects = model.getJavaScriptProjects(); } catch (JavaScriptModelException e) { // could not get JavaScript projects: ignore } if (projects != null) { for (int i = 0, length = projects.length; i < length; i++) { IJavaScriptProject project = projects[i]; try { if (JavaBuilder.DEBUG) System.out.println("Touching " + project.getElementName()); //$NON-NLS-1$ project.getProject().touch(progressMonitor2); } catch (CoreException e) { // could not touch this project: ignore } } } } }; if (monitor != null) monitor.subTask(Messages.javamodel_building_after_upgrade); try { ResourcesPlugin.getWorkspace().run(runnable, monitor); } catch (CoreException e) { // could not touch all projects } try { root.setPersistentProperty(qName, newVersionNumber); } catch (CoreException e) { Util.log(e, "Could not persist build state version number"); //$NON-NLS-1$ } } // ensure external jars are refreshed (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=93668) try { if (monitor != null) monitor.subTask(Messages.javamodel_refreshing_external_jars); model.refreshExternalArchives( null/*refresh all projects*/, monitor == null ? null : new SubProgressMonitor(monitor, 1) // 1% of the time is spent in jar refresh ); } catch (JavaScriptModelException e) { // refreshing failed: ignore } } finally { if (monitor != null) monitor.done(); } } /** * Returns whether a given includepath variable is read-only or not. * * @param variableName * @return <code>true</code> if the includepath variable is read-only, * <code>false</code> otherwise. */ public static boolean isIncludepathVariableReadOnly(String variableName) { return JavaModelManager.getJavaModelManager().readOnlyVariables.contains(variableName); } /** * Returns whether the given file name's extension is a JavaScript-like extension. * * @return whether the given file name's extension is a JavaScript-like extension * @see #getJavaScriptLikeExtensions() */ public static boolean isJavaScriptLikeFileName(String fileName) { if(fileName==null) return false; return Util.isJavaLikeFileName(fileName); } /** * Returns whether the given marker references the given JavaScript element. * Used for markers, which denote a JavaScript element rather than a resource. * * @param element the element * @param marker the marker * @return <code>true</code> if the marker references the element, false otherwise * @exception CoreException if the <code>IMarker.getAttribute</code> on the marker fails */ public static boolean isReferencedBy(IJavaScriptElement element, IMarker marker) throws CoreException { // only match units or classfiles if (element instanceof IMember){ IMember member = (IMember) element; if (member.isBinary()){ element = member.getClassFile(); } else { element = member.getJavaScriptUnit(); } } if (element == null) return false; if (marker == null) return false; String markerHandleId = (String)marker.getAttribute(ATT_HANDLE_ID); if (markerHandleId == null) return false; IJavaScriptElement markerElement = JavaScriptCore.create(markerHandleId); while (true){ if (element.equals(markerElement)) return true; // external elements may still be equal with different handleIDs. // cycle through enclosing types in case marker is associated with a classfile (15568) if (markerElement instanceof IClassFile){ IType enclosingType = ((IClassFile)markerElement).getType().getDeclaringType(); if (enclosingType != null){ markerElement = enclosingType.getClassFile(); // retry with immediate enclosing classfile continue; } } break; } return false; } /** * Returns whether the given marker delta references the given JavaScript element. * Used for markers deltas, which denote a JavaScript element rather than a resource. * * @param element the element * @param markerDelta the marker delta * @return <code>true</code> if the marker delta references the element * @exception CoreException if the <code>IMarkerDelta.getAttribute</code> on the marker delta fails */ public static boolean isReferencedBy(IJavaScriptElement element, IMarkerDelta markerDelta) throws CoreException { // only match units or classfiles if (element instanceof IMember){ IMember member = (IMember) element; if (member.isBinary()){ element = member.getClassFile(); } else { element = member.getJavaScriptUnit(); } } if (element == null) return false; if (markerDelta == null) return false; String markerDeltarHandleId = (String)markerDelta.getAttribute(ATT_HANDLE_ID); if (markerDeltarHandleId == null) return false; IJavaScriptElement markerElement = JavaScriptCore.create(markerDeltarHandleId); while (true){ if (element.equals(markerElement)) return true; // external elements may still be equal with different handleIDs. // cycle through enclosing types in case marker is associated with a classfile (15568) if (markerElement instanceof IClassFile){ IType enclosingType = ((IClassFile)markerElement).getType().getDeclaringType(); if (enclosingType != null){ markerElement = enclosingType.getClassFile(); // retry with immediate enclosing classfile continue; } } break; } return false; } /** * Creates and returns a new access rule with the given file pattern and kind. * <p> * The rule kind is one of {@link IAccessRule#K_ACCESSIBLE}, {@link IAccessRule#K_DISCOURAGED}, * or {@link IAccessRule#K_NON_ACCESSIBLE}, optionally combined with {@link IAccessRule#IGNORE_IF_BETTER}, * e..g. <code>IAccessRule.K_NON_ACCESSIBLE | IAccessRule.IGNORE_IF_BETTER</code>. * </p> * * @param filePattern the file pattern this access rule should match * @param kind one of {@link IAccessRule#K_ACCESSIBLE}, {@link IAccessRule#K_DISCOURAGED}, * or {@link IAccessRule#K_NON_ACCESSIBLE}, optionally combined with * {@link IAccessRule#IGNORE_IF_BETTER} * @return a new access rule */ public static IAccessRule newAccessRule(IPath filePattern, int kind) { return new ClasspathAccessRule(filePattern, kind); } /** * Creates and returns a new includepath attribute with the given name and the given value. * * @return a new includepath attribute */ public static IIncludePathAttribute newIncludepathAttribute(String name, String value) { return new ClasspathAttribute(name, value); } /** * Creates and returns a new includepath entry of kind <code>CPE_CONTAINER</code> * for the given path. This method is fully equivalent to calling * {@link #newContainerEntry(IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newContainerEntry(containerPath, new IAccessRule[0], new IIncludePathAttribute[0], false)}. * <p> * @param containerPath the path identifying the container * @return a new container includepath entry * * @see JavaScriptCore#getJsGlobalScopeContainer(IPath, IJavaScriptProject) */ public static IIncludePathEntry newContainerEntry(IPath containerPath) { return newContainerEntry( containerPath, ClasspathEntry.NO_ACCESS_RULES, ClasspathEntry.NO_EXTRA_ATTRIBUTES, false/*not exported*/); } /** * Creates and returns a new includepath entry of kind <code>CPE_CONTAINER</code> * for the given path. This method is fully equivalent to calling * {@link #newContainerEntry(IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newContainerEntry(containerPath, new IAccessRule[0], new IIncludePathAttribute[0], isExported)}. * * @param containerPath the path identifying the container, it must be formed of at least * one segment (ID+hints) * @param isExported a boolean indicating whether this entry is contributed to dependent * projects in addition to the output location * @return a new container includepath entry * * @see JavaScriptCore#getJsGlobalScopeContainer(IPath, IJavaScriptProject) * @see JavaScriptCore#setJsGlobalScopeContainer(IPath, IJavaScriptProject[], IJsGlobalScopeContainer[], IProgressMonitor) */ public static IIncludePathEntry newContainerEntry(IPath containerPath, boolean isExported) { return newContainerEntry( containerPath, ClasspathEntry.NO_ACCESS_RULES, ClasspathEntry.NO_EXTRA_ATTRIBUTES, isExported); } /** * Creates and returns a new includepath entry of kind <code>CPE_CONTAINER</code> * for the given path. The path of the container will be used during resolution so as to map this * container entry to a set of other includepath entries the container is acting for. * <p> * A container entry allows to express indirect references to a set of libraries, projects and variable entries, * which can be interpreted differently for each JavaScript project where it is used. * A includepath container entry can be resolved using <code>JavaScriptCore.getResolvedJsGlobalScopeContainer</code>, * and updated with <code>JavaScriptCore.JsGlobalScopeContainerChanged</code> * <p> * A container is exclusively resolved by a <code>JsGlobalScopeContainerInitializer</code> registered onto the * extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer". * <p> * A container path must be formed of at least one segment, where: <ul> * <li> the first segment is a unique ID identifying the target container, there must be a container initializer registered * onto this ID through the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer". </li> * <li> the remaining segments will be passed onto the initializer, and can be used as additional * hints during the initialization phase. </li> * </ul> * <p> * Example of an JsGlobalScopeContainerInitializer for a includepath container denoting a default JDK container: * <pre> * containerEntry = JavaScriptCore.newContainerEntry(new Path("MyProvidedJDK/default")); * * <extension * point="org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer"> * <containerInitializer * id="MyProvidedJDK" * class="com.example.MyInitializer"/> * </pre> * <p> * The access rules determine the set of accessible source and class files * in the container. If the list of access rules is empty, then all files * in this container are accessible. * See {@link IAccessRule} for a detailed description of access * rules. Note that if an entry defined by the container defines access rules, * then these access rules are combined with the given access rules. * The given access rules are considered first, then the entry's access rules are * considered. * </p> * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * <p> * The <code>isExported</code> flag indicates whether this entry is contributed to dependent * projects. If not exported, dependent projects will not see any of the classes from this entry. * If exported, dependent projects will concatenate the accessible files patterns of this entry with the * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry * with the non accessible files patterns of the project. * </p> * <p> * Note that this operation does not attempt to validate includepath containers * or access the resources at the given paths. * </p> * * @param containerPath the path identifying the container, it must be formed of at least * one segment (ID+hints) * @param accessRules the possibly empty list of access rules for this entry * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @param isExported a boolean indicating whether this entry is contributed to dependent * projects in addition to the output location * @return a new container includepath entry * * @see JavaScriptCore#getJsGlobalScopeContainer(IPath, IJavaScriptProject) * @see JavaScriptCore#setJsGlobalScopeContainer(IPath, IJavaScriptProject[], IJsGlobalScopeContainer[], IProgressMonitor) * @see JavaScriptCore#newContainerEntry(IPath, boolean) * @see JavaScriptCore#newAccessRule(IPath, int) */ public static IIncludePathEntry newContainerEntry( IPath containerPath, IAccessRule[] accessRules, IIncludePathAttribute[] extraAttributes, boolean isExported) { if (containerPath == null) { Assert.isTrue(false, "Container path cannot be null"); //$NON-NLS-1$ } else if (containerPath.segmentCount() < 1) { Assert.isTrue( false, "Illegal classpath container path: \'" + containerPath.makeRelative().toString() + "\', must have at least one segment (containerID+hints)"); //$NON-NLS-1$//$NON-NLS-2$ } return new ClasspathEntry( IPackageFragmentRoot.K_SOURCE, IIncludePathEntry.CPE_CONTAINER, containerPath, ClasspathEntry.INCLUDE_ALL, // inclusion patterns ClasspathEntry.EXCLUDE_NONE, // exclusion patterns null, // source attachment null, // source attachment root null, // specific output folder isExported, accessRules, true, // combine access rules extraAttributes); } /** * Creates and returns a type hierarchy for all types in the given * region, considering subtypes within that region and considering types in the * working copies with the given owner. * In other words, the owner's working copies will take * precedence over their original javaScript units in the workspace. * <p> * Note that if a working copy is empty, it will be as if the original compilation * unit had been deleted. * <p> * * @param monitor the given progress monitor * @param region the given region * @param owner the owner of working copies that take precedence over their original javaScript units, * or <code>null</code> if the primary working copy owner should be used * @exception JavaScriptModelException if an element in the region does not exist or if an * exception occurs while accessing its corresponding resource * @exception IllegalArgumentException if region is <code>null</code> * @return a type hierarchy for all types in the given * region, considering subtypes within that region */ public static ITypeHierarchy newTypeHierarchy(IRegion region, WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaScriptModelException { if (region == null) { throw new IllegalArgumentException(Messages.hierarchy_nullRegion); } IJavaScriptUnit[] workingCopies = JavaModelManager.getJavaModelManager().getWorkingCopies(owner, true/*add primary working copies*/); CreateTypeHierarchyOperation op = new CreateTypeHierarchyOperation(region, workingCopies, null, true/*compute subtypes*/); op.runOperation(monitor); return op.getResult(); } /** * Creates and returns a new non-exported includepath entry of kind <code>CPE_LIBRARY</code> for the * JAR or folder identified by the given absolute path. This specifies that all package fragments * within the root will have children of type <code>IClassFile</code>. * This method is fully equivalent to calling * {@link #newLibraryEntry(IPath, IPath, IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IIncludePathAttribute[0], false)}. * * @param path the absolute path of the binary archive * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder, * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment. * and will be automatically converted to <code>null</code>. * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder * or <code>null</code> if this location should be automatically detected. * @return a new library includepath entry */ public static IIncludePathEntry newLibraryEntry( IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath) { return newLibraryEntry( path, sourceAttachmentPath, sourceAttachmentRootPath, ClasspathEntry.NO_ACCESS_RULES, ClasspathEntry.NO_EXTRA_ATTRIBUTES, false/*not exported*/); } /** * Creates and returns a new includepath entry of kind <code>CPE_LIBRARY</code> for the JAR or folder * identified by the given absolute path. This specifies that all package fragments within the root * will have children of type <code>IClassFile</code>. * This method is fully equivalent to calling * {@link #newLibraryEntry(IPath, IPath, IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newLibraryEntry(path, sourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IIncludePathAttribute[0], isExported)}. * * @param path the absolute path of the binary archive * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder, * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment. * and will be automatically converted to <code>null</code>. * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder * or <code>null</code> if this location should be automatically detected. * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new library includepath entry */ public static IIncludePathEntry newLibraryEntry( IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, boolean isExported) { return newLibraryEntry( path, sourceAttachmentPath, sourceAttachmentRootPath, ClasspathEntry.NO_ACCESS_RULES, ClasspathEntry.NO_EXTRA_ATTRIBUTES, isExported); } /** * Creates and returns a new includepath entry of kind <code>CPE_LIBRARY</code> for the JAR or folder * identified by the given absolute path. This specifies that all package fragments within the root * will have children of type <code>IClassFile</code>. * <p> * A library entry is used to denote a prerequisite JAR or root folder containing binaries. * The target JAR can either be defined internally to the workspace (absolute path relative * to the workspace root) or externally to the workspace (absolute path in the file system). * The target root folder can only be defined internally to the workspace (absolute path relative * to the workspace root). To use a binary folder external to the workspace, it must first be * linked (see IFolder#createLink(...)). * <p> * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * <p> * The <code>isExported</code> flag indicates whether this entry is contributed to dependent * projects. If not exported, dependent projects will not see any of the classes from this entry. * If exported, dependent projects will concatenate the accessible files patterns of this entry with the * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry * with the non accessible files patterns of the project. * </p> * * @param path the absolute path of the binary archive * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder, * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment. * and will be automatically converted to <code>null</code>. * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder * or <code>null</code> if this location should be automatically detected. * @param accessRules the possibly empty list of access rules for this entry * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new library includepath entry */ public static IIncludePathEntry newLibraryEntry( IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IAccessRule[] accessRules, IIncludePathAttribute[] extraAttributes, boolean isExported) { if (path == null) Assert.isTrue(false, "Library path cannot be null"); //$NON-NLS-1$ if (!path.isAbsolute()) Assert.isTrue(false, "Path for IIncludePathEntry must be absolute"); //$NON-NLS-1$ if (sourceAttachmentPath != null) { if (sourceAttachmentPath.isEmpty()) { sourceAttachmentPath = null; // treat empty path as none } else if (!sourceAttachmentPath.isAbsolute()) { Assert.isTrue(false, "Source attachment path '" //$NON-NLS-1$ + sourceAttachmentPath + "' for IIncludePathEntry must be absolute"); //$NON-NLS-1$ } } return new ClasspathEntry( IPackageFragmentRoot.K_BINARY, IIncludePathEntry.CPE_LIBRARY, JavaProject.canonicalizedPath(path), ClasspathEntry.INCLUDE_ALL, // inclusion patterns ClasspathEntry.EXCLUDE_NONE, // exclusion patterns sourceAttachmentPath, sourceAttachmentRootPath, null, // specific output folder isExported, accessRules, false, // no access rules to combine extraAttributes); } /** * Creates and returns a new includepath entry of kind <code>CPE_LIBRARY</code> for the JAR or folder * identified by the given absolute path. This specifies that all package fragments within the root * will have children of type <code>IClassFile</code>. * <p> * A library entry is used to denote a prerequisite JAR or root folder containing binaries. * The target JAR can either be defined internally to the workspace (absolute path relative * to the workspace root) or externally to the workspace (absolute path in the file system). * The target root folder can only be defined internally to the workspace (absolute path relative * to the workspace root). To use a binary folder external to the workspace, it must first be * linked (see IFolder#createLink(...)). * <p> * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * <p> * The <code>isExported</code> flag indicates whether this entry is contributed to dependent * projects. If not exported, dependent projects will not see any of the classes from this entry. * If exported, dependent projects will concatenate the accessible files patterns of this entry with the * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry * with the non accessible files patterns of the project. * </p> * * @param path the absolute path of the binary archive * @param sourceAttachmentPath the absolute path of the corresponding source archive or folder, * or <code>null</code> if none. Note, since 3.0, an empty path is allowed to denote no source attachment. * and will be automatically converted to <code>null</code>. * @param sourceAttachmentRootPath the location of the root of the source files within the source archive or folder * or <code>null</code> if this location should be automatically detected. * @param accessRules the possibly empty list of access rules for this entry * @param exclusionPatterns the possibly empty list of exclusion patterns * represented as relative paths * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new library includepath entry */ public static IIncludePathEntry newLibraryEntry( IPath path, IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IAccessRule[] accessRules, IIncludePathAttribute[] extraAttributes, IPath[] exclusionPatterns, boolean isExported) { if (path == null) Assert.isTrue(false, "Library path cannot be null"); //$NON-NLS-1$ if (!path.isAbsolute()) Assert.isTrue(false, "Path for IIncludePathEntry must be absolute"); //$NON-NLS-1$ if (sourceAttachmentPath != null) { if (sourceAttachmentPath.isEmpty()) { sourceAttachmentPath = null; // treat empty path as none } else if (!sourceAttachmentPath.isAbsolute()) { Assert.isTrue(false, "Source attachment path '" //$NON-NLS-1$ + sourceAttachmentPath + "' for IIncludePathEntry must be absolute"); //$NON-NLS-1$ } } return new ClasspathEntry( IPackageFragmentRoot.K_BINARY, IIncludePathEntry.CPE_LIBRARY, JavaProject.canonicalizedPath(path), ClasspathEntry.INCLUDE_ALL, // inclusion patterns exclusionPatterns, // exclusion patterns sourceAttachmentPath, sourceAttachmentRootPath, null, // specific output folder isExported, accessRules, false, // no access rules to combine extraAttributes); } /** * Creates and returns a new non-exported includepath entry of kind <code>CPE_PROJECT</code> * for the project identified by the given absolute path. * This method is fully equivalent to calling * {@link #newProjectEntry(IPath, IAccessRule[], boolean, IIncludePathAttribute[], boolean) * newProjectEntry(path, new IAccessRule[0], true, new IIncludePathAttribute[0], false)}. * * @param path the absolute path of the binary archive * @return a new project includepath entry */ public static IIncludePathEntry newProjectEntry(IPath path) { return newProjectEntry(path, false); } /** * Creates and returns a new includepath entry of kind <code>CPE_PROJECT</code> * for the project identified by the given absolute path. * This method is fully equivalent to calling * {@link #newProjectEntry(IPath, IAccessRule[], boolean, IIncludePathAttribute[], boolean) * newProjectEntry(path, new IAccessRule[0], true, new IIncludePathAttribute[0], isExported)}. * * @param path the absolute path of the prerequisite project * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new project includepath entry */ public static IIncludePathEntry newProjectEntry(IPath path, boolean isExported) { if (!path.isAbsolute()) Assert.isTrue(false, "Path for IIncludePathEntry must be absolute"); //$NON-NLS-1$ return newProjectEntry( path, ClasspathEntry.NO_ACCESS_RULES, true, ClasspathEntry.NO_EXTRA_ATTRIBUTES, isExported); } /** * Creates and returns a new includepath entry of kind <code>CPE_PROJECT</code> * for the project identified by the given absolute path. * <p> * A project entry is used to denote a prerequisite project on a includepath. * The referenced project will be contributed as a whole, either as sources (in the JavaScript Model, it * contributes all its package fragment roots) or as binaries (when building, it contributes its * whole output location). * </p> * <p> * A project reference allows to indirect through another project, independently from its internal layout. * </p><p> * The prerequisite project is referred to using an absolute path relative to the workspace root. * </p> * <p> * The access rules determine the set of accessible class files * in the project. If the list of access rules is empty then all files * in this project are accessible. * See {@link IAccessRule} for a detailed description of access rules. * </p> * <p> * The <code>combineAccessRules</code> flag indicates whether access rules of one (or more) * exported entry of the project should be combined with the given access rules. If they should * be combined, the given access rules are considered first, then the entry's access rules are * considered. * </p> * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * <p> * The <code>isExported</code> flag indicates whether this entry is contributed to dependent * projects. If not exported, dependent projects will not see any of the classes from this entry. * If exported, dependent projects will concatenate the accessible files patterns of this entry with the * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry * with the non accessible files patterns of the project. * </p> * * @param path the absolute path of the prerequisite project * @param accessRules the possibly empty list of access rules for this entry * @param combineAccessRules whether the access rules of the project's exported entries should be combined with the given access rules * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new project includepath entry */ public static IIncludePathEntry newProjectEntry( IPath path, IAccessRule[] accessRules, boolean combineAccessRules, IIncludePathAttribute[] extraAttributes, boolean isExported) { if (!path.isAbsolute()) Assert.isTrue(false, "Path for IIncludePathEntry must be absolute"); //$NON-NLS-1$ return new ClasspathEntry( IPackageFragmentRoot.K_SOURCE, IIncludePathEntry.CPE_PROJECT, path, ClasspathEntry.INCLUDE_ALL, // inclusion patterns ClasspathEntry.EXCLUDE_NONE, // exclusion patterns null, // source attachment null, // source attachment root null, // specific output folder isExported, accessRules, combineAccessRules, extraAttributes); } /** * Returns a new empty region. * * @return a new empty region */ public static IRegion newRegion() { return new Region(); } /** * Creates and returns a new includepath entry of kind <code>CPE_SOURCE</code> * for all files in the project's source folder identified by the given * absolute workspace-relative path. * <p> * The convenience method is fully equivalent to: * <pre> * newSourceEntry(path, new IPath[] {}, new IPath[] {}, null); * </pre> * </p> * * @param path the absolute workspace-relative path of a source folder * @return a new source includepath entry * @see #newSourceEntry(IPath, IPath[], IPath[], IPath) */ public static IIncludePathEntry newSourceEntry(IPath path) { return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, ClasspathEntry.EXCLUDE_NONE, null /*output location*/); } /** * Creates and returns a new includepath entry of kind <code>CPE_SOURCE</code> * for the project's source folder identified by the given absolute * workspace-relative path but excluding all source files with paths * matching any of the given patterns. * <p> * The convenience method is fully equivalent to: * <pre> * newSourceEntry(path, new IPath[] {}, exclusionPatterns, null); * </pre> * </p> * * @param path the absolute workspace-relative path of a source folder * @param exclusionPatterns the possibly empty list of exclusion patterns * represented as relative paths * @return a new source includepath entry * @see #newSourceEntry(IPath, IPath[], IPath[], IPath) */ public static IIncludePathEntry newSourceEntry(IPath path, IPath[] exclusionPatterns) { return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, exclusionPatterns, null /*output location*/); } /** * Creates and returns a new includepath entry of kind <code>CPE_SOURCE</code> * for the project's source folder identified by the given absolute * workspace-relative path but excluding all source files with paths * matching any of the given patterns, and associated with a specific output location * (that is, ".class" files are not going to the project default output location). * <p> * The convenience method is fully equivalent to: * <pre> * newSourceEntry(path, new IPath[] {}, exclusionPatterns, specificOutputLocation); * </pre> * </p> * * @param path the absolute workspace-relative path of a source folder * @param exclusionPatterns the possibly empty list of exclusion patterns * represented as relative paths * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location) * @return a new source includepath entry * @see #newSourceEntry(IPath, IPath[], IPath[], IPath) */ public static IIncludePathEntry newSourceEntry(IPath path, IPath[] exclusionPatterns, IPath specificOutputLocation) { return newSourceEntry(path, ClasspathEntry.INCLUDE_ALL, exclusionPatterns, specificOutputLocation); } /** * Creates and returns a new includepath entry of kind <code>CPE_SOURCE</code> * for the project's source folder identified by the given absolute * workspace-relative path but excluding all source files with paths * matching any of the given patterns, and associated with a specific output location * (that is, ".class" files are not going to the project default output location). * <p> * The convenience method is fully equivalent to: * <pre> * newSourceEntry(path, new IPath[] {}, exclusionPatterns, specificOutputLocation, new IIncludePathAttribute[] {}); * </pre> * </p> * * @param path the absolute workspace-relative path of a source folder * @param inclusionPatterns the possibly empty list of inclusion patterns * represented as relative paths * @param exclusionPatterns the possibly empty list of exclusion patterns * represented as relative paths * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location) * @return a new source includepath entry * @see #newSourceEntry(IPath, IPath[], IPath[], IPath, IIncludePathAttribute[]) */ public static IIncludePathEntry newSourceEntry(IPath path, IPath[] inclusionPatterns, IPath[] exclusionPatterns, IPath specificOutputLocation) { return newSourceEntry(path, inclusionPatterns, exclusionPatterns, specificOutputLocation, ClasspathEntry.NO_EXTRA_ATTRIBUTES); } /** * Creates and returns a new includepath entry of kind <code>CPE_SOURCE</code> * for the project's source folder identified by the given absolute * workspace-relative path using the given inclusion and exclusion patterns * to determine which source files are included, and the given output path * to control the output location of generated files. * <p> * The source folder is referred to using an absolute path relative to the * workspace root, e.g. <code>/Project/src</code>. A project's source * folders are located with that project. That is, a source includepath * entry specifying the path <code>/P1/src</code> is only usable for * project <code>P1</code>. * </p> * <p> * The inclusion patterns determines the initial set of source files that * are to be included; the exclusion patterns are then used to reduce this * set. When no inclusion patterns are specified, the initial file set * includes all relevent files in the resource tree rooted at the source * entry's path. On the other hand, specifying one or more inclusion * patterns means that all <b>and only</b> files matching at least one of * the specified patterns are to be included. If exclusion patterns are * specified, the initial set of files is then reduced by eliminating files * matched by at least one of the exclusion patterns. Inclusion and * exclusion patterns look like relative file paths with wildcards and are * interpreted relative to the source entry's path. File patterns are * case-sensitive can contain '**', '*' or '?' wildcards (see * {@link IIncludePathEntry#getExclusionPatterns()} for the full description * of their syntax and semantics). The resulting set of files are included * in the corresponding package fragment root; all package fragments within * the root will have children of type <code>IJavaScriptUnit</code>. * </p> * <p> * Also note that all sources/binaries inside a project are contributed as * a whole through a project entry * (see <code>JavaScriptCore.newProjectEntry</code>). Particular source entries * cannot be selectively exported. * </p> * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * * @param path the absolute workspace-relative path of a source folder * @param inclusionPatterns the possibly empty list of inclusion patterns * represented as relative paths * @param exclusionPatterns the possibly empty list of exclusion patterns * represented as relative paths * @param specificOutputLocation the specific output location for this source entry (<code>null</code> if using project default ouput location) * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @return a new source includepath entry with the given exclusion patterns * @see IIncludePathEntry#getInclusionPatterns() * @see IIncludePathEntry#getExclusionPatterns() * @see IIncludePathEntry#getOutputLocation() */ public static IIncludePathEntry newSourceEntry(IPath path, IPath[] inclusionPatterns, IPath[] exclusionPatterns, IPath specificOutputLocation, IIncludePathAttribute[] extraAttributes) { if (path == null) Assert.isTrue(false, "Source path cannot be null"); //$NON-NLS-1$ if (!path.isAbsolute()) Assert.isTrue(false, "Path for IIncludePathEntry must be absolute"); //$NON-NLS-1$ if (exclusionPatterns == null) Assert.isTrue(false, "Exclusion pattern set cannot be null"); //$NON-NLS-1$ if (inclusionPatterns == null) Assert.isTrue(false, "Inclusion pattern set cannot be null"); //$NON-NLS-1$ return new ClasspathEntry( IPackageFragmentRoot.K_SOURCE, IIncludePathEntry.CPE_SOURCE, path, inclusionPatterns, exclusionPatterns, null, // source attachment null, // source attachment root specificOutputLocation, // custom output location false, null, false, // no access rules to combine extraAttributes); } /** * Creates and returns a new non-exported includepath entry of kind <code>CPE_VARIABLE</code> * for the given path. This method is fully equivalent to calling * {@link #newVariableEntry(IPath, IPath, IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IIncludePathAttribute[0], false)}. * * @param variablePath the path of the binary archive; first segment is the * name of a includepath variable * @param variableSourceAttachmentPath the path of the corresponding source archive, * or <code>null</code> if none; if present, the first segment is the * name of a includepath variable (not necessarily the same variable * as the one that begins <code>variablePath</code>) * @param sourceAttachmentRootPath the location of the root of the source files within the source archive * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code> * @return a new library includepath entry */ public static IIncludePathEntry newVariableEntry( IPath variablePath, IPath variableSourceAttachmentPath, IPath sourceAttachmentRootPath) { return newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, false); } /** * Creates and returns a new includepath entry of kind <code>CPE_VARIABLE</code> * for the given path. This method is fully equivalent to calling * {@link #newVariableEntry(IPath, IPath, IPath, IAccessRule[], IIncludePathAttribute[], boolean) * newVariableEntry(variablePath, variableSourceAttachmentPath, sourceAttachmentRootPath, new IAccessRule[0], new IIncludePathAttribute[0], isExported)}. * * @param variablePath the path of the binary archive; first segment is the * name of a includepath variable * @param variableSourceAttachmentPath the path of the corresponding source archive, * or <code>null</code> if none; if present, the first segment is the * name of a includepath variable (not necessarily the same variable * as the one that begins <code>variablePath</code>) * @param variableSourceAttachmentRootPath the location of the root of the source files within the source archive * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code> * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new variable includepath entry */ public static IIncludePathEntry newVariableEntry( IPath variablePath, IPath variableSourceAttachmentPath, IPath variableSourceAttachmentRootPath, boolean isExported) { return newVariableEntry( variablePath, variableSourceAttachmentPath, variableSourceAttachmentRootPath, ClasspathEntry.NO_ACCESS_RULES, ClasspathEntry.NO_EXTRA_ATTRIBUTES, isExported); } /** * Creates and returns a new includepath entry of kind <code>CPE_VARIABLE</code> * for the given path. The first segment of the path is the name of a includepath variable. * The trailing segments of the path will be appended to resolved variable path. * <p> * A variable entry allows to express indirect references on a includepath to other projects or libraries, * depending on what the includepath variable is referring. * <p> * It is possible to register an automatic initializer (<code>JsGlobalScopeVariableInitializer</code>), * which will be invoked through the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeVariableInitializer". * After resolution, a includepath variable entry may either correspond to a project or a library entry. * <p> * The <code>extraAttributes</code> list contains name/value pairs that must be persisted with * this entry. If no extra attributes are provided, an empty array must be passed in.<br> * Note that this list should not contain any duplicate name. * </p> * <p> * The <code>isExported</code> flag indicates whether this entry is contributed to dependent * projects. If not exported, dependent projects will not see any of the classes from this entry. * If exported, dependent projects will concatenate the accessible files patterns of this entry with the * accessible files patterns of the projects, and they will concatenate the non accessible files patterns of this entry * with the non accessible files patterns of the project. * </p> * <p> * Note that this operation does not attempt to validate includepath variables * or access the resources at the given paths. * </p> * * @param variablePath the path of the binary archive; first segment is the * name of a includepath variable * @param variableSourceAttachmentPath the path of the corresponding source archive, * or <code>null</code> if none; if present, the first segment is the * name of a includepath variable (not necessarily the same variable * as the one that begins <code>variablePath</code>) * @param variableSourceAttachmentRootPath the location of the root of the source files within the source archive * or <code>null</code> if <code>variableSourceAttachmentPath</code> is also <code>null</code> * @param accessRules the possibly empty list of access rules for this entry * @param extraAttributes the possibly empty list of extra attributes to persist with this entry * @param isExported indicates whether this entry is contributed to dependent * projects in addition to the output location * @return a new variable includepath entry */ public static IIncludePathEntry newVariableEntry( IPath variablePath, IPath variableSourceAttachmentPath, IPath variableSourceAttachmentRootPath, IAccessRule[] accessRules, IIncludePathAttribute[] extraAttributes, boolean isExported) { if (variablePath == null) Assert.isTrue(false, "Variable path cannot be null"); //$NON-NLS-1$ if (variablePath.segmentCount() < 1) { Assert.isTrue( false, "Illegal includepath variable path: \'" + variablePath.makeRelative().toString() + "\', must have at least one segment"); //$NON-NLS-1$//$NON-NLS-2$ } return new ClasspathEntry( IPackageFragmentRoot.K_SOURCE, IIncludePathEntry.CPE_VARIABLE, variablePath, ClasspathEntry.INCLUDE_ALL, // inclusion patterns ClasspathEntry.EXCLUDE_NONE, // exclusion patterns variableSourceAttachmentPath, // source attachment variableSourceAttachmentRootPath, // source attachment root null, // specific output folder isExported, accessRules, false, // no access rules to combine extraAttributes); } /** * Removed the given includepath variable. Does nothing if no value was * set for this includepath variable. * <p> * This functionality cannot be used while the resource tree is locked. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * * @param variableName the name of the includepath variable * @param monitor the progress monitor to report progress * @see #setIncludepathVariable(String, IPath) */ public static void removeIncludepathVariable(String variableName, IProgressMonitor monitor) { try { SetVariablesOperation operation = new SetVariablesOperation(new String[]{ variableName}, new IPath[]{ null }, true/*update preferences*/); operation.runOperation(monitor); } catch (JavaScriptModelException e) { Util.log(e, "Exception while removing variable " + variableName); //$NON-NLS-1$ } } /** * Removes the given element changed listener. * Has no affect if an identical listener is not registered. * * @param listener the listener */ public static void removeElementChangedListener(IElementChangedListener listener) { JavaModelManager.getJavaModelManager().deltaState.removeElementChangedListener(listener); } /** * Removes the file extension from the given file name, if it has a JavaScript-like file * extension. Otherwise the file name itself is returned. * Note this removes the dot ('.') before the extension as well. * * @param fileName the name of a file * @return the fileName without the JavaScript-like extension */ public static String removeJavaScriptLikeExtension(String fileName) { return Util.getNameWithoutJavaLikeExtension(fileName); } /** * Removes the given pre-processing resource changed listener. * <p> * Has no affect if an identical listener is not registered. * * @param listener the listener */ public static void removePreProcessingResourceChangedListener(IResourceChangeListener listener) { JavaModelManager.getJavaModelManager().deltaState.removePreResourceChangedListener(listener); } /** * Runs the given action as an atomic JavaScript model operation. * <p> * After running a method that modifies javaScript elements, * registered listeners receive after-the-fact notification of * what just transpired, in the form of a element changed event. * This method allows clients to call a number of * methods that modify javaScript elements and only have element * changed event notifications reported at the end of the entire * batch. * </p> * <p> * If this method is called outside the dynamic scope of another such * call, this method runs the action and then reports a single * element changed event describing the net effect of all changes * done to javaScript elements by the action. * </p> * <p> * If this method is called in the dynamic scope of another such * call, this method simply runs the action. * </p> * * @param action the action to perform * @param monitor a progress monitor, or <code>null</code> if progress * reporting and cancellation are not desired * @exception CoreException if the operation failed. */ public static void run(IWorkspaceRunnable action, IProgressMonitor monitor) throws CoreException { run(action, ResourcesPlugin.getWorkspace().getRoot(), monitor); } /** * Runs the given action as an atomic JavaScript model operation. * <p> * After running a method that modifies javaScript elements, * registered listeners receive after-the-fact notification of * what just transpired, in the form of a element changed event. * This method allows clients to call a number of * methods that modify javaScript elements and only have element * changed event notifications reported at the end of the entire * batch. * </p> * <p> * If this method is called outside the dynamic scope of another such * call, this method runs the action and then reports a single * element changed event describing the net effect of all changes * done to javaScript elements by the action. * </p> * <p> * If this method is called in the dynamic scope of another such * call, this method simply runs the action. * </p> * <p> * The supplied scheduling rule is used to determine whether this operation can be * run simultaneously with workspace changes in other threads. See * <code>IWorkspace.run(...)</code> for more details. * </p> * * @param action the action to perform * @param rule the scheduling rule to use when running this operation, or * <code>null</code> if there are no scheduling restrictions for this operation. * @param monitor a progress monitor, or <code>null</code> if progress * reporting and cancellation are not desired * @exception CoreException if the operation failed. */ public static void run(IWorkspaceRunnable action, ISchedulingRule rule, IProgressMonitor monitor) throws CoreException { IWorkspace workspace = ResourcesPlugin.getWorkspace(); if (workspace.isTreeLocked()) { new BatchOperation(action).run(monitor); } else { // use IWorkspace.run(...) to ensure that a build will be done in autobuild mode workspace.run(new BatchOperation(action), rule, IWorkspace.AVOID_UPDATE, monitor); } } /** * Bind a container reference path to some actual containers (<code>IJsGlobalScopeContainer</code>). * This API must be invoked whenever changes in container need to be reflected onto the JavaModel. * Containers can have distinct values in different projects, therefore this API considers a * set of projects with their respective containers. * <p> * <code>containerPath</code> is the path under which these values can be referenced through * container includepath entries (<code>IIncludePathEntry#CPE_CONTAINER</code>). A container path * is formed by a first ID segment followed with extra segments, which can be used as additional hints * for the resolution. The container ID is used to identify a <code>JsGlobalScopeContainerInitializer</code> * registered on the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer". * <p> * There is no assumption that each individual container value passed in argument * (<code>respectiveContainers</code>) must answer the exact same path when requested * <code>IJsGlobalScopeContainer#getPath</code>. * Indeed, the containerPath is just an indication for resolving it to an actual container object. It can be * delegated to a <code>JsGlobalScopeContainerInitializer</code>, which can be activated through the extension * point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer"). * <p> * In reaction to changing container values, the JavaModel will be updated to reflect the new * state of the updated container. A combined JavaScript element delta will be notified to describe the corresponding * includepath changes resulting from the container update. This operation is batched, and automatically eliminates * unnecessary updates (new container is same as old one). This operation acquires a lock on the workspace's root. * <p> * This functionality cannot be used while the workspace is locked, since * it may create/remove some resource markers. * <p> * Includepath container values are persisted locally to the workspace, but * are not preserved from a session to another. It is thus highly recommended to register a * <code>JsGlobalScopeContainerInitializer</code> for each referenced container * (through the extension point "org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer"). * <p> * Note: setting a container to <code>null</code> will cause it to be lazily resolved again whenever * its value is required. In particular, this will cause a registered initializer to be invoked * again. * <p> * @param containerPath - the name of the container reference, which is being updated * @param affectedProjects - the set of projects for which this container is being bound * @param respectiveContainers - the set of respective containers for the affected projects * @param monitor a monitor to report progress * @throws JavaScriptModelException * @see JsGlobalScopeContainerInitializer * @see #getJsGlobalScopeContainer(IPath, IJavaScriptProject) * @see IJsGlobalScopeContainer */ public static void setJsGlobalScopeContainer(IPath containerPath, IJavaScriptProject[] affectedProjects, IJsGlobalScopeContainer[] respectiveContainers, IProgressMonitor monitor) throws JavaScriptModelException { if (affectedProjects.length != respectiveContainers.length) Assert.isTrue(false, "Projects and containers collections should have the same size"); //$NON-NLS-1$ SetContainerOperation operation = new SetContainerOperation(containerPath, affectedProjects, respectiveContainers); // operation.runOperation(monitor); operation.progressMonitor=monitor; operation.execute(); } /** * Sets the value of the given includepath variable. * The path must have at least one segment. * <p> * This functionality cannot be used while the resource tree is locked. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * * @param variableName the name of the includepath variable * @param path the path * @throws JavaScriptModelException * @see #getIncludepathVariable(String) * * @deprecated Use {@link #setIncludepathVariable(String, IPath, IProgressMonitor)} instead */ public static void setIncludepathVariable(String variableName, IPath path) throws JavaScriptModelException { setIncludepathVariable(variableName, path, null); } /** * Sets the value of the given includepath variable. * The path must not be null. * <p> * This functionality cannot be used while the resource tree is locked. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * Updating a variable with the same value has no effect. * * @param variableName the name of the includepath variable * @param path the path * @param monitor a monitor to report progress * @throws JavaScriptModelException * @see #getIncludepathVariable(String) */ public static void setIncludepathVariable( String variableName, IPath path, IProgressMonitor monitor) throws JavaScriptModelException { if (path == null) Assert.isTrue(false, "Variable path cannot be null"); //$NON-NLS-1$ setIncludepathVariables(new String[]{variableName}, new IPath[]{ path }, monitor); } /** * Sets the values of all the given includepath variables at once. * Null paths can be used to request corresponding variable removal. * <p> * A combined JavaScript element delta will be notified to describe the corresponding * includepath changes resulting from the variables update. This operation is batched, * and automatically eliminates unnecessary updates (new variable is same as old one). * This operation acquires a lock on the workspace's root. * <p> * This functionality cannot be used while the workspace is locked, since * it may create/remove some resource markers. * <p> * Includepath variable values are persisted locally to the workspace, and * are preserved from session to session. * <p> * Updating a variable with the same value has no effect. * * @param variableNames an array of names for the updated includepath variables * @param paths an array of path updates for the modified includepath variables (null * meaning that the corresponding value will be removed * @param monitor a monitor to report progress * @throws JavaScriptModelException * @see #getIncludepathVariable(String) */ public static void setIncludepathVariables( String[] variableNames, IPath[] paths, IProgressMonitor monitor) throws JavaScriptModelException { if (variableNames.length != paths.length) Assert.isTrue(false, "Variable names and paths collections should have the same size"); //$NON-NLS-1$ SetVariablesOperation operation = new SetVariablesOperation(variableNames, paths, true/*update preferences*/); operation.runOperation(monitor); } /** * Sets the default's validator options inside the given options map according * to the given compliance. * * <p>The given compliance must be one of the compliance supported by the validator. * See {@link #getDefaultOptions()} for a list of compliance values.</p> * * <p>The list of modified options is:</p> * <ul> * <li>{@link #COMPILER_CODEGEN_TARGET_PLATFORM}</li> * <li>{@link #COMPILER_SOURCE}</li> * <li>{@link #COMPILER_COMPLIANCE}</li> * <li>{@link #COMPILER_PB_ASSERT_IDENTIFIER}</li> * <li>{@link #COMPILER_PB_ENUM_IDENTIFIER}</li> * </ul> * * <p>If the given compliance is unknown, the given map is unmodified.</p> * * @param compliance the given compliance * @param options the given options map */ public static void setComplianceOptions(String compliance, Map options) { switch((int) (CompilerOptions.versionToJdkLevel(compliance) >>> 16)) { case ClassFileConstants.MAJOR_VERSION_1_3: options.put(JavaScriptCore.COMPILER_COMPLIANCE, JavaScriptCore.VERSION_1_3); options.put(JavaScriptCore.COMPILER_SOURCE, JavaScriptCore.VERSION_1_3); options.put(JavaScriptCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaScriptCore.VERSION_1_1); options.put(JavaScriptCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaScriptCore.IGNORE); break; case ClassFileConstants.MAJOR_VERSION_1_4: options.put(JavaScriptCore.COMPILER_COMPLIANCE, JavaScriptCore.VERSION_1_4); options.put(JavaScriptCore.COMPILER_SOURCE, JavaScriptCore.VERSION_1_3); options.put(JavaScriptCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaScriptCore.VERSION_1_2); options.put(JavaScriptCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaScriptCore.WARNING); break; case ClassFileConstants.MAJOR_VERSION_1_5: options.put(JavaScriptCore.COMPILER_COMPLIANCE, JavaScriptCore.VERSION_1_5); options.put(JavaScriptCore.COMPILER_SOURCE, JavaScriptCore.VERSION_1_5); options.put(JavaScriptCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaScriptCore.VERSION_1_5); options.put(JavaScriptCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaScriptCore.ERROR); break; case ClassFileConstants.MAJOR_VERSION_1_6: options.put(JavaScriptCore.COMPILER_COMPLIANCE, JavaScriptCore.VERSION_1_6); options.put(JavaScriptCore.COMPILER_SOURCE, JavaScriptCore.VERSION_1_6); options.put(JavaScriptCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaScriptCore.VERSION_1_6); options.put(JavaScriptCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaScriptCore.ERROR); break; case ClassFileConstants.MAJOR_VERSION_1_7: options.put(JavaScriptCore.COMPILER_COMPLIANCE, JavaScriptCore.VERSION_1_7); options.put(JavaScriptCore.COMPILER_SOURCE, JavaScriptCore.VERSION_1_7); options.put(JavaScriptCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaScriptCore.VERSION_1_7); options.put(JavaScriptCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaScriptCore.ERROR); } } /** * Sets the current table of options. All and only the options explicitly * included in the given table are remembered; all previous option settings * are forgotten, including ones not explicitly mentioned. * <p> * For a complete description of the configurable options, see * <code>getDefaultOptions</code>. * </p> * * @param newOptions * the new options (key type: <code>String</code>; value type: * <code>String</code>), or <code>null</code> to reset all * options to their default values * @see JavaScriptCore#getDefaultOptions() * @see org.eclipse.wst.jsdt.internal.core.JavaCorePreferenceInitializer for changing default settings */ public static void setOptions(Hashtable newOptions) { JavaModelManager.getJavaModelManager().setOptions(newOptions); } /* (non-Javadoc) * Shutdown the JavaScriptCore plug-in. * <p> * De-registers the JavaModelManager as a resource changed listener and save participant. * <p> * @see org.eclipse.core.runtime.Plugin#stop(BundleContext) */ public void stop(BundleContext context) throws Exception { try { JavaModelManager.getJavaModelManager().shutdown(); } finally { // ensure we call super.stop as the last thing super.stop(context); } } /* (non-Javadoc) * Startup the JavaScriptCore plug-in. * <p> * Registers the JavaModelManager as a resource changed listener and save participant. * Starts the background indexing, and restore saved includepath variable values. * <p> * @throws Exception * @see org.eclipse.core.runtime.Plugin#start(BundleContext) */ public void start(BundleContext context) throws Exception { super.start(context); JavaModelManager.getJavaModelManager().startup(); } public static String getSystemPath() { URL url=FileLocator.find(getJavaScriptCore().getBundle(),new Path("libraries"),null); //$NON-NLS-1$ return url.getFile(); } public static boolean isReadOnly(IResource resource) { QualifiedName qn=new QualifiedName(JavaScriptCore.PLUGIN_ID,JavaScriptCore.READ_ONLY_SOURCE_PROPERTY); try { String persistentProperty = resource.getPersistentProperty(qn); return "true".equals(persistentProperty); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } }