diff options
author | Laurent Le Brun <laurentlb@google.com> | 2016-10-07 12:31:59 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-10-07 13:51:14 +0000 |
commit | 6f23b13fb27b5eecaaf624cb82dd85f9c1cd8f3b (patch) | |
tree | 5ae3c82d79c435f3e252b115731798c54f1516cb /src/main/java/com/google/devtools/skylark | |
parent | 0436ce0b1b21e8d44851008bd939a8a45e3aa985 (diff) |
Create directory for Standalone Skylark
Move the REPL Skylark there.
--
MOS_MIGRATED_REVID=135467316
Diffstat (limited to 'src/main/java/com/google/devtools/skylark')
-rw-r--r-- | src/main/java/com/google/devtools/skylark/Skylark.java | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/skylark/Skylark.java b/src/main/java/com/google/devtools/skylark/Skylark.java new file mode 100644 index 0000000000..51053fb2a5 --- /dev/null +++ b/src/main/java/com/google/devtools/skylark/Skylark.java @@ -0,0 +1,92 @@ +// 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.devtools.skylark; + +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.EventHandler; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.Mutability; +import com.google.devtools.build.lib.syntax.Printer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.Charset; + +/** + * Skylark is a standalone skylark intepreter. The environment doesn't + * contain Bazel-specific functions and variables. Load statements are + * forbidden for the moment. + */ +class Skylark { + private static final String START_PROMPT = ">> "; + private static final String CONTINUATION_PROMPT = ".. "; + + public static final EventHandler PRINT_HANDLER = new EventHandler() { + @Override + public void handle(Event event) { + System.out.println(event.getMessage()); + } + }; + + private final BufferedReader reader = new BufferedReader( + new InputStreamReader(System.in, Charset.defaultCharset())); + private final Mutability mutability = Mutability.create("interpreter"); + private final Environment env = Environment.builder(mutability) + .setSkylark().setGlobals(Environment.SKYLARK).setEventHandler(PRINT_HANDLER).build(); + + public String prompt() { + StringBuilder input = new StringBuilder(); + System.out.print(START_PROMPT); + try { + while (true) { + String line = reader.readLine(); + if (line == null) { + return null; + } + if (line.isEmpty()) { + return input.toString(); + } + input.append("\n").append(line); + System.out.print(CONTINUATION_PROMPT); + } + } catch (IOException io) { + io.printStackTrace(); + return null; + } + } + + public void readEvalPrintLoop() { + String input; + while ((input = prompt()) != null) { + try { + Object result = env.eval(input); + if (result != null) { + System.out.println(Printer.repr(result)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + if (args.length == 0) { + new Skylark().readEvalPrintLoop(); + } else { + System.err.println("no argument expected"); + System.exit(1); + } + } +} |