[Nice-commit] Nice/src/bossa/syntax EnumDefinition.java,1.15,1.16 NiceClass.java,1.88,1.89
Brought to you by:
bonniot
From: Arjan B. <ar...@us...> - 2004-10-14 15:42:21
|
Update of /cvsroot/nice/Nice/src/bossa/syntax In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19244/F:/nice/src/bossa/syntax Modified Files: EnumDefinition.java NiceClass.java Log Message: Added field default value overriding. Index: NiceClass.java =================================================================== RCS file: /cvsroot/nice/Nice/src/bossa/syntax/NiceClass.java,v retrieving revision 1.88 retrieving revision 1.89 diff -C2 -d -r1.88 -r1.89 *** NiceClass.java 13 Oct 2004 20:42:21 -0000 1.88 --- NiceClass.java 14 Oct 2004 15:42:11 -0000 1.89 *************** *** 80,83 **** --- 80,91 ---- } + public void setValueOverrides(List valueOverrides) + { + if (valueOverrides == null) + this.valueOverrides = new LinkedList(); + else + this.valueOverrides = valueOverrides; + } + ClassDefinition definition; *************** *** 147,150 **** --- 155,166 ---- } + public ValueOverride makeValueOverride(LocatedString fname, Expression value) + { + if (isInterface()) + User.error(fname, "An interface cannot have a field."); + + return new ValueOverride(fname, value); + } + abstract class Field { *************** *** 408,411 **** --- 424,471 ---- } + public final class ValueOverride + { + ValueOverride(LocatedString name, Expression value) + { + this.name = name; + this.value = value; + } + + void updateConstructorParameter(List inherited) + { + for (int i = 1; i < inherited.size(); i++) { + FormalParameters.Parameter param = (FormalParameters.Parameter) + inherited.get(i); + if (param.match(name.toString())) + { + inherited.set(i, new FormalParameters.OptionalParameter + (param.type, name, true, value, + param.value() == null || param.isOverriden())); + } + } + } + + void resolve(VarScope scope, TypeScope typeScope) + { + value = dispatch.analyse(value, scope, typeScope); + } + + + void typecheck() + { + boolean exists = false; + + NiceClass parent = getParent(); + if (parent != null) + exists = parent.checkValueOverride(name, value); + + if (! exists) + throw User.error(name, "No field with this name exists in a super-class"); + } + + LocatedString name; + Expression value; + } + // Used to resolve fields, and constructor constraint. private TypeScope localScope; *************** *** 429,432 **** --- 489,496 ---- for (int i = 0; i < overrides.length; i++) overrides[i].resolve(definition.scope, localScope); + + for (Iterator it = valueOverrides.iterator(); it.hasNext(); ) + ((ValueOverride)it.next()).resolve(definition.scope, localScope); + } *************** *** 465,468 **** --- 529,571 ---- } + private boolean checkValueOverride(LocatedString name, Expression value) + { + + Field original = null; + + for (int i = 0; i < fields.length; i++) + if (fields[i].sym.getName().toString().equals(name.toString())) + original = fields[i]; + + for (int i = 0; i < overrides.length; i++) + if (overrides[i].sym.getName().toString().equals(name.toString())) + original = overrides[i]; + + if (original != null) + { + NiceClass.this.enterTypingContext(); + + mlsub.typing.Polytype declaredType = original.sym.getType(); + value = value.resolveOverloading(declaredType); + + dispatch.typecheck(value); + + try { + Typing.leq(value.getType(), declaredType); + } + catch (mlsub.typing.TypingEx ex) { + User.error(name, "Value does not fit in the overriden field of type " + declaredType); + } + + return true; + } + + NiceClass parent = getParent(); + if (parent != null) + return parent.checkValueOverride(name, value); + else + return false; + } + /**************************************************************** * Initializers *************** *** 569,572 **** --- 672,678 ---- overrides[i].typecheck(); + for (Iterator it = valueOverrides.iterator(); it.hasNext(); ) + ((ValueOverride)it.next()).typecheck(); + if (initializers.length != 0) { *************** *** 818,822 **** res = sup.getParentConstructorParameters(constraints, typeParameters); ! if (overrides.length > 0) for (Iterator i = res.iterator(); i.hasNext();) updateConstructorParameters((List) i.next()); --- 924,928 ---- res = sup.getParentConstructorParameters(constraints, typeParameters); ! if (overrides.length > 0 || (! valueOverrides.isEmpty())) for (Iterator i = res.iterator(); i.hasNext();) updateConstructorParameters((List) i.next()); *************** *** 844,847 **** --- 950,956 ---- for (int f = 0; f < overrides.length; f++) overrides[f].updateConstructorParameter(inherited); + + for (Iterator it = valueOverrides.iterator(); it.hasNext();) + ((ValueOverride)it.next()).updateConstructorParameter(inherited); } *************** *** 860,863 **** --- 969,985 ---- "A field override of the same field exists in this class"); + for (int i = 0; i < valueOverrides.size(); i++) + for (int k = i+1; k < valueOverrides.size(); k++) + if (((ValueOverride)valueOverrides.get(i)).name.equals(((ValueOverride)valueOverrides.get(k)).name)) + User.error(((ValueOverride)valueOverrides.get(k)).name, + "A field override of the same field exists in this class"); + + for (int i = 0; i < overrides.length; i++) + for (int k = 0; k < valueOverrides.size(); k++) + if (overrides[i].sym.hasName(((ValueOverride)valueOverrides.get(k)).name)) + User.error(((ValueOverride)valueOverrides.get(k)).name, + "A field override of the same field exists in this class"); + + } *************** *** 1076,1079 **** --- 1198,1202 ---- private NewField[] fields; private OverridenField[] overrides; + private List valueOverrides; private Long serialVersionUIDValue; } Index: EnumDefinition.java =================================================================== RCS file: /cvsroot/nice/Nice/src/bossa/syntax/EnumDefinition.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** EnumDefinition.java 13 Oct 2004 23:22:22 -0000 1.15 --- EnumDefinition.java 14 Oct 2004 15:42:11 -0000 1.16 *************** *** 51,54 **** --- 51,55 ---- impl.setOverrides(null); + impl.setValueOverrides(null); if (! inInterfaceFile()) |