Skip to content

Commit d485f90

Browse files
committed
ti: improve ITypeInferenceExtensionFactory API
1 parent 29efdb1 commit d485f90

File tree

9 files changed

+76
-35
lines changed

9 files changed

+76
-35
lines changed

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/ITypeInferenceContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313

1414
import java.util.Set;
1515

16+
import org.eclipse.core.runtime.IAdaptable;
1617
import org.eclipse.dltk.javascript.typeinference.IValueCollection;
1718
import org.eclipse.dltk.javascript.typeinfo.IModelBuilder;
1819
import org.eclipse.dltk.javascript.typeinfo.IRMember;
1920
import org.eclipse.dltk.javascript.typeinfo.ITypeInfoContext;
2021
import org.eclipse.dltk.javascript.typeinfo.ITypeProvider;
2122
import org.eclipse.dltk.javascript.typeinfo.TypeMode;
2223

23-
public interface ITypeInferenceContext extends ITypeInfoContext {
24+
public interface ITypeInferenceContext extends ITypeInfoContext, IAdaptable {
2425

2526
@Deprecated
2627
IValueTypeFactory getFactory();

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencer2.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.eclipse.dltk.javascript.typeinfo.IMemberEvaluator;
3838
import org.eclipse.dltk.javascript.typeinfo.IModelBuilder;
3939
import org.eclipse.dltk.javascript.typeinfo.IRMember;
40+
import org.eclipse.dltk.javascript.typeinfo.ITypeInfoContext;
4041
import org.eclipse.dltk.javascript.typeinfo.ITypeProvider;
4142
import org.eclipse.dltk.javascript.typeinfo.ITypeSystem;
4243
import org.eclipse.dltk.javascript.typeinfo.ReferenceSource;
@@ -516,4 +517,14 @@ public String toString() {
516517
+ (v != null ? v.getClass().getSimpleName() : null) + ")";
517518
}
518519

520+
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
521+
if (adapter == ITypeInfoContext.class || adapter == ITypeSystem.class) {
522+
return this;
523+
} else if (adapter == ReferenceSource.class) {
524+
return getSource();
525+
} else {
526+
return null;
527+
}
528+
}
529+
519530
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitorBase.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.eclipse.dltk.javascript.typeinference.IValueCollection;
2626
import org.eclipse.dltk.javascript.typeinference.IValueReference;
2727
import org.eclipse.dltk.javascript.typeinfo.ITypeChecker;
28-
import org.eclipse.dltk.javascript.typeinfo.ITypeInferenceExtensionFactory;
2928
import org.eclipse.dltk.javascript.typeinfo.ITypeInferenceHandler;
3029
import org.eclipse.dltk.javascript.typeinfo.ITypeInferenceHandlerFactory;
3130
import org.eclipse.dltk.javascript.typeinfo.ITypeInferencerVisitor;
@@ -107,22 +106,6 @@ protected List<ITypeInferenceHandler> createHandlers() {
107106
return handlers;
108107
}
109108

110-
@SuppressWarnings("unchecked")
111-
protected <E> List<E> createExtensions(Class<E> extensionClass) {
112-
final List<E> extensions = new ArrayList<E>();
113-
for (ITypeInferenceHandlerFactory factory : TypeInfoManager
114-
.getNodeHandlerFactories()) {
115-
if (factory instanceof ITypeInferenceExtensionFactory) {
116-
final Object extension = ((ITypeInferenceExtensionFactory) factory)
117-
.createExtension(context, this, extensionClass);
118-
if (extension != null && extensionClass.isInstance(extension)) {
119-
extensions.add((E) extension);
120-
}
121-
}
122-
}
123-
return extensions;
124-
}
125-
126109
@Override
127110
public IValueReference visit(ASTNode node) {
128111
if (handlers != null) {

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
import org.eclipse.dltk.javascript.typeinfo.MemberPredicates;
102102
import org.eclipse.dltk.javascript.typeinfo.RTypes;
103103
import org.eclipse.dltk.javascript.typeinfo.TypeCompatibility;
104+
import org.eclipse.dltk.javascript.typeinfo.TypeInfoManager;
104105
import org.eclipse.dltk.javascript.typeinfo.TypeUtil;
105106
import org.eclipse.dltk.javascript.typeinfo.model.Member;
106107
import org.eclipse.dltk.javascript.typeinfo.model.ParameterKind;
@@ -534,7 +535,8 @@ public void initialize() {
534535
variables.clear();
535536
functionScopes.clear();
536537
functionScopes.add(new FunctionScope());
537-
final List<IValidatorExtension> extensions = createExtensions(IValidatorExtension.class);
538+
final List<IValidatorExtension> extensions = TypeInfoManager
539+
.createExtensions(context, IValidatorExtension.class, null);
538540
if (!extensions.isEmpty()) {
539541
this.extensions = extensions
540542
.toArray(new IValidatorExtension[extensions.size()]);

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/CompletionVisitor.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
*******************************************************************************/
1212
package org.eclipse.dltk.javascript.internal.core.codeassist;
1313

14-
import java.util.List;
1514
import java.util.Stack;
1615

1716
import org.eclipse.dltk.ast.ASTNode;
@@ -21,7 +20,6 @@
2120
import org.eclipse.dltk.javascript.ast.FunctionStatement;
2221
import org.eclipse.dltk.javascript.typeinference.IValueCollection;
2322
import org.eclipse.dltk.javascript.typeinference.IValueReference;
24-
import org.eclipse.dltk.javascript.validation.IValidatorExtension;
2523

2624
public class CompletionVisitor extends TypeInferencerVisitor {
2725

@@ -94,8 +92,4 @@ public IValueCollection getCollection() {
9492
return super.getCollection();
9593
}
9694

97-
public List<IValidatorExtension> createValidatorExtensions() {
98-
return createExtensions(IValidatorExtension.class);
99-
}
100-
10195
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/JavaScriptCompletionEngine2.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.eclipse.dltk.javascript.typeinfo.MemberPredicate;
6767
import org.eclipse.dltk.javascript.typeinfo.MemberPredicates;
6868
import org.eclipse.dltk.javascript.typeinfo.RTypeMemberQuery;
69+
import org.eclipse.dltk.javascript.typeinfo.TypeInfoManager;
6970
import org.eclipse.dltk.javascript.typeinfo.TypeMode;
7071
import org.eclipse.dltk.javascript.typeinfo.model.Member;
7172
import org.eclipse.dltk.javascript.typeinfo.model.ParameterKind;
@@ -129,8 +130,9 @@ public void run() {
129130
position);
130131
}
131132
final Reporter reporter = new Reporter(inferencer2, path
132-
.lastSegment(), position, visitor
133-
.createValidatorExtensions());
133+
.lastSegment(), position, TypeInfoManager
134+
.createExtensions(inferencer2,
135+
IValidatorExtension.class, null));
134136
if (calculator.isMember() && !path.isEmpty()
135137
&& path.lastSegment() != null) {
136138
doCompletionOnMember(inferencer2, visitor.getCollection(),
@@ -173,7 +175,8 @@ public void completeGlobals(ISourceModule module, final String prefix,
173175
ITypeSystem.CURRENT.runWith(inferencer2, new Runnable() {
174176
public void run() {
175177
final Reporter reporter = new Reporter(inferencer2, prefix,
176-
offset, visitor.createValidatorExtensions());
178+
offset, TypeInfoManager.createExtensions(inferencer2,
179+
IValidatorExtension.class, null));
177180
doGlobalCompletion(visitor.getCollection(), reporter);
178181
}
179182
});
@@ -192,10 +195,9 @@ public void completeMembers(ISourceModule module, String prefix,
192195
setSourceRange(offset - prefix.length(), offset);
193196
final TypeInferencer2 inferencer2 = new TypeInferencer2();
194197
inferencer2.setModelElement(module);
195-
final CompletionVisitor visitor = new CompletionVisitor(inferencer2,
196-
offset);
197198
final Reporter reporter = new Reporter(inferencer2, prefix, offset,
198-
visitor.createValidatorExtensions());
199+
TypeInfoManager.createExtensions(inferencer2,
200+
IValidatorExtension.class, null));
199201
for (IRMember member : memers) {
200202
final String name = member.getName();
201203
if (reporter.matches(name)) {

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/ITypeInferenceExtensionFactory.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,29 @@
1111
*******************************************************************************/
1212
package org.eclipse.dltk.javascript.typeinfo;
1313

14+
import org.eclipse.core.runtime.IAdaptable;
15+
1416
/**
1517
* This interface could be optionally implemented by
1618
* {@link ITypeInferenceHandlerFactory}.
1719
*/
1820
public interface ITypeInferenceExtensionFactory {
1921

2022
/**
23+
* Creates extension of the specified type for the specified context.
24+
* Returns the extension created or null.
25+
*
2126
* @param context
22-
* @param visitor
27+
* can be adapted to {@link ITypeInfoContext} or
28+
* {@link ReferenceSource}
2329
* @param extensionClass
2430
* e.g.
2531
* {@link org.eclipse.dltk.javascript.validation.IValidatorExtension}
32+
* @param arg
33+
* extension specific parameter, can be <code>null</code>
2634
* @return
2735
*/
28-
Object createExtension(ITypeInfoContext context,
29-
ITypeInferencerVisitor visitor, Class<?> extensionClass);
36+
Object createExtension(IAdaptable context, Class<?> extensionClass,
37+
Object arg);
3038

3139
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/ReferenceSource.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
*******************************************************************************/
1212
package org.eclipse.dltk.javascript.typeinfo;
1313

14+
import org.eclipse.core.runtime.IAdaptable;
1415
import org.eclipse.dltk.core.IModelElement;
1516
import org.eclipse.dltk.core.ISourceModule;
1617

17-
public class ReferenceSource {
18+
public class ReferenceSource implements IAdaptable {
1819

1920
public static final ReferenceSource UNKNOWN = new ReferenceSource(null) {
2021
@Override
@@ -43,4 +44,12 @@ public String toString() {
4344
return modelElement != null ? modelElement.getElementName() : "null";
4445
}
4546

47+
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
48+
if (adapter == ReferenceSource.class) {
49+
return this;
50+
} else {
51+
return null;
52+
}
53+
}
54+
4655
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/TypeInfoManager.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Set;
2121
import java.util.StringTokenizer;
2222

23+
import org.eclipse.core.runtime.IAdaptable;
2324
import org.eclipse.core.runtime.IConfigurationElement;
2425
import org.eclipse.core.runtime.Platform;
2526
import org.eclipse.dltk.annotations.ConfigurationElement;
@@ -212,6 +213,36 @@ public static ITypeInferenceHandlerFactory[] getNodeHandlerFactories() {
212213
return nodeHandlerManager.getInstances();
213214
}
214215

216+
/**
217+
* Creates extensions of the specified type for the specified context.
218+
*
219+
* @param context
220+
* can be adapted to {@link ITypeInfoContext} or
221+
* {@link ReferenceSource}
222+
* @param extensionClass
223+
* extension type, see {@link ITypeInferenceExtensionFactory} for
224+
* the list of supported extensions.
225+
* @param arg
226+
* extension specific parameter, can be <code>null</code>
227+
* @see ITypeInferenceExtensionFactory
228+
*/
229+
@SuppressWarnings("unchecked")
230+
public static <E> List<E> createExtensions(IAdaptable context,
231+
Class<E> extensionClass, Object arg) {
232+
final List<E> extensions = new ArrayList<E>();
233+
for (ITypeInferenceHandlerFactory factory : TypeInfoManager
234+
.getNodeHandlerFactories()) {
235+
if (factory instanceof ITypeInferenceExtensionFactory) {
236+
final Object extension = ((ITypeInferenceExtensionFactory) factory)
237+
.createExtension(context, extensionClass, arg);
238+
if (extension != null && extensionClass.isInstance(extension)) {
239+
extensions.add((E) extension);
240+
}
241+
}
242+
}
243+
return extensions;
244+
}
245+
215246
public static IRTypeFactory[] getRTypeFactories() {
216247
return typeFactoryManager.getInstances();
217248
}

0 commit comments

Comments
 (0)