Use source map remapper in JS inliner
This commit is contained in:
@@ -64,9 +64,10 @@ final class LineBuffer {
|
||||
*/
|
||||
static final int BUFLEN = 256;
|
||||
|
||||
LineBuffer(Reader in, int lineno) {
|
||||
LineBuffer(Reader in, CodePosition position) {
|
||||
this.in = in;
|
||||
this.lineno = lineno;
|
||||
this.lineno = position.getLine();
|
||||
this.lineStart = -position.getOffset();
|
||||
}
|
||||
|
||||
int read() throws IOException {
|
||||
|
||||
@@ -495,14 +495,15 @@ public class TokenStream {
|
||||
}
|
||||
|
||||
public TokenStream(Reader in,
|
||||
String sourceName, int lineno)
|
||||
String sourceName, CodePosition position)
|
||||
{
|
||||
this.in = new LineBuffer(in, lineno);
|
||||
this.in = new LineBuffer(in, position);
|
||||
this.pushbackToken = EOF;
|
||||
this.sourceName = sourceName;
|
||||
flags = 0;
|
||||
secondToLastPosition = new CodePosition(lineno, 0);
|
||||
lastPosition = new CodePosition(lineno, 0);
|
||||
secondToLastPosition = position;
|
||||
lastPosition = position;
|
||||
lastTokenPosition = position;
|
||||
}
|
||||
|
||||
/* return and pop the token from the stream if it matches...
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2010-2017 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.js.parser
|
||||
|
||||
import com.google.gwt.dev.js.rhino.CodePosition
|
||||
|
||||
class OffsetToSourceMapping(text: String) {
|
||||
private val data: IntArray
|
||||
|
||||
init {
|
||||
val lineSeparators = LINE_SEPARATOR.findAll(text).map { it.range.endInclusive + 1 }
|
||||
data = (sequenceOf(0) + lineSeparators).toList().toIntArray()
|
||||
}
|
||||
|
||||
operator fun get(offset: Int): CodePosition {
|
||||
val lineNumber = data.binarySearch(offset).let { if (it >= 0) it else -it - 2 }
|
||||
return CodePosition(lineNumber, offset - data[lineNumber])
|
||||
}
|
||||
|
||||
private companion object {
|
||||
private val LINE_SEPARATOR = Regex("\\r\\n|\\r|\\n")
|
||||
}
|
||||
}
|
||||
@@ -16,29 +16,26 @@
|
||||
|
||||
package org.jetbrains.kotlin.js.parser
|
||||
|
||||
import com.google.gwt.dev.js.*
|
||||
import com.google.gwt.dev.js.JsAstMapper
|
||||
import com.google.gwt.dev.js.rhino.*
|
||||
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsFunction
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsFunctionScope
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsScope
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsStatement
|
||||
import org.jetbrains.kotlin.js.common.SourceInfoImpl
|
||||
import java.io.*
|
||||
import java.io.Reader
|
||||
import java.io.StringReader
|
||||
import java.util.*
|
||||
|
||||
private val FAKE_SOURCE_INFO = SourceInfoImpl(null, 0, 0, 0, 0)
|
||||
|
||||
fun parse(code: String, reporter: ErrorReporter, scope: JsScope, fileName: String): List<JsStatement> {
|
||||
val insideFunction = scope is JsFunctionScope
|
||||
val node = parse(code, 0, reporter, insideFunction, Parser::parse)
|
||||
val node = parse(code, CodePosition(0, 0), 0, reporter, insideFunction, Parser::parse)
|
||||
return node.toJsAst(scope, fileName) {
|
||||
mapStatements(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun parseFunction(code: String, fileName: String, offset: Int, reporter: ErrorReporter, scope: JsScope): JsFunction =
|
||||
parse(code, offset, reporter, insideFunction = false) {
|
||||
fun parseFunction(code: String, fileName: String, position: CodePosition, offset: Int, reporter: ErrorReporter, scope: JsScope): JsFunction =
|
||||
parse(code, position, offset, reporter, insideFunction = false) {
|
||||
addObserver(FunctionParsingObserver())
|
||||
primaryExpr(it)
|
||||
}.toJsAst(scope, fileName, JsAstMapper::mapFunction)
|
||||
@@ -65,6 +62,7 @@ private class FunctionParsingObserver : Observer {
|
||||
inline
|
||||
private fun parse(
|
||||
code: String,
|
||||
startPosition: CodePosition,
|
||||
offset: Int,
|
||||
reporter: ErrorReporter,
|
||||
insideFunction: Boolean,
|
||||
@@ -73,7 +71,7 @@ private fun parse(
|
||||
Context.enter().errorReporter = reporter
|
||||
|
||||
try {
|
||||
val ts = TokenStream(StringReader(code, offset), "<parser>", FAKE_SOURCE_INFO.line)
|
||||
val ts = TokenStream(StringReader(code, offset), "<parser>", startPosition)
|
||||
val parser = Parser(IRFactory(ts), insideFunction)
|
||||
return parser.parseAction(ts) as Node
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user