OuterWrap.java revision 3170:dc017a37aac5
1/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package jdk.jshell;
27
28import jdk.jshell.Wrap.CompoundWrap;
29import static jdk.jshell.Util.*;
30import java.util.Locale;
31import javax.tools.Diagnostic;
32import javax.tools.JavaFileObject;
33import jdk.jshell.MemoryFileManager.SourceMemoryJavaFileObject;
34
35/**
36 *
37 * @author Robert Field
38 */
39final class OuterWrap implements GeneralWrap {
40
41    private final String packageName;
42    private final String className;
43    private final String userSource;
44    private final GeneralWrap w;
45    private final Wrap guts;
46
47    public static OuterWrap wrapInClass(String packageName, String className,
48             String imports, String userSource, Wrap guts) {
49        GeneralWrap kw = new CompoundWrap(
50                imports
51                + "class " + className + " {\n",
52                guts,
53                "}\n");
54        return new OuterWrap(packageName, className, userSource, kw, guts);
55    }
56
57    public static OuterWrap wrapImport(String userSource, Wrap guts) {
58        return new OuterWrap("", "", userSource, guts, guts);
59    }
60
61    private OuterWrap(String packageName, String className, String userSource,
62            GeneralWrap w, Wrap guts) {
63        this.packageName = packageName;
64        this.className = className;
65        this.userSource = userSource;
66        this.w = w;
67        this.guts = guts;
68    }
69
70    @Override
71    public final String wrapped() {
72        return w.wrapped();
73    }
74
75    @Override
76    public int snippetIndexToWrapIndex(int ui) {
77        return w.snippetIndexToWrapIndex(ui);
78    }
79
80    @Override
81    public int wrapIndexToSnippetIndex(int si) {
82        return w.wrapIndexToSnippetIndex(si);
83    }
84
85    @Override
86    public int firstSnippetIndex() {
87        return w.firstSnippetIndex();
88    }
89
90    @Override
91    public int lastSnippetIndex() {
92        return w.lastSnippetIndex();
93    }
94
95    @Override
96    public int snippetLineToWrapLine(int snline) {
97        return w.snippetLineToWrapLine(snline);
98    }
99
100    @Override
101    public int wrapLineToSnippetLine(int wline) {
102        return w.wrapLineToSnippetLine(wline);
103    }
104
105    @Override
106    public int firstSnippetLine() {
107        return w.firstSnippetLine();
108    }
109
110    @Override
111    public int lastSnippetLine() {
112        return w.lastSnippetLine();
113    }
114
115    public String className() {
116        return className;
117    }
118
119    public String classFullName() {
120        return packageName + "." + className;
121    }
122
123    public String getUserSource() {
124        return userSource;
125    }
126
127    Wrap guts() {
128        return guts;
129    }
130
131    Diag wrapDiag(Diagnostic<? extends JavaFileObject> d) {
132        return new WrappedDiagnostic(d);
133    }
134
135    class WrappedDiagnostic extends Diag {
136
137        private final Diagnostic<? extends JavaFileObject> diag;
138
139        WrappedDiagnostic(Diagnostic<? extends JavaFileObject> diag) {
140            this.diag = diag;
141        }
142
143        @Override
144        public boolean isError() {
145            return diag.getKind() == Diagnostic.Kind.ERROR;
146        }
147
148        @Override
149        public long getPosition() {
150            return wrapIndexToSnippetIndex(diag.getPosition());
151        }
152
153        @Override
154        public long getStartPosition() {
155            return wrapIndexToSnippetIndex(diag.getStartPosition());
156        }
157
158        @Override
159        public long getEndPosition() {
160            return wrapIndexToSnippetIndex(diag.getEndPosition());
161        }
162
163        @Override
164        public String getCode() {
165            return diag.getCode();
166        }
167
168        @Override
169        public String getMessage(Locale locale) {
170            return expunge(diag.getMessage(locale));
171        }
172
173        @Override
174        Unit unitOrNull() {
175            JavaFileObject fo = diag.getSource();
176            if (fo instanceof SourceMemoryJavaFileObject) {
177                SourceMemoryJavaFileObject sfo = (SourceMemoryJavaFileObject) fo;
178                if (sfo.getOrigin() instanceof Unit) {
179                    return (Unit) sfo.getOrigin();
180                }
181            }
182            return null;
183        }
184
185    @Override
186    public String toString() {
187        return "WrappedDiagnostic(" + getMessage(null) + ":" + getPosition() + ")";
188    }
189    }
190}
191