annotate graal/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java @ 16130:6f7d3f3703d3

Truffle/Source: - LineLocation and LineBreakpoint no longer implement Comparable - TextMap now internal to the Source factory
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Mon, 16 Jun 2014 20:52:06 -0700
parents 74e142bd2b12
children 7109baa7b9eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
1 /*
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
4 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation. Oracle designates this
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
8 * particular file as subject to the "Classpath" exception as provided
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
9 * by Oracle in the LICENSE file that accompanied this code.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
10 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
11 * This code is distributed in the hope that it will be useful, but WITHOUT
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
14 * version 2 for more details (a copy is included in the LICENSE file that
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
15 * accompanied this code).
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
16 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License version
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
18 * 2 along with this work; if not, write to the Free Software Foundation,
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
20 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
22 * or visit www.oracle.com if you need additional information or have any
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
23 * questions.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
24 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
25 package com.oracle.truffle.api.source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
26
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
27 import java.io.*;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
28 import java.lang.ref.*;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
29 import java.net.*;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
30 import java.util.*;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
31
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
32 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
33 * Representation of a guest language source code unit and its contents. Sources originate in
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
34 * several ways:
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
35 * <ul>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
36 * <li><strong>Literal:</strong> A named text string. These are not indexed and should be considered
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
37 * value objects; equality is defined based on contents. <br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
38 * See {@link Source#fromText(String, String)}</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
39 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
40 * <li><strong>File:</strong> Each file is represented as a canonical object, indexed by the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
41 * absolute, canonical path name of the file. File contents are <em>read lazily</em> and contents
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
42 * optionally <em>cached</em>. <br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
43 * See {@link Source#fromFileName(String)}<br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
44 * See {@link Source#fromFileName(String, boolean)}</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
45 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
46 * <li><strong>URL:</strong> Each URL source is represented as a canonical object, indexed by the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
47 * URL. Contents are <em>read eagerly</em> and <em>cached</em>. <br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
48 * See {@link Source#fromURL(URL, String)}</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
49 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
50 * <li><strong>Reader:</strong> Contents are <em>read eagerly</em> and treated as a <em>Literal</em>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
51 * . <br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
52 * See {@link Source#fromReader(Reader, String)}</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
53 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
54 * <li><strong>Pseudo File:</strong> A literal text string that can be retrieved by name as if it
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
55 * were a file, unlike literal sources; useful for testing. <br>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
56 * See {@link Source#asPseudoFile(String, String)}</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
57 * </ul>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
58 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
59 * <strong>File cache:</strong>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
60 * <ol>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
61 * <li>File content caching is optional, <em>off</em> by default.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
62 * <li>The first access to source file contents will result in the contents being read, and (if
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
63 * enabled) cached.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
64 * <li>If file contents have been cached, access to contents via {@link Source#getInputStream()} or
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
65 * {@link Source#getReader()} will be provided from the cache.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
66 * <li>Any access to file contents via the cache will result in a timestamp check and possible cache
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
67 * reload.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
68 * </ol>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
69 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
70 public abstract class Source {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
71
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
72 // TODO (mlvdv) consider canonicalizing and reusing SourceSection instances
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
73 // TOOD (mlvdv) connect SourceSections into a spatial tree for fast geometric lookup
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
74
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
75 // Files and pseudo files are indexed.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
76 private static final Map<String, WeakReference<Source>> filePathToSource = new HashMap<>();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
77
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
78 private static boolean fileCacheEnabled = true;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
79
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
80 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
81 * Gets the canonical representation of a source file, whose contents will be read lazily and
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
82 * then cached.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
83 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
84 * @param fileName name
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
85 * @param reset forces any existing {@link Source} cache to be cleared, forcing a re-read
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
86 * @return canonical representation of the file's contents.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
87 * @throws IOException if the file can not be read
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
88 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
89 public static Source fromFileName(String fileName, boolean reset) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
90
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
91 final WeakReference<Source> nameRef = filePathToSource.get(fileName);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
92 Source source = nameRef == null ? null : nameRef.get();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
93 if (source == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
94 final File file = new File(fileName);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
95 if (!file.canRead()) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
96 throw new IOException("Can't read file " + fileName);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
97 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
98 final String path = file.getCanonicalPath();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
99 final WeakReference<Source> pathRef = filePathToSource.get(path);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
100 source = pathRef == null ? null : pathRef.get();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
101 if (source == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
102 source = new FileSource(file, fileName, path);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
103 filePathToSource.put(path, new WeakReference<>(source));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
104 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
105 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
106 if (reset) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
107 source.reset();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
108 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
109 return source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
110 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
111
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
112 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
113 * Gets the canonical representation of a source file, whose contents will be read lazily and
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
114 * then cached.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
115 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
116 * @param fileName name
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
117 * @return canonical representation of the file's contents.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
118 * @throws IOException if the file can not be read
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
119 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
120 public static Source fromFileName(String fileName) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
121 return fromFileName(fileName, false);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
122 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
123
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
124 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
125 * Creates a non-canonical source from literal text.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
126 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
127 * @param code textual source code
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
128 * @param description a note about the origin, for error messages and debugging
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
129 * @return a newly created, non-indexed source representation
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
130 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
131 public static Source fromText(String code, String description) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
132 assert code != null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
133 return new LiteralSource(description, code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
134 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
135
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
136 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
137 * Creates a source whose contents will be read immediately from a URL and cached.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
138 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
139 * @param url
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
140 * @param name identifies the origin, possibly useful for debugging
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
141 * @return a newly created, non-indexed source representation
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
142 * @throws IOException if reading fails
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
143 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
144 public static Source fromURL(URL url, String name) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
145 return URLSource.get(url, name);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
146 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
147
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
148 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
149 * Creates a source whose contents will be read immediately and cached.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
150 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
151 * @param reader
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
152 * @param description a note about the origin, possibly useful for debugging
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
153 * @return a newly created, non-indexed source representation
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
154 * @throws IOException if reading fails
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
155 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
156 public static Source fromReader(Reader reader, String description) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
157 return new LiteralSource(description, read(reader));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
158 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
159
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
160 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
161 * Creates a source from literal text, but which acts as a file and can be retrieved by name
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
162 * (unlike other literal sources); intended for testing.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
163 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
164 * @param code textual source code
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
165 * @param pseudoFileName string to use for indexing/lookup
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
166 * @return a newly created, source representation, canonical with respect to its name
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
167 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
168 public static Source asPseudoFile(String code, String pseudoFileName) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
169 final Source source = new LiteralSource(pseudoFileName, code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
170 filePathToSource.put(pseudoFileName, new WeakReference<>(source));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
171 return source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
172 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
173
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
174 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
175 * Enables/disables caching of file contents, <em>disabled</em> by default. Caching of sources
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
176 * created from literal text or readers is always enabled.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
177 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
178 public static void setFileCaching(boolean enabled) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
179 fileCacheEnabled = enabled;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
180 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
181
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
182 private static String read(Reader reader) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
183 final StringBuilder builder = new StringBuilder();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
184 final char[] buffer = new char[1024];
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
185
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
186 while (true) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
187 final int n = reader.read(buffer);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
188 if (n == -1) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
189 break;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
190 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
191 builder.append(buffer, 0, n);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
192 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
193
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
194 return builder.toString();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
195 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
196
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
197 Source() {
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
198 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
199
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
200 private TextMap textMap = null;
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
201
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
202 protected abstract void reset();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
203
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
204 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
205 * Returns the name of this resource holding a guest language program. An example would be the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
206 * name of a guest language source code file.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
207 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
208 * @return the name of the guest language program
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
209 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
210 public abstract String getName();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
211
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
212 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
213 * Returns a short version of the name of the resource holding a guest language program (as
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
214 * described in @getName). For example, this could be just the name of the file, rather than a
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
215 * full path.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
216 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
217 * @return the short name of the guest language program
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
218 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
219 public abstract String getShortName();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
220
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
221 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
222 * The normalized, canonical name if the source is a file.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
223 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
224 public abstract String getPath();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
225
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
226 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
227 * The URL if the source is retrieved via URL.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
228 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
229 public abstract URL getURL();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
230
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
231 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
232 * Access to the source contents.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
233 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
234 public abstract Reader getReader();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
235
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
236 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
237 * Access to the source contents.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
238 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
239 public final InputStream getInputStream() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
240 return new ByteArrayInputStream(getCode().getBytes());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
241 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
242
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
243 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
244 * Return the complete text of the code.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
245 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
246 public abstract String getCode();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
247
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
248 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
249 * Gets the text (not including a possible terminating newline) in a (1-based) numbered line.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
250 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
251 public final String getCode(int lineNumber) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
252 checkTextMap();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
253 final int offset = textMap.lineStartOffset(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
254 final int length = textMap.lineLength(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
255 return getCode().substring(offset, offset + length);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
256 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
257
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
258 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
259 * The number of text lines in the source, including empty lines; characters at the end of the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
260 * source without a terminating newline count as a line.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
261 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
262 public final int getLineCount() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
263 return checkTextMap().lineCount();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
264 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
265
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
266 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
267 * Given a 0-based character offset, return the 1-based number of the line that includes the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
268 * position.
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
269 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
270 * @throws IllegalArgumentException if the offset is outside the text contents
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
271 */
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
272 public final int getLineNumber(int offset) throws IllegalArgumentException {
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
273 return checkTextMap().offsetToLine(offset);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
274 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
275
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
276 /**
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
277 * Given a 0-based character offset, return the 1-based number of the column at the position.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
278 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
279 * @throws IllegalArgumentException if the offset is outside the text contents
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
280 */
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
281 public final int getColumnNumber(int offset) throws IllegalArgumentException {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
282 return checkTextMap().offsetToCol(offset);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
283 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
284
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
285 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
286 * Given a 1-based line number, return the 0-based offset of the first character in the line.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
287 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
288 * @throws IllegalArgumentException if there is no such line in the text
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
289 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
290 public final int getLineStartOffset(int lineNumber) throws IllegalArgumentException {
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
291 return checkTextMap().lineStartOffset(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
292 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
293
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
294 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
295 * The number of characters (not counting a possible terminating newline) in a (1-based)
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
296 * numbered line.
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
297 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
298 * @throws IllegalArgumentException if there is no such line in the text
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
299 */
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
300 public final int getLineLength(int lineNumber) throws IllegalArgumentException {
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
301 return checkTextMap().lineLength(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
302 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
303
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
304 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
305 * Creates a representation of a contiguous region of text in the source.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
306 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
307 * This method performs no checks on the validity of the arguments.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
308 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
309 * The resulting representation defines hash/equality around equivalent location, presuming that
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
310 * {@link Source} representations are canonical.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
311 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
312 * @param identifier terse description of the region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
313 * @param startLine 1-based line number of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
314 * @param startColumn 1-based column number of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
315 * @param charIndex the 0-based index of the first character of the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
316 * @param length the number of characters in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
317 * @return newly created object representing the specified region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
318 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
319 public final SourceSection createSection(String identifier, int startLine, int startColumn, int charIndex, int length) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
320 return new DefaultSourceSection(this, identifier, startLine, startColumn, charIndex, length);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
321 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
322
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
323 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
324 * Creates a representation of a contiguous region of text in the source. Computes the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
325 * {@code charIndex} value by building a {@linkplain TextMap map} of lines in the source.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
326 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
327 * Checks the position arguments for consistency with the source.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
328 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
329 * The resulting representation defines hash/equality around equivalent location, presuming that
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
330 * {@link Source} representations are canonical.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
331 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
332 * @param identifier terse description of the region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
333 * @param startLine 1-based line number of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
334 * @param startColumn 1-based column number of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
335 * @param length the number of characters in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
336 * @return newly created object representing the specified region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
337 * @throws IllegalArgumentException if arguments are outside the text of the source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
338 * @throws IllegalStateException if the source is one of the "null" instances
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
339 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
340 public final SourceSection createSection(String identifier, int startLine, int startColumn, int length) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
341 checkTextMap();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
342 final int lineStartOffset = textMap.lineStartOffset(startLine);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
343 if (startColumn > textMap.lineLength(startLine)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
344 throw new IllegalArgumentException("column out of range");
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
345 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
346 final int startOffset = lineStartOffset + startColumn - 1;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
347 return new DefaultSourceSection(this, identifier, startLine, startColumn, startOffset, length);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
348 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
349
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
350 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
351 * Creates a representation of a contiguous region of text in the source. Computes the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
352 * {@code (startLine, startColumn)} values by building a {@linkplain TextMap map} of lines in
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
353 * the source.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
354 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
355 * Checks the position arguments for consistency with the source.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
356 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
357 * The resulting representation defines hash/equality around equivalent location, presuming that
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
358 * {@link Source} representations are canonical.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
359 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
360 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
361 * @param identifier terse description of the region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
362 * @param charIndex 0-based position of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
363 * @param length the number of characters in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
364 * @return newly created object representing the specified region
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
365 * @throws IllegalArgumentException if either of the arguments are outside the text of the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
366 * source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
367 * @throws IllegalStateException if the source is one of the "null" instances
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
368 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
369 public final SourceSection createSection(String identifier, int charIndex, int length) throws IllegalArgumentException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
370 final int codeLength = getCode().length();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
371 if (!(charIndex >= 0 && length >= 0 && charIndex + length <= codeLength)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
372 throw new IllegalArgumentException("text positions out of range");
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
373 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
374 checkTextMap();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
375 final int startLine = getLineNumber(charIndex);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
376 final int startColumn = charIndex - getLineStartOffset(startLine) + 1;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
377
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
378 return new DefaultSourceSection(this, identifier, startLine, startColumn, charIndex, length);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
379 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
380
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
381 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
382 * Creates a representation of a line of text in the source identified only by line number, from
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
383 * which the character information will be computed.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
384 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
385 * @param identifier terse description of the line
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
386 * @param lineNumber 1-based line number of the first character in the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
387 * @return newly created object representing the specified line
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
388 * @throws IllegalArgumentException if the line does not exist the source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
389 * @throws IllegalStateException if the source is one of the "null" instances
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
390 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
391 public final SourceSection createSection(String identifier, int lineNumber) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
392 checkTextMap();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
393 final int charIndex = textMap.lineStartOffset(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
394 final int length = textMap.lineLength(lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
395 return createSection(identifier, charIndex, length);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
396 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
397
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
398 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
399 * Creates a representation of a line number in this source, suitable for use as a hash table
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
400 * key with equality defined to mean equivalent location.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
401 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
402 * @param lineNumber a 1-based line number in this source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
403 * @return a representation of a line in this source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
404 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
405 public final LineLocation createLineLocation(int lineNumber) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
406 return new LineLocationImpl(this, lineNumber);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
407 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
408
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
409 private TextMap checkTextMap() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
410 if (textMap == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
411 final String code = getCode();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
412 if (code == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
413 throw new RuntimeException("can't read file " + getName());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
414 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
415 textMap = new TextMap(code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
416 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
417 return textMap;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
418 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
419
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
420 private static final class LiteralSource extends Source {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
421
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
422 private final String name; // Name used originally to describe the source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
423 private final String code;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
424
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
425 public LiteralSource(String name, String code) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
426 this.name = name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
427 this.code = code;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
428 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
429
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
430 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
431 public String getName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
432 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
433 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
434
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
435 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
436 public String getShortName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
437 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
438 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
439
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
440 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
441 public String getCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
442 return code;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
443 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
444
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
445 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
446 public String getPath() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
447 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
448 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
449
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
450 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
451 public URL getURL() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
452 return null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
453 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
454
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
455 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
456 public Reader getReader() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
457 return new StringReader(code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
458 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
459
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
460 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
461 protected void reset() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
462 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
463
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
464 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
465 public int hashCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
466 final int prime = 31;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
467 int result = 1;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
468 result = prime * result + name.hashCode();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
469 result = prime * result + (code == null ? 0 : code.hashCode());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
470 return result;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
471 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
472
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
473 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
474 public boolean equals(Object obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
475 if (this == obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
476 return true;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
477 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
478 if (obj == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
479 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
480 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
481 if (!(obj instanceof LiteralSource)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
482 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
483 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
484 LiteralSource other = (LiteralSource) obj;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
485 return name.equals(other.name) && code.equals(other.code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
486 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
487
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
488 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
489
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
490 private static final class FileSource extends Source {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
491
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
492 private final File file;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
493 private final String name; // Name used originally to describe the source
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
494 private final String path; // Normalized path description of an actual file
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
495
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
496 private String code = null; // A cache of the file's contents
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
497 private long timeStamp; // timestamp of the cache in the file system
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
498
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
499 public FileSource(File file, String name, String path) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
500 this.file = file;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
501 this.name = name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
502 this.path = path;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
503 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
504
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
505 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
506 public String getName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
507 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
508 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
509
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
510 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
511 public String getShortName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
512 return file.getName();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
513 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
514
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
515 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
516 public String getCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
517 if (fileCacheEnabled) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
518 if (code == null || timeStamp != file.lastModified()) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
519 try {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
520 code = read(getReader());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
521 timeStamp = file.lastModified();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
522 } catch (IOException e) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
523 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
524 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
525 return code;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
526 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
527 try {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
528 return read(new FileReader(file));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
529 } catch (IOException e) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
530 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
531 return null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
532 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
533
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
534 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
535 public String getPath() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
536 return path;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
537 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
538
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
539 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
540 public URL getURL() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
541 return null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
542 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
543
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
544 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
545 public Reader getReader() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
546 if (code != null && timeStamp == file.lastModified()) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
547 return new StringReader(code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
548 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
549 try {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
550 return new FileReader(file);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
551 } catch (FileNotFoundException e) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
552 throw new RuntimeException("Can't find file " + path);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
553 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
554 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
555
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
556 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
557 protected void reset() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
558 this.code = null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
559 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
560
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
561 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
562
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
563 private static final class URLSource extends Source {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
564
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
565 private static final Map<URL, WeakReference<URLSource>> urlToSource = new HashMap<>();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
566
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
567 public static URLSource get(URL url, String name) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
568 WeakReference<URLSource> sourceRef = urlToSource.get(url);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
569 URLSource source = sourceRef == null ? null : sourceRef.get();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
570 if (source == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
571 source = new URLSource(url, name);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
572 urlToSource.put(url, new WeakReference<>(source));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
573 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
574 return source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
575 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
576
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
577 private final URL url;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
578 private final String name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
579 private String code = null; // A cache of the source contents
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
580
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
581 public URLSource(URL url, String name) throws IOException {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
582 this.url = url;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
583 this.name = name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
584 code = read(new InputStreamReader(url.openStream()));
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
585 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
586
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
587 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
588 public String getName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
589 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
590 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
591
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
592 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
593 public String getShortName() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
594 return name;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
595 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
596
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
597 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
598 public String getPath() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
599 return url.getPath();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
600 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
601
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
602 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
603 public URL getURL() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
604 return url;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
605 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
606
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
607 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
608 public Reader getReader() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
609 return new StringReader(code);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
610 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
611
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
612 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
613 public String getCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
614 return code;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
615 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
616
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
617 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
618 protected void reset() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
619 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
620
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
621 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
622
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
623 private static final class DefaultSourceSection implements SourceSection {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
624
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
625 private final Source source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
626 private final String identifier;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
627 private final int startLine;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
628 private final int startColumn;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
629 private final int charIndex;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
630 private final int charLength;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
631
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
632 /**
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
633 * Creates a new object representing a contiguous text section within the source code of a
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
634 * guest language program's text.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
635 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
636 * The starting location of the section is specified using two different coordinate:
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
637 * <ul>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
638 * <li><b>(row, column)</b>: rows and columns are 1-based, so the first character in a
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
639 * source file is at position {@code (1,1)}.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
640 * <li><b>character index</b>: 0-based offset of the character from the beginning of the
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
641 * source, so the first character in a file is at index {@code 0}.</li>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
642 * </ul>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
643 * The <b>newline</b> that terminates each line counts as a single character for the purpose
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
644 * of a character index. The (row,column) coordinates of a newline character should never
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
645 * appear in a text section.
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
646 * <p>
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
647 *
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
648 * @param source object representing the complete source program that contains this section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
649 * @param identifier an identifier used when printing the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
650 * @param startLine the 1-based number of the start line of the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
651 * @param startColumn the 1-based number of the start column of the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
652 * @param charIndex the 0-based index of the first character of the section
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
653 * @param charLength the length of the section in number of characters
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
654 */
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
655 public DefaultSourceSection(Source source, String identifier, int startLine, int startColumn, int charIndex, int charLength) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
656 this.source = source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
657 this.identifier = identifier;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
658 this.startLine = startLine;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
659 this.startColumn = startColumn;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
660 this.charIndex = charIndex;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
661 this.charLength = charLength;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
662 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
663
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
664 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
665 public final Source getSource() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
666 return source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
667 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
668
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
669 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
670 public final int getStartLine() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
671 return startLine;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
672 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
673
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
674 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
675 public final LineLocation getLineLocation() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
676 return source.createLineLocation(startLine);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
677 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
678
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
679 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
680 public final int getStartColumn() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
681 return startColumn;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
682 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
683
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
684 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
685 public final int getCharIndex() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
686 return charIndex;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
687 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
688
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
689 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
690 public final int getCharLength() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
691 return charLength;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
692 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
693
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
694 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
695 public final int getCharEndIndex() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
696 return charIndex + charLength;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
697 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
698
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
699 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
700 public final String getIdentifier() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
701 return identifier;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
702 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
703
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
704 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
705 public final String getCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
706 return getSource().getCode().substring(charIndex, charIndex + charLength);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
707 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
708
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
709 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
710 public final String getShortDescription() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
711 return String.format("%s:%d", source.getShortName(), startLine);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
712 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
713
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
714 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
715 public String toString() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
716 return String.format("%s:%d", source.getName(), startLine);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
717 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
718
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
719 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
720 public int hashCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
721 final int prime = 31;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
722 int result = 1;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
723 result = prime * result + charIndex;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
724 result = prime * result + charLength;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
725 result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
726 result = prime * result + ((source == null) ? 0 : source.hashCode());
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
727 result = prime * result + startColumn;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
728 result = prime * result + startLine;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
729 return result;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
730 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
731
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
732 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
733 public boolean equals(Object obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
734 if (this == obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
735 return true;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
736 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
737 if (obj == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
738 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
739 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
740 if (!(obj instanceof DefaultSourceSection)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
741 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
742 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
743 DefaultSourceSection other = (DefaultSourceSection) obj;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
744 if (charIndex != other.charIndex) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
745 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
746 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
747 if (charLength != other.charLength) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
748 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
749 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
750 if (identifier == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
751 if (other.identifier != null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
752 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
753 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
754 } else if (!identifier.equals(other.identifier)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
755 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
756 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
757 if (source == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
758 if (other.source != null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
759 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
760 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
761 } else if (!source.equals(other.source)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
762 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
763 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
764 if (startColumn != other.startColumn) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
765 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
766 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
767 if (startLine != other.startLine) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
768 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
769 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
770 return true;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
771 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
772
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
773 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
774
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
775 private static final class LineLocationImpl implements LineLocation {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
776 private final Source source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
777 private final int line;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
778
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
779 public LineLocationImpl(Source source, int line) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
780 assert source != null;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
781 this.source = source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
782 this.line = line;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
783 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
784
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
785 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
786 public Source getSource() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
787 return source;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
788 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
789
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
790 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
791 public int getLineNumber() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
792 return line;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
793 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
794
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
795 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
796 public String toString() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
797 return "SourceLine [" + source.getName() + ", " + line + "]";
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
798 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
799
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
800 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
801 public int hashCode() {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
802 final int prime = 31;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
803 int result = 1;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
804 result = prime * result + line;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
805 result = prime * result + source.hashCode();
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
806 return result;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
807 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
808
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
809 @Override
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
810 public boolean equals(Object obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
811 if (this == obj) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
812 return true;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
813 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
814 if (obj == null) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
815 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
816 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
817 if (!(obj instanceof LineLocationImpl)) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
818 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
819 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
820 LineLocationImpl other = (LineLocationImpl) obj;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
821 if (line != other.line) {
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
822 return false;
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
823 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
824 return source.equals(other.source);
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
825 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
826
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
827 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
828
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
829 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
830 * A utility for converting between coordinate systems in a string of text interspersed with
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
831 * newline characters. The coordinate systems are:
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
832 * <ul>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
833 * <li>0-based character offset from the beginning of the text, where newline characters count
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
834 * as a single character and the first character in the text occupies position 0.</li>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
835 * <li>1-based position in the 2D space of lines and columns, in which the first position in the
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
836 * text is at (1,1).</li>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
837 * </ul>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
838 * <p>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
839 * This utility is based on positions occupied by characters, not text stream positions as in a
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
840 * text editor. The distinction shows up in editors where you can put the cursor just past the
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
841 * last character in a buffer; this is necessary, among other reasons, so that you can put the
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
842 * edit cursor in a new (empty) buffer. For the purposes of this utility, however, there are no
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
843 * character positions in an empty text string and there are no lines in an empty text string.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
844 * <p>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
845 * A newline character designates the end of a line and occupies a column position.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
846 * <p>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
847 * If the text ends with a character other than a newline, then the characters following the
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
848 * final newline character count as a line, even though not newline-terminated.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
849 * <p>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
850 * <strong>Limitations:</strong>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
851 * <ul>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
852 * <li>Does not handle multiple character encodings correctly.</li>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
853 * <li>Treats tabs as occupying 1 column.</li>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
854 * <li>Does not handle multiple-character line termination sequences correctly.</li>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
855 * </ul>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
856 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
857 private static final class TextMap {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
858
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
859 // 0-based offsets of newline characters in the text, with sentinel
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
860 private final int[] nlOffsets;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
861
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
862 // The number of characters in the text, including newlines (which count as 1).
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
863 private final int textLength;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
864
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
865 // Is the final text character a newline?
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
866 final boolean finalNL;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
867
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
868 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
869 * Constructs map permitting translation between 0-based character offsets and 1-based
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
870 * lines/columns.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
871 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
872 public TextMap(String text) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
873 this.textLength = text.length();
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
874 final ArrayList<Integer> lines = new ArrayList<>();
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
875 lines.add(0);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
876 int offset = 0;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
877
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
878 while (offset < text.length()) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
879 final int nlIndex = text.indexOf('\n', offset);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
880 if (nlIndex >= 0) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
881 offset = nlIndex + 1;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
882 lines.add(offset);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
883 } else {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
884 break;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
885 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
886 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
887 lines.add(Integer.MAX_VALUE);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
888
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
889 nlOffsets = new int[lines.size()];
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
890 for (int line = 0; line < lines.size(); line++) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
891 nlOffsets[line] = lines.get(line);
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
892 }
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
893
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
894 finalNL = textLength > 0 && (textLength == nlOffsets[nlOffsets.length - 2]);
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
895 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
896
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
897 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
898 * Converts 0-based character offset to 1-based number of the line containing the character.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
899 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
900 * @throws IllegalArgumentException if the offset is outside the string.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
901 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
902 public int offsetToLine(int offset) throws IllegalArgumentException {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
903 if (offset < 0 || offset >= textLength) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
904 throw new IllegalArgumentException("offset out of bounds");
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
905 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
906 int line = 1;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
907 while (offset >= nlOffsets[line]) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
908 line++;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
909 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
910 return line;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
911 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
912
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
913 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
914 * Converts 0-based character offset to 1-based number of the column occupied by the
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
915 * character.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
916 * <p>
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
917 * Tabs are not expanded; they occupy 1 column.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
918 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
919 * @throws IllegalArgumentException if the offset is outside the string.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
920 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
921 public int offsetToCol(int offset) throws IllegalArgumentException {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
922 return 1 + offset - nlOffsets[offsetToLine(offset) - 1];
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
923 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
924
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
925 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
926 * The number of lines in the text; if characters appear after the final newline, then they
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
927 * also count as a line, even though not newline-terminated.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
928 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
929 public int lineCount() {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
930 if (textLength == 0) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
931 return 0;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
932 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
933 return finalNL ? nlOffsets.length - 2 : nlOffsets.length - 1;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
934 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
935
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
936 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
937 * Converts 1-based line number to the 0-based offset of the line's first character; this
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
938 * would be the offset of a newline if the line is empty.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
939 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
940 * @throws IllegalArgumentException if there is no such line in the text.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
941 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
942 public int lineStartOffset(int line) throws IllegalArgumentException {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
943 if (textLength == 0 || lineOutOfRange(line)) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
944 throw new IllegalArgumentException("line out of bounds");
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
945 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
946 return nlOffsets[line - 1];
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
947 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
948
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
949 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
950 * Gets the number of characters in a line, identified by 1-based line number;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
951 * <em>does not</em> include the final newline, if any.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
952 *
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
953 * @throws IllegalArgumentException if there is no such line in the text.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
954 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
955 public int lineLength(int line) throws IllegalArgumentException {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
956 if (textLength == 0 || lineOutOfRange(line)) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
957 throw new IllegalArgumentException("line out of bounds");
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
958 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
959 if (line == nlOffsets.length - 1 && !finalNL) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
960 return textLength - nlOffsets[line - 1];
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
961 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
962 return (nlOffsets[line] - nlOffsets[line - 1]) - 1;
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
963
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
964 }
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
965
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
966 /**
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
967 * Is the line number out of range.
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
968 */
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
969 private boolean lineOutOfRange(int line) {
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
970 return line <= 0 || line >= nlOffsets.length || (line == nlOffsets.length - 1 && finalNL);
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
971 }
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
972
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
973 }
16130
6f7d3f3703d3 Truffle/Source:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 16068
diff changeset
974
16068
74e142bd2b12 Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents:
diff changeset
975 }