use of org.eclipse.n4js.ts.types.util.AccessorTuple in project n4js by eclipse.
the class ConcreteMembersOrderedForTranspiler method create.
/**
* Returns a tuple of collections used by transpiler to generate interface or class members.
*/
public static ConcreteMembersOrderedForTranspiler create(ContainerTypesHelper containerTypesHelper, TClassifier type, Script context) {
MemberCollector collector = containerTypesHelper.fromContext(context);
List<TMember> concreteInheritedMembers = (type instanceof TClass) ? collector.inheritedMembers((TClass) type) : emptyList();
List<TMember> ownedAndMixedInConcreteMembers = collector.computeOwnedAndMixedInConcreteMembers(type);
List<AccessorTuple> concreteAccessorTuples = getConcreteFieldAccessors(ownedAndMixedInConcreteMembers, concreteInheritedMembers);
MemberList<TField> fieldsOverridingAccessors = getFieldsOverridingAccessor(ownedAndMixedInConcreteMembers, concreteInheritedMembers);
// compute the list of mixed in fields, which do not override any Accessor (handled separately)
MemberList<TField> fieldsPurelyMixedInNotOverridingAccessor = new MemberList<>();
fieldsPurelyMixedInNotOverridingAccessor.addAll(ownedAndMixedInConcreteMembers.stream().filter(it -> it instanceof TField && // must stem from different type
it.getContainingType() != type).map(it -> (TField) it).filter(// remove the ones overriding get/set
it -> !fieldsOverridingAccessors.contains(it)).collect(Collectors.toList()));
return new ConcreteMembersOrderedForTranspiler(concreteInheritedMembers, ownedAndMixedInConcreteMembers, concreteAccessorTuples, fieldsOverridingAccessors, fieldsPurelyMixedInNotOverridingAccessor);
}
use of org.eclipse.n4js.ts.types.util.AccessorTuple in project n4js by eclipse.
the class ConcreteMembersOrderedForTranspiler method mapToAccessorTuples.
/**
* Maps getters and setters to {@link AccessorTuple}s, used to generate proper setters-getters-pairs for property.
* The passed maps may be changed!
*
* @param getters
* list of getters
* @param fields
* list of fields
* @param io_setters
* map with owned getters, this map may be changed by this method
* @param io_inheritedGetters
* map with inherited getters, this map may be changed by this method
* @param io_inheritedSetters
* map with inherited getters, this map may be changed by this method
* @return list of accessor tuples.
*/
private static List<AccessorTuple> mapToAccessorTuples(Iterable<TGetter> getters, Map<NameStaticPair, TSetter> io_setters, Iterable<TField> fields, Map<NameStaticPair, TGetter> io_inheritedGetters, Map<NameStaticPair, TSetter> io_inheritedSetters) {
List<AccessorTuple> tuples = new ArrayList<>();
// add getters (alone & with corresponding setter)
for (TGetter getter : getters) {
AccessorTuple tuple = new AccessorTuple(getter.getName(), getter.isStatic());
tuple.setGetter(getter);
NameStaticPair nsp = NameStaticPair.of(getter);
// do not handle the thing twice
tuple.setSetter(io_setters.remove(nsp));
if (tuple.getSetter() == null) {
tuple.setInheritedSetter(io_inheritedSetters.remove(nsp));
}
tuples.add(tuple);
}
// add setters w/o getter:
for (TSetter setter : io_setters.values()) {
AccessorTuple tuple = new AccessorTuple(setter.getName(), setter.isStatic());
NameStaticPair nsp = NameStaticPair.of(setter);
tuple.setSetter(setter);
tuple.setInheritedGetter(io_inheritedGetters.remove(nsp));
tuples.add(tuple);
}
// remove the inherited references - the field will overwrite them.
for (TField field : fields) {
NameStaticPair nsp = NameStaticPair.of(field);
io_inheritedSetters.remove(nsp);
io_inheritedGetters.remove(nsp);
}
// find getters/setters defined in interfaces which need to be combined:
for (TSetter inhSetter : io_inheritedSetters.values()) {
TGetter inhGetter = io_inheritedGetters.remove(NameStaticPair.of(inhSetter));
if (inhGetter != null && inhSetter.getContainingType() != inhGetter.getContainingType() && (inhSetter.getContainingType() instanceof TInterface || inhGetter.getContainingType() instanceof TInterface)) {
// getter & setter are inherited from different types.
AccessorTuple tuple = new AccessorTuple(inhSetter.getName(), inhSetter.isStatic());
tuple.setInheritedGetter(inhGetter);
tuple.setInheritedSetter(inhSetter);
tuples.add(tuple);
}
}
return tuples;
}
use of org.eclipse.n4js.ts.types.util.AccessorTuple in project n4js by eclipse.
the class ConcreteMembersOrderedForTranspiler method getConcreteFieldAccessors.
/**
* Helper method, returns all concrete field accessors as tuples of the given classifier, which may even contain
* fields if they override concrete getters or setter. Since getter/setters can only be defined as pairs, in case of
* single owned getter with inherited setter, a delegate is created for the setter (and vice versa).
*/
private static List<AccessorTuple> getConcreteFieldAccessors(List<TMember> ownedAndMixedInConcreteMember, List<TMember> concreteInheritedMembers) {
Set<TField> ownedAndMixedInFields = new HashSet<>();
Set<TGetter> ownedAndMixedInGetters = new HashSet<>();
Map<NameStaticPair, TSetter> ownedAndMixedInSetters = new HashMap<>();
for (TMember m : ownedAndMixedInConcreteMember) {
if (m instanceof TField) {
ownedAndMixedInFields.add((TField) m);
} else if (m instanceof TGetter) {
ownedAndMixedInGetters.add((TGetter) m);
} else if (m instanceof TSetter) {
ownedAndMixedInSetters.put(NameStaticPair.of(m), (TSetter) m);
}
}
Map<NameStaticPair, TGetter> inheritedGetters = new HashMap<>();
Map<NameStaticPair, TSetter> inheritedSetters = new HashMap<>();
for (TMember m : concreteInheritedMembers) {
if (m instanceof TGetter) {
if (!ownedAndMixedInGetters.contains(m)) {
inheritedGetters.put(NameStaticPair.of(m), (TGetter) m);
}
} else if (m instanceof TSetter) {
NameStaticPair nsp = NameStaticPair.of(m);
if (ownedAndMixedInSetters.get(nsp) != m) {
inheritedSetters.put(nsp, (TSetter) m);
}
}
}
List<AccessorTuple> ownedOrMixedInAccessorTouples = mapToAccessorTuples(ownedAndMixedInGetters, ownedAndMixedInSetters, ownedAndMixedInFields, inheritedGetters, inheritedSetters);
return ownedOrMixedInAccessorTouples;
}
use of org.eclipse.n4js.ts.types.util.AccessorTuple in project n4js by eclipse.
the class ScriptApiTracker method computeMissingApiFields.
/**
* Computes the list of virtual AccessorTuples for missing fields.
*
* @return List of {@link VirtualApiTField}
*/
private List<AccessorTuple> computeMissingApiFields(TClass declaration) {
Optional<ProjectComparisonAdapter> optAdapt = firstProjectComparisonAdapter(declaration.eResource());
if (optAdapt.isPresent()) {
ProjectComparisonEntry compareEntry = optAdapt.get().getEntryFor(EcoreUtil2.getContainerOfType(declaration, TModule.class));
ProjectComparisonEntry typeCompare = compareEntry.getChildForElementImpl(declaration);
if (typeCompare != null) {
return typeCompare.allChildren().filter(pce -> pce.getElementAPI() instanceof TField).filter(// only go for empty impl.
pce -> pce.getElementImpl()[0] == null).map(pce -> {
TField apiField = (TField) pce.getElementAPI();
VirtualApiMissingFieldAccessorTuple ret = createVirtFieldAccessorTuple(apiField);
return ret;
}).collect(Collectors.toList());
}
}
return emptyList();
}
use of org.eclipse.n4js.ts.types.util.AccessorTuple in project n4js by eclipse.
the class ScriptApiTracker method createVirtFieldAccessorTuple.
private VirtualApiMissingFieldAccessorTuple createVirtFieldAccessorTuple(TField apiField) {
boolean statiC = apiField.isStatic();
String name = apiField.getName();
AccessorTuple copy = new AccessorTuple(name, statiC);
TSetter tset = TypesFactory.eINSTANCE.createTSetter();
tset.setName(name);
tset.setDeclaredStatic(statiC);
copy.setSetter(tset);
TGetter tget = TypesFactory.eINSTANCE.createTGetter();
tget.setName(name);
tget.setDeclaredStatic(statiC);
copy.setGetter(tget);
VirtualApiMissingFieldAccessorTuple ret = new VirtualApiMissingFieldAccessorTuple(copy);
ret.setGetter(new VirtualApiTGetter(name, tget));
ret.setSetter(new VirtualApiTSetter(name, tset));
return ret;
}
Aggregations