/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.core; import com.google.dart.engine.AnalysisEngine; import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.runtime.Platform; import java.util.HashMap; import java.util.Map; /** * Debug/Tracing options for the {@link DartCore} plugin. * * @coverage dart.tools.core */ public class DartCoreDebug { // Sparse map of all settings automatically built by calls to isOptionTrue() public static final Map<String, String> SPARSE_OPTION_MAP = new HashMap<String, String>(30); // Debugging / Tracing options public static final boolean METRICS = isOptionTrue("debug/metrics"); public static final boolean VERBOSE = isOptionTrue("debug/verbose"); public static final boolean LOGGING_DEBUGGER = isOptionTrue("logging/debugger"); public static final boolean TRACE_UPDATE = isOptionTrue("trace/update"); public static final boolean ENABLE_CONTENT_ASSIST_TIMING = isOptionTrue("debug/ResultCollector"); // Performance measurement and reporting options. public static final boolean PERF_OS_RESOURCES = isOptionTrue("perf/osResources"); public static final boolean PERF_THREAD_CONTENTION_MONIOR = isOptionTrue("perf/threadContentionMonitor"); // Experimental functionality options. public static final boolean EXPERIMENTAL = isOptionTrue("experimental") || CmdLineOptions.getOptions().getExperimental(); public static final boolean ENABLE_ALT_KEY_BINDINGS = isOptionTrue("experimental/altKeyBindings"); public static final boolean ENABLE_TESTS_VIEW = isOptionTrue("experimental/testsView"); public static final boolean ASK_FOR_USER_ANALYTICS = isOptionTrue("experimental/analytics"); public static final boolean ENABLE_NEW_FEEDBACK = isOptionTrue("experimental/feedback"); public static final Boolean ENABLE_NULL_AWARE_OPERATORS = isOptionTrue("experimental/nullAwareOperators"); public static final boolean ENABLE_TAB_COLORING = isOptionTrue("experimental/tabColors"); public static final boolean ENABLE_HTML_VALIDATION = isOptionTrue("experimental/validateHtml"); public static final boolean ENABLE_COVERAGE = isOptionTrue("experimental/coverage"); public static final String ENABLE_ANALYSIS_SERVER_PREF = "enableAnalysisServer"; public static final boolean ENABLE_ANALYSIS_SERVER = isOptionTrue("experimental/analysisServer") || DartCore.getPlugin().getPrefs().getBoolean(ENABLE_ANALYSIS_SERVER_PREF, true); public static final String ENABLE_LINTING_PREF = "enableLinting"; public static final boolean ANALYSIS_SERVER_DEBUG = isOptionTrue("experimental/analysisServer/debug"); public static final boolean ANALYSIS_SERVER_INCREMENTAL_RESOLUTION_API = isOptionTrue("experimental/analysisServer/incrementalResolutionApi"); public static final String ANALYSIS_SERVER_INCREMENTAL_RESOLUTION_LOG = getOptionValue("experimental/analysisServer/incrementalResolutionLog"); public static final boolean ANALYSIS_SERVER_INCREMENTAL_RESOLUTION_VALIDATION = isOptionTrue("experimental/analysisServer/incrementalResolutionValidation"); public static final String ANALYSIS_SERVER_INSTRUMENTATION_LOG_FILE = getOptionValue("experimental/analysisServer/instrumentationLogFile"); public static final boolean ANALYSIS_SERVER_NEW_TASK_MODEL = isOptionTrue("experimental/analysisServer/newTaskModel"); // http diagnostic port public static final String ANALYSIS_SERVER_HTTP_PORT_PREF = "analysisServerHttpPort"; public static final String ANALYSIS_SERVER_HTTP_PORT = getOptionOrPrefValue( "experimental/analysisServer/http_port", ANALYSIS_SERVER_HTTP_PORT_PREF); public static final String ANALYSIS_SERVER_LOG_FILE = getOptionValue("experimental/analysisServer/logFile"); public static final String ANALYSIS_SERVER_PATH = getOptionValue("experimental/analysisServer/path"); public static final boolean ANALYSIS_SERVER_PRINT_TO_CONSOLE = isOptionTrue("experimental/analysisServer/printToConsole"); public static final boolean ANALYSIS_SERVER_PROFILE = isOptionTrue("experimental/analysisServer/profile"); public static final boolean NO_PUB_PACKAGES = isOptionTrue("experimental/noPubPackages"); // The defaults are duplicated for tests in // editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/resolver/ResolverTestCase.java public static final boolean ENABLE_UNION_TYPES = isOptionTrue("experimental/enableUnionTypes"); public static final boolean STRICT_UNION_TYPES = isOptionTrue("experimental/strictUnionTypes"); public static final boolean DISABLE_MARK_OCCURRENCES = isOptionTrue("dev/disableMarkOccurrences"); // Persistent developer settings public static final boolean DISABLE_DARTIUM_DEBUGGER = isOptionTrue("user/disableDartiumDebugger"); // User settings public static final boolean DISABLE_CLI_DEBUGGER = isOptionTrue("user/disableCommandLineDebugger"); /** * Flag to disable the semantic highlighting optimization so that an underlying semantic * highlighting bug can be better investigated. */ public static final boolean DISABLE_SEMANTIC_HIGHLIGHT_FILTERING = isOptionTrue("experimental/analysisServer/disableSemanticHighlightFiltering"); /** * Report each of these parameters to the provided instrumentation builder */ public static void record(InstrumentationBuilder instrumentation) { // Cause AnalysisEngine to throw exceptions if server is enabled AnalysisEngine.setDisableEngine(ENABLE_ANALYSIS_SERVER); instrumentation.metric("ENABLE_ANALYSIS_SERVER", ENABLE_ANALYSIS_SERVER); instrumentation.metric("ANALYSIS_SERVER_HTTP_PORT", ANALYSIS_SERVER_HTTP_PORT); instrumentation.metric("METRICS", METRICS); instrumentation.metric("VERBOSE", VERBOSE); instrumentation.metric("LOGGING_DEBUGGER", LOGGING_DEBUGGER); instrumentation.metric("TRACE_UPDATE", TRACE_UPDATE); instrumentation.metric("ENABLE_CONTENT_ASSIST_TIMING", ENABLE_CONTENT_ASSIST_TIMING); instrumentation.metric("PERF_OS_RESOURCES", PERF_OS_RESOURCES); instrumentation.metric("PERF_THREAD_CONTENTION_MONIOR", PERF_THREAD_CONTENTION_MONIOR); instrumentation.metric("EXPERIMENTAL", EXPERIMENTAL); instrumentation.metric("ENABLE_ALT_KEY_BINDINGS", ENABLE_ALT_KEY_BINDINGS); instrumentation.metric("ENABLE_TESTS_VIEW", ENABLE_TESTS_VIEW); instrumentation.metric("ENABLE_TAB_COLORING", ENABLE_TAB_COLORING); instrumentation.metric("ENABLE_HTML_VALIDATION", ENABLE_HTML_VALIDATION); instrumentation.metric("NO_PUB_PACKAGES", NO_PUB_PACKAGES); instrumentation.metric("DISABLE_MARK_OCCURRENCES", DISABLE_MARK_OCCURRENCES); instrumentation.metric("DISABLE_DARTIUM_DEBUGGER", DISABLE_DARTIUM_DEBUGGER); instrumentation.metric("DISABLE_CLI_DEBUGGER", DISABLE_CLI_DEBUGGER); instrumentation.metric( "DISABLE_SEMANTIC_HIGHLIGHT_FILTERING", DISABLE_SEMANTIC_HIGHLIGHT_FILTERING); } /** * Returns a value of the option or the preference. */ private static String getOptionOrPrefValue(String optionSuffix, String prefKey) { String value = getOptionValue(optionSuffix); if (value == null || value.length() == 0) { value = DartCore.getPlugin().getPrefs().get(prefKey, ""); } return value; } /** * Returns a value of the option, {@code null} if not set. */ private static String getOptionValue(String optionSuffix) { String option = DartCore.PLUGIN_ID + "/" + optionSuffix; String value = Platform.getDebugOption(option); if (value == null) { value = DartCore.getUserDefinedProperty(option); } return value; } /** * @return <code>true</code> if option has value "true". */ private static boolean isOptionTrue(String optionSuffix) { return isOptionValue(optionSuffix, "true"); } /** * @return <code>true</code> if option has "expected" value. */ private static boolean isOptionValue(String optionSuffix, String expected) { String value = getOptionValue(optionSuffix); if (value != null && !"false".equals(value)) { SPARSE_OPTION_MAP.put(optionSuffix, value); } return StringUtils.equalsIgnoreCase(value, expected); } }