forked from eclipse-xpect/Xpect
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXpectFileAccess.java
More file actions
132 lines (118 loc) · 4.81 KB
/
Copy pathXpectFileAccess.java
File metadata and controls
132 lines (118 loc) · 4.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*******************************************************************************
* Copyright (c) 2012-2017 TypeFox GmbH and itemis AG.
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Moritz Eysholdt - Initial contribution and API
*******************************************************************************/
package org.eclipse.xpect.ui.util;
import java.io.IOException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.resource.ClassloaderClasspathUriResolver;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceFactory;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.util.StringInputStream;
import org.osgi.framework.Bundle;
import org.eclipse.xpect.XpectConstants;
import org.eclipse.xpect.XpectFile;
import org.eclipse.xpect.registry.ILanguageInfo;
import org.eclipse.xpect.runner.XpectRunner;
import org.eclipse.xpect.runner.XpectTestGlobalState;
import com.google.inject.Injector;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
public class XpectFileAccess {
private static class XpectResourceAdapter extends AdapterImpl {
private final XtextResource resource;
public XpectResourceAdapter(XtextResource resource) {
super();
this.resource = resource;
}
}
public static ClassLoader getXpectLibClassLoader() {
Bundle lib = Platform.getBundle("org.eclipse.xpect.xtext.lib");
if (lib != null) {
try {
Class<?> cls = lib.loadClass("org.eclipse.xpect.xtext.lib.tests.XtextTests");
ClassLoader loader = cls.getClassLoader();
return loader;
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
return null;
}
protected static ResourceSet cloneResourceSet(ResourceSet rs) {
XtextResourceSet result = new XtextResourceSet();
result.setPackageRegistry(rs.getPackageRegistry());
// need delegation or nothing because of "java" protocol
// result.setResourceFactoryRegistry(rs.getResourceFactoryRegistry());
result.setURIConverter(rs.getURIConverter());
if (XpectTestGlobalState.INSTANCE.testClass() != null) {
result.setClasspathURIContext(XpectTestGlobalState.INSTANCE.testClass().getClassLoader());
result.setClasspathUriResolver(new ClassloaderClasspathUriResolver());
} else if (rs instanceof XtextResourceSet) {
XtextResourceSet xrs = (XtextResourceSet) rs;
Object context = xrs.getClasspathURIContext();
if (context != null) {
result.setClasspathURIContext(context);
result.setClasspathUriResolver(xrs.getClasspathUriResolver());
} else {
result.setClasspathURIContext(getXpectLibClassLoader());
result.setClasspathUriResolver(new ClassloaderClasspathUriResolver());
}
}
return result;
}
private static XpectFile findXpectFile(Resource xpectResource) {
for (EObject contents : xpectResource.getContents())
if (contents instanceof XpectFile)
return (XpectFile) contents;
return null;
}
public static XpectFile getXpectFile(Resource resource) {
for (EObject contents : resource.getContents())
if (contents instanceof XpectFile)
return (XpectFile) contents;
return findXpectFile(getXpectResource(resource));
}
public static XtextResource getXpectResource(Resource resource) {
for (EObject contents : resource.getContents())
if (contents instanceof XpectFile)
return (XtextResource) resource;
String document = ((XtextResource) resource).getParseResult().getRootNode().getText();
for (Adapter a : resource.eAdapters())
if (a instanceof XpectResourceAdapter) {
XtextResource xpectResource = ((XpectResourceAdapter) a).resource;
if (!xpectResource.getParseResult().getRootNode().getText().equals(document))
load(xpectResource, document);
return xpectResource;
}
ResourceSet rs = cloneResourceSet(resource.getResourceSet());
Injector injector = ILanguageInfo.Registry.INSTANCE.getLanguageByFileExtension(XpectConstants.XPECT_FILE_EXT).getInjector();
XtextResource xpectResource = (XtextResource) injector.getInstance(XtextResourceFactory.class).createResource(resource.getURI());
rs.getResources().add(xpectResource);
load(xpectResource, document);
resource.eAdapters().add(new XpectResourceAdapter(xpectResource));
return xpectResource;
}
private static void load(Resource xpectResource, String document) {
try {
xpectResource.unload();
xpectResource.load(new StringInputStream(document), null);
} catch (IOException e) {
e.printStackTrace();
}
}
}