blob: 6c394f9403d9f75a66b13df13d125d865017d466 [file] [log] [blame]
// Copyright 2015 Google Inc. 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.devtools.build.lib.syntax;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
import com.google.devtools.build.lib.packages.CachingPackageLocator;
import com.google.devtools.build.lib.rules.SkylarkModules;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.util.FsApparatus;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* SkylarkShell is a standalone shell executing Skylark. This is intended for
* testing purposes and not for end-users. This is very limited (environment is
* almost empty), but it can be used to play with the language and reproduce
* bugs. Imports and includes are not supported.
*/
class SkylarkShell {
static final EventCollectionApparatus syntaxEvents = new EventCollectionApparatus();
static final FsApparatus scratch = FsApparatus.newInMemory();
static final CachingPackageLocator locator = new AbstractParserTestCase.EmptyPackageLocator();
static final Path path = scratch.path("stdin");
private static void exec(String inputSource, Environment env) {
try {
ParserInputSource input = ParserInputSource.create(inputSource, path);
Lexer lexer = new Lexer(input, syntaxEvents.reporter());
Parser.ParseResult result =
Parser.parseFileForSkylark(lexer, syntaxEvents.reporter(), locator,
SkylarkModules.getValidationEnvironment(
ImmutableMap.<String, SkylarkType>of()));
Object last = null;
for (Statement st : result.statements) {
if (st instanceof ExpressionStatement) {
last = ((ExpressionStatement) st).getExpression().eval(env);
} else {
st.exec(env);
last = null;
}
}
if (last != null) {
System.out.println(last);
}
} catch (Throwable e) { // Catch everything to avoid killing the shell.
e.printStackTrace();
}
}
public static void main(String[] args) {
Environment env = SkylarkModules.getNewEnvironment(new EventHandler() {
@Override
public void handle(Event event) {
System.out.println(event.getMessage());
}
});
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String currentInput = "";
String line;
System.out.print(">> ");
try {
while ((line = br.readLine()) != null) {
if (line.isEmpty()) {
exec(currentInput, env);
currentInput = "";
System.out.print(">> ");
} else {
currentInput = currentInput + "\n" + line;
System.out.print(".. ");
}
}
} catch (IOException io) {
io.printStackTrace();
}
}
}