use of dyvilx.tools.parsing.marker.Marker in project Dyvil by Dyvil.
the class AbstractConstructor method checkArguments.
@Override
public IType checkArguments(MarkerList markers, SourcePosition position, IContext context, IType type, ArgumentList arguments) {
final IClass theClass = this.enclosingClass;
if (!theClass.isTypeParametric()) {
for (int i = 0, count = this.parameters.size(); i < count; i++) {
arguments.checkValue(i, this.parameters.get(i), null, position, markers, context);
}
return type;
}
final IType classType = theClass.getThisType();
final GenericData genericData = new GenericData(theClass);
classType.inferTypes(type, genericData);
genericData.lockAvailable();
// Check Values and infer Types
for (int i = 0, count = this.parameters.size(); i < count; i++) {
arguments.checkValue(i, this.parameters.get(i), genericData, position, markers, context);
}
genericData.lockAvailable();
// Check Type Var Inference and Compatibility
final TypeParameterList typeParams = theClass.getTypeParameters();
for (int i = 0, count = typeParams.size(); i < count; i++) {
final ITypeParameter typeParameter = typeParams.get(i);
final IType typeArgument = genericData.resolveType(typeParameter);
if (typeArgument == null) {
final IType inferredType = typeParameter.getUpperBound();
markers.add(Markers.semantic(position, "constructor.typevar.infer", theClass.getName(), typeParameter.getName(), inferredType));
genericData.addMapping(typeParameter, inferredType);
} else if (!typeParameter.isAssignableFrom(typeArgument, genericData)) {
final Marker marker = Markers.semanticError(position, "constructor.typevar.incompatible", theClass.getName(), typeParameter.getName());
marker.addInfo(Markers.getSemantic("type.generic.argument", typeArgument));
marker.addInfo(Markers.getSemantic("type_parameter.declaration", typeParameter));
markers.add(marker);
}
}
return classType.getConcreteType(genericData);
}
use of dyvilx.tools.parsing.marker.Marker in project Dyvil by Dyvil.
the class CodeConstructor method resolve.
@Override
public void resolve(MarkerList markers, IContext context) {
super.resolve(markers, context);
context = context.push(this);
this.parameters.resolve(markers, context);
if (this.exceptions != null) {
this.exceptions.resolve(markers, context);
}
this.resolveInitCall(markers, context);
if (this.value != null) {
this.value = this.value.resolve(markers, context);
final IValue typedValue = this.value.withType(Types.VOID, Types.VOID, markers, context);
if (typedValue == null) {
Marker marker = Markers.semanticError(this.position, "constructor.return.type");
marker.addInfo(Markers.getSemantic("return.type", this.value.getType()));
markers.add(marker);
} else {
this.value = typedValue;
}
}
context.pop();
}
use of dyvilx.tools.parsing.marker.Marker in project Dyvil by Dyvil.
the class ModifierUtil method checkOverride.
public static void checkOverride(IMethod member, IMethod overriden, MarkerList markers) {
final int accessLevel = member.getAccessLevel() & ~Modifiers.INTERNAL;
final int overrideFlags = overriden.getAttributes().flags();
// Final Modifier Check
if ((overrideFlags & Modifiers.FINAL) != 0) {
markers.add(Markers.semanticError(member.getPosition(), "method.override.final", member.getName()));
}
switch(overrideFlags & Modifiers.VISIBILITY_MODIFIERS) {
case Modifiers.PRIVATE:
markers.add(Markers.semanticError(member.getPosition(), "method.override.private", member.getName()));
break;
case Modifiers.PRIVATE_PROTECTED:
if (accessLevel == Modifiers.PRIVATE_PROTECTED) {
return;
}
// Fallthrough
case Modifiers.PROTECTED:
if (accessLevel == Modifiers.PROTECTED) {
return;
}
// Fallthrough
case Modifiers.PUBLIC:
if (accessLevel == Modifiers.PUBLIC) {
return;
}
}
final Marker marker = Markers.semanticError(member.getPosition(), "method.override.visibility.mismatch", member.getName());
marker.addInfo(Markers.getSemantic("method.override.visibility", accessModifiersToString(overrideFlags)));
markers.add(marker);
}
use of dyvilx.tools.parsing.marker.Marker in project Dyvil by Dyvil.
the class Deprecation method checkExperimental.
private static void checkExperimental(IMember member, SourcePosition position, MarkerList markers, Annotation annotation) {
final ArgumentList arguments = annotation.getArguments();
final MarkerLevel markerLevel = AnnotationUtil.getEnumValue(arguments, EXP_LEVEL_PARAM, MarkerLevel.class);
if (markerLevel == null || markerLevel == MarkerLevel.IGNORE) {
return;
}
String value = AnnotationUtil.getStringValue(arguments, EXP_VALUE_PARAM);
final String description = AnnotationUtil.getStringValue(arguments, EXP_DESC_PARAM);
final Stage stage = AnnotationUtil.getEnumValue(arguments, EXP_STAGE_PARAM, Stage.class);
assert stage != null;
final String stageName = Markers.getSemantic("experimental.stage." + stage.name());
value = replaceMember(member, value).replace("{stage}", stageName);
final Marker marker = Markers.withText(position, markerLevel, value);
assert marker != null;
// Description
if (description != null && !description.isEmpty()) {
marker.addInfo(Markers.getSemantic("experimental.description", description));
}
// Stage
marker.addInfo(Markers.getSemantic("experimental.stage", stageName));
markers.add(marker);
}
use of dyvilx.tools.parsing.marker.Marker in project Dyvil by Dyvil.
the class Deprecation method checkDeprecation.
private static void checkDeprecation(IMember member, SourcePosition position, MarkerList markers) {
Annotation annotation = member.getAnnotation(DEPRECATED_CLASS);
if (annotation == null) {
annotation = new ExternalAnnotation(DEPRECATED);
}
final ArgumentList arguments = annotation.getArguments();
final MarkerLevel markerLevel = AnnotationUtil.getEnumValue(arguments, DEP_LEVEL_PARAM, MarkerLevel.class);
if (markerLevel == null || markerLevel == MarkerLevel.IGNORE) {
return;
}
String value = AnnotationUtil.getStringValue(arguments, DEP_VALUE_PARAM);
final String description = AnnotationUtil.getStringValue(arguments, DEP_DESC_PARAM);
final String since = AnnotationUtil.getStringValue(arguments, DEP_SINCE_PARAM);
final String forRemoval = AnnotationUtil.getStringValue(arguments, DEP_UNTIL_PARAM);
value = replaceMember(member, value);
if (since != null) {
value = value.replace("{since}", since);
}
if (forRemoval != null) {
value = value.replace("{forRemoval}", forRemoval);
}
final Marker marker = Markers.withText(position, markerLevel, value);
assert marker != null;
// Description
if (description != null && !description.isEmpty()) {
marker.addInfo(Markers.getSemantic("deprecated.description", description));
}
// Since
if (since != null && !since.isEmpty()) {
marker.addInfo(Markers.getSemantic("deprecated.since", since));
}
if (forRemoval != null && !forRemoval.isEmpty()) {
marker.addInfo(Markers.getSemantic("deprecated.forRemoval", forRemoval));
}
// Until
// Reasons
final Reason[] reasons = getReasons(arguments);
if (reasons != null) {
final int reasonCount = reasons.length;
// more than one reason
if (reasonCount == 1) {
marker.addInfo(Markers.getSemantic("deprecated.reason", reasonName(reasons[0])));
} else if (reasonCount > 0) {
final StringBuilder builder = new StringBuilder(reasonName(reasons[0]));
for (int i = 1; i < reasonCount; i++) {
builder.append(", ").append(reasonName(reasons[i]));
}
marker.addInfo(Markers.getSemantic("deprecated.reasons", builder.toString()));
}
}
// Replacements
final String[] replacements = getReplacements(arguments);
if (replacements != null) {
for (String replacement : replacements) {
marker.addInfo("\t\t" + replacement);
}
marker.addInfo(Markers.getSemantic("deprecated.replacements"));
}
markers.add(marker);
}
Aggregations