| Index: dart/compiler/javatests/com/google/dart/compiler/common/GenerateSourceMapTest.java
|
| diff --git a/dart/compiler/javatests/com/google/dart/compiler/common/GenerateSourceMapTest.java b/dart/compiler/javatests/com/google/dart/compiler/common/GenerateSourceMapTest.java
|
| deleted file mode 100644
|
| index ee81842e079899e813f4d8c67e6e89b5be6ceb3c..0000000000000000000000000000000000000000
|
| --- a/dart/compiler/javatests/com/google/dart/compiler/common/GenerateSourceMapTest.java
|
| +++ /dev/null
|
| @@ -1,324 +0,0 @@
|
| -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -package com.google.dart.compiler.common;
|
| -
|
| -import com.google.common.collect.Lists;
|
| -import com.google.common.collect.Maps;
|
| -import com.google.common.io.CharStreams;
|
| -import com.google.dart.compiler.Backend;
|
| -import com.google.dart.compiler.CompilerConfiguration;
|
| -import com.google.dart.compiler.CompilerTestCase;
|
| -import com.google.dart.compiler.DartArtifactProvider;
|
| -import com.google.dart.compiler.DartSource;
|
| -import com.google.dart.compiler.DefaultCompilerConfiguration;
|
| -import com.google.dart.compiler.MockArtifactProvider;
|
| -import com.google.dart.compiler.backend.dart.DartBackend;
|
| -import com.google.dart.compiler.backend.js.ClosureJsBackend;
|
| -import com.google.dart.compiler.backend.js.JavascriptBackend;
|
| -import com.google.debugging.sourcemap.FilePosition;
|
| -import com.google.debugging.sourcemap.SourceMapConsumerFactory;
|
| -import com.google.debugging.sourcemap.SourceMapParseException;
|
| -import com.google.debugging.sourcemap.SourceMapSection;
|
| -import com.google.debugging.sourcemap.SourceMapping;
|
| -import com.google.debugging.sourcemap.proto.Mapping.OriginalMapping;
|
| -
|
| -import java.io.IOException;
|
| -import java.io.StringWriter;
|
| -import java.util.List;
|
| -import java.util.Map;
|
| -
|
| -/**
|
| - * Tests for {@link GenerateSourceMap}.
|
| - *
|
| - * @author jschorr@google.com (Joseph Schorr)
|
| - * @author johnlenz@google.com (John Lenz)
|
| - */
|
| -public class GenerateSourceMapTest extends CompilerTestCase {
|
| -
|
| - // TODO(johnlenz): support detail levels
|
| -
|
| - enum ResultType {
|
| - JS,
|
| - CLOSURE_JS,
|
| - DART
|
| - }
|
| -
|
| - @Override
|
| - public void setUp() {
|
| - }
|
| -
|
| - // TODO(johnlenz): fix this
|
| - public void disable_testClassMapping() throws Exception {
|
| - compileAndCheck("class __CLASS__ { }", "__CLASS__");
|
| - }
|
| -
|
| - public void testMethodMapping() throws Exception {
|
| - compileAndCheck("class myClass { static __MEMBER__() {} }", "myClass");
|
| - }
|
| -
|
| - // TODO(johnlenz): fix this
|
| - public void disable_testFieldMapping1() throws Exception {
|
| - compileAndCheck("class myClass { const int __FIELD__; }", "myClass");
|
| - }
|
| -
|
| - // TODO(johnlenz): fails
|
| - public void disable_testFieldMapping2() throws Exception {
|
| - compileAndCheck("class myClass { static const int __FIELD__ = 1; }", "myClass");
|
| - }
|
| -
|
| - public void testMethodParamMapping() throws Exception {
|
| - compileAndCheck("class myClass { static member(__PARAM1__, __PARAM2__) {} }", "myClass");
|
| - }
|
| -
|
| - public void testNamedFunctionMapping() throws Exception {
|
| - compileAndCheck(
|
| - "class c {\n" +
|
| - " void member() {\n" +
|
| - " __FN__(__PARAM1__, __PARAM2__) {}\n" +
|
| - " }" +
|
| - "}", "c");
|
| - }
|
| -
|
| - public void testLocalMapping() throws Exception {
|
| - compileAndCheck(
|
| - "class c {\n" +
|
| - " void member() {\n" +
|
| - " var __VAR__ = '__STR__'; \n" +
|
| - " }" +
|
| - "}", "c");
|
| - }
|
| -
|
| - public void testLocalInClosureMapping() throws Exception {
|
| - compileAndCheck(
|
| - "class c {\n" +
|
| - " void member() {\n" +
|
| - " fn(p1, p2) {\n" +
|
| - " var __VAR__ = '__STR__'; \n" +
|
| - " }\n" +
|
| - " }" +
|
| - "}", "c");
|
| - }
|
| -
|
| - public void testWriteMetaMap() throws IOException {
|
| - StringWriter out = new StringWriter();
|
| - String name = "./app.js";
|
| - List<SourceMapSection> appSections = Lists.newArrayList(
|
| - SourceMapSection.forURL("src1", 0, 0),
|
| - SourceMapSection.forURL("src2", 100, 10),
|
| - SourceMapSection.forURL("src3", 150, 5));
|
| -
|
| - new GenerateSourceMap().appendIndexMapTo(out, name, appSections);
|
| -
|
| - assertEquals(
|
| - "{\n" +
|
| - "\"version\":3,\n" +
|
| - "\"file\":\"./app.js\",\n" +
|
| - "\"sections\":[\n" +
|
| - "{\n" +
|
| - "\"offset\":{\n" +
|
| - "\"line\":0,\n" +
|
| - "\"column\":0\n" +
|
| - "},\n" +
|
| - "\"url\":\"src1\"\n" +
|
| - "},\n" +
|
| - "{\n" +
|
| - "\"offset\":{\n" +
|
| - "\"line\":100,\n" +
|
| - "\"column\":10\n" +
|
| - "},\n" +
|
| - "\"url\":\"src2\"\n" +
|
| - "},\n" +
|
| - "{\n" +
|
| - "\"offset\":{\n" +
|
| - "\"line\":150,\n" +
|
| - "\"column\":5\n" +
|
| - "},\n" +
|
| - "\"url\":\"src3\"\n" +
|
| - "}\n" +
|
| - "]\n" +
|
| - "}\n",
|
| - out.toString());
|
| - }
|
| -
|
| -
|
| - private static class RunResult {
|
| - final String generatedSource;
|
| - final String sourceMapFileContent;
|
| -
|
| - RunResult(String source, String sourceMap) {
|
| - this.generatedSource = source;
|
| - this.sourceMapFileContent = sourceMap;
|
| - }
|
| - }
|
| -
|
| - private static class Token {
|
| - String tokenName;
|
| - FilePosition position;
|
| - }
|
| -
|
| - /**
|
| - * Finds the all the __XX__ tokens in the given Javascript
|
| - * string.
|
| - */
|
| - private Map<String, Token> findTokens(String js) {
|
| - Map<String, Token> tokens = Maps.newLinkedHashMap();
|
| -
|
| - int currentLine = 0;
|
| - int positionOffset = 0;
|
| -
|
| - for (int i = 0; i < js.length(); ++i) {
|
| - char current = js.charAt(i);
|
| -
|
| - if (current == '\n') {
|
| - positionOffset = i + 1;
|
| - currentLine++;
|
| - continue;
|
| - }
|
| -
|
| - if (current == '_' && (i < js.length() - 5)) {
|
| - // Check for the _ token.
|
| - if (js.charAt(i + 1) != '_') {
|
| - continue;
|
| - }
|
| -
|
| - // Loop until we have another _ token.
|
| - String tokenName = "";
|
| -
|
| - int j = i + 2;
|
| - for (; j < js.length(); ++j) {
|
| - if (js.charAt(j) == '_') {
|
| - break;
|
| - }
|
| - if (js.charAt(j) == '\n') {
|
| - // False match, tokens can't span lines
|
| - tokenName = "";
|
| - break;
|
| - }
|
| -
|
| - tokenName += js.charAt(j);
|
| - }
|
| -
|
| - if (tokenName.length() > 0) {
|
| - Token token = new Token();
|
| - token.tokenName = tokenName;
|
| - int currentPosition = i - positionOffset;
|
| - token.position = new FilePosition(currentLine, currentPosition);
|
| -
|
| - // Only use the first instance of a token (parameters can be repeated in trampolines).
|
| - if (!tokens.containsKey(tokenName)) {
|
| - tokens.put(tokenName, token);
|
| - }
|
| - }
|
| -
|
| - i = j;
|
| - }
|
| - }
|
| -
|
| - return tokens;
|
| - }
|
| -
|
| - private void compileAndCheck(String dartSource, String part) throws Exception {
|
| - compileAndCheck(dartSource, "", ResultType.DART);
|
| - compileAndCheck(dartSource, part, ResultType.JS);
|
| - // TODO(johnlenz): Use the application map instead of the per file map
|
| - // compileAndCheck(dartSource, null, ResultType.CLOSURE_JS);
|
| - }
|
| -
|
| - private void compileAndCheck(String dartSource, String part, ResultType type) throws Exception {
|
| - RunResult result = getCompileResult("testcode", dartSource, part, type);
|
| -
|
| - // Find all instances of the __XXX__ pattern in the original
|
| - // source code.
|
| - Map<String, Token> originalTokens = findTokens(dartSource);
|
| -
|
| - // Find all instances of the __XXX__ pattern in the generated
|
| - // source code.
|
| - Map<String, Token> resultTokens = findTokens(result.generatedSource);
|
| -
|
| - // Ensure that the generated instances match via the source map
|
| - // to the original source code.
|
| -
|
| - // Ensure the token counts match.
|
| - assertEquals(originalTokens.size(), resultTokens.size());
|
| -
|
| - SourceMapping sourcemap;
|
| - try {
|
| - sourcemap = SourceMapConsumerFactory.parse(result.sourceMapFileContent);
|
| - } catch (SourceMapParseException e) {
|
| - throw new RuntimeException("unexpected exception", e);
|
| - }
|
| -
|
| - // Map the tokens from the generated source back to the
|
| - // input source and ensure that the map is correct.
|
| - for (Token token : resultTokens.values()) {
|
| - OriginalMapping mapping = sourcemap.getMappingForLine(
|
| - token.position.getLine() + 1,
|
| - token.position.getColumn() + 1);
|
| -
|
| - assertNotNull(mapping);
|
| -
|
| - // Find the associated token in the input source.
|
| - Token inputToken = originalTokens.get(token.tokenName);
|
| - assertNotNull(inputToken);
|
| -
|
| - // Ensure that the map correctly points to the token (we add 1
|
| - // to normalize versus the Rhino line number indexing scheme).
|
| - assertEquals(mapping.getLineNumber(),
|
| - inputToken.position.getLine() + 1);
|
| -
|
| - // Ensure that if the token name does not being with an 'STR' (meaning a
|
| - // string) it has an original name.
|
| - String originalName = mapping.getIdentifier();
|
| - if (!inputToken.tokenName.startsWith("STR")) {
|
| - assertTrue(!originalName.isEmpty());
|
| - }
|
| -
|
| - // Ensure that if the mapping has a name, it matches the token.
|
| - if (!originalName.isEmpty()) {
|
| - assertEquals("__" + inputToken.tokenName + "__", originalName);
|
| - }
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - protected CompilerConfiguration getCompilerConfiguration(Backend backend) {
|
| - return new DefaultCompilerConfiguration(
|
| - backend, new com.google.dart.compiler.CommandLineOptions.CompilerOptions(){
|
| - @Override
|
| - public boolean generateSourceMaps() { return true; }
|
| - });
|
| - }
|
| -
|
| - protected RunResult getResultForCompile(String fileName, String sourceCode, String part,
|
| - Backend backend, String outExt, String mapExt) throws Exception {
|
| - DartArtifactProvider provider = new MockArtifactProvider();
|
| - DartSource dart = compileSingleUnit(
|
| - fileName, sourceCode, provider, backend);
|
| -
|
| - StringBuilder src = new StringBuilder();
|
| - StringBuilder map = new StringBuilder();
|
| - CharStreams.copy(provider.getArtifactReader(dart, part, outExt), src);
|
| - CharStreams.copy(provider.getArtifactReader(dart, part, mapExt), map);
|
| -
|
| - return new RunResult(src.toString(), map.toString());
|
| - }
|
| -
|
| - private RunResult getCompileResult(
|
| - String filename, String sourceCode, String part, ResultType type)
|
| - throws Exception {
|
| - switch (type) {
|
| - case DART:
|
| - return getResultForCompile(filename, sourceCode, part, new DartBackend(),
|
| - DartBackend.EXTENSION_DART, DartBackend.EXTENSION_DART_SRC_MAP);
|
| - case JS:
|
| - return getResultForCompile(filename, sourceCode, part, new JavascriptBackend(),
|
| - JavascriptBackend.EXTENSION_JS, JavascriptBackend.EXTENSION_JS_SRC_MAP);
|
| - case CLOSURE_JS:
|
| - return getResultForCompile(filename, sourceCode, part, new ClosureJsBackend(),
|
| - ClosureJsBackend.EXTENSION_JS, ClosureJsBackend.EXTENSION_JS_SRC_MAP);
|
| - }
|
| - throw new IllegalStateException();
|
| - }
|
| -}
|
|
|