blob: 6956bbbde8c4367f98847acb5f2411bfead4b297 [file] [log] [blame]
/*
* Copyright 2016 The Bazel Authors. All rights reserved.
*
* 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.idea.blaze.base.projectview.parser;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.idea.blaze.base.scope.BlazeContext;
import com.google.idea.blaze.base.scope.output.IssueOutput;
import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
import com.google.idea.blaze.base.ui.BlazeValidationError;
import java.io.File;
import java.util.List;
import javax.annotation.Nullable;
/** Context for the project view parser. */
public class ParseContext {
private final BlazeContext context;
private final WorkspacePathResolver workspacePathResolver;
@Nullable private final File file;
private final List<String> lines;
@Nullable private Line currentLine;
@Nullable private String currentRawLine;
private int currentLineIndex;
private int savedPosition = -1;
/** A line that is being parsed */
public static class Line {
public final String text;
public final int indent;
public Line(String text, int indent) {
this.text = text;
this.indent = indent;
}
}
public ParseContext(
BlazeContext context,
WorkspacePathResolver workspacePathResolver,
@Nullable File file,
String text) {
this.context = context;
this.workspacePathResolver = workspacePathResolver;
this.file = file;
this.lines = Lists.newArrayList(Splitter.on('\n').split(text));
this.currentLine = null;
this.currentLineIndex = -1;
consume();
}
public Line current() {
assert currentLine != null;
return currentLine;
}
public String currentRawLine() {
assert currentRawLine != null;
return currentRawLine;
}
public void consume() {
while (++currentLineIndex < lines.size()) {
update();
break;
}
}
private void update() {
String line = lines.get(currentLineIndex);
int indent = 0;
while (indent < line.length() && line.charAt(indent) == ' ') {
++indent;
}
currentLine = new Line(line.trim(), indent);
currentRawLine = line;
}
public boolean atEnd() {
return currentLineIndex >= lines.size();
}
public BlazeContext getContext() {
return context;
}
public WorkspacePathResolver getWorkspacePathResolver() {
return workspacePathResolver;
}
public void savePosition() {
savedPosition = currentLineIndex;
}
public void clearSavedPosition() {
savedPosition = -1;
}
public void resetToSavedPosition() {
if (savedPosition != -1) {
currentLineIndex = savedPosition;
savedPosition = -1;
update();
}
}
@Nullable
public File getProjectViewFile() {
return file;
}
public void addErrors(List<BlazeValidationError> errors) {
for (BlazeValidationError error : errors) {
addError(error.getError());
}
}
public void addError(String error) {
IssueOutput.error(error).inFile(file).onLine(currentLineIndex).submit(context);
}
}