/*
* Copyright 2015 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.template.soy.soyparse;
import static com.google.common.base.Preconditions.checkArgument;
import com.google.template.soy.base.SourceLocation;
/**
* Parsed content and information about the source from which it is derived.
*
* <p>TODO(lukes): consider whether or not this class carries its own weight. Maybe the grammar
* should be enhanced (or the AST refactored) so that we can more easily generate the AST from the
* javacc primitives, at which point passing these glorified pairs around in the parser may be less
* necessary (e.g. every time something returns a SourceItemInfo, maybe it should be returning a
* SoyNode and every time we return a SourceItemInfo<Void>, why not a Token).
*/
final class SourceItemInfo<T> {
private final T parsedContent;
private final SourceLocation location;
SourceItemInfo(T parsedContent, SourceItemInfo<?> begin, SourceItemInfo<?> end) {
this(
begin.location.getFilePath(),
parsedContent,
begin.location.getBeginLine(),
begin.location.getBeginColumn(),
end.location.getEndLine(),
end.location.getEndColumn());
checkArgument(begin.location.getFileName().equals(end.location.getFileName()));
}
SourceItemInfo(
String filePath,
T parsedContent,
int lineNum,
int columnNum,
int lineNumEnd,
int columnNumEnd) {
this.location = new SourceLocation(filePath, lineNum, columnNum, lineNumEnd, columnNumEnd);
this.parsedContent = parsedContent;
}
SourceItemInfo(T parsedContent, SourceLocation location) {
this.location = location;
this.parsedContent = parsedContent;
}
/** Content derived from tokens. */
T parsedContent() {
return parsedContent;
}
SourceLocation srcLocation() {
return location;
}
}