|
@@ -1,7 +1,8 @@
|
|
MODULE EberonMap;
|
|
MODULE EberonMap;
|
|
-IMPORT Code, Context, EberonString, EberonTypes, LanguageContext, Procedure, Types;
|
|
|
|
|
|
+IMPORT Code, Context, EberonRtl, EberonString, EberonRecord, EberonTypes, Errors, LanguageContext, Procedure, Types;
|
|
CONST
|
|
CONST
|
|
removeMethodName = "remove";
|
|
removeMethodName = "remove";
|
|
|
|
+ clearMethodName = "clear";
|
|
TYPE
|
|
TYPE
|
|
Type* = RECORD(Types.StorageType)
|
|
Type* = RECORD(Types.StorageType)
|
|
PROCEDURE Type*(type: Types.PType);
|
|
PROCEDURE Type*(type: Types.PType);
|
|
@@ -16,12 +17,27 @@ TYPE
|
|
PROCEDURE MethodRemoveField();
|
|
PROCEDURE MethodRemoveField();
|
|
END;
|
|
END;
|
|
|
|
|
|
- MethodRemove = RECORD(Method)
|
|
|
|
|
|
+ MethodClearField = RECORD(EberonTypes.MethodField)
|
|
|
|
+ PROCEDURE MethodClearField();
|
|
|
|
+ END;
|
|
|
|
+
|
|
|
|
+ MapMethod = RECORD(Method)
|
|
|
|
+ END;
|
|
|
|
+
|
|
|
|
+ MethodRemove = RECORD(MapMethod)
|
|
|
|
+ PROCEDURE MethodRemove();
|
|
|
|
+ END;
|
|
|
|
+
|
|
|
|
+ MethodClear = RECORD(MapMethod)
|
|
|
|
+ PROCEDURE MethodClear();
|
|
END;
|
|
END;
|
|
|
|
|
|
MethodCallRemove = RECORD(Procedure.StdCall)
|
|
MethodCallRemove = RECORD(Procedure.StdCall)
|
|
END;
|
|
END;
|
|
|
|
|
|
|
|
+ MethodCallClear = RECORD(Procedure.StdCall)
|
|
|
|
+ END;
|
|
|
|
+
|
|
PROCEDURE Type.initializer(cx: Context.Type): STRING;
|
|
PROCEDURE Type.initializer(cx: Context.Type): STRING;
|
|
RETURN "{}";
|
|
RETURN "{}";
|
|
END;
|
|
END;
|
|
@@ -34,14 +50,23 @@ PROCEDURE Type.Type(valueType: Types.PType)
|
|
| valueType(valueType);
|
|
| valueType(valueType);
|
|
END;
|
|
END;
|
|
|
|
|
|
-PROCEDURE Type.denote(id: STRING): Types.PField;
|
|
|
|
|
|
+PROCEDURE Type.denote(id: STRING; isReadObly: BOOLEAN): Types.PField;
|
|
VAR
|
|
VAR
|
|
result: Types.PField;
|
|
result: Types.PField;
|
|
|
|
+
|
|
|
|
+ PROCEDURE assertReadOnly();
|
|
|
|
+ BEGIN
|
|
|
|
+ EberonRecord.assertNotReadOnly(isReadObly, id, "MAP");
|
|
|
|
+ END;
|
|
BEGIN
|
|
BEGIN
|
|
IF id = removeMethodName THEN
|
|
IF id = removeMethodName THEN
|
|
|
|
+ assertReadOnly();
|
|
result := NEW MethodRemoveField();
|
|
result := NEW MethodRemoveField();
|
|
|
|
+ ELSIF id = clearMethodName THEN
|
|
|
|
+ assertReadOnly();
|
|
|
|
+ result := NEW MethodClearField();
|
|
ELSE
|
|
ELSE
|
|
- result := SUPER(id);
|
|
|
|
|
|
+ result := SUPER(id, isReadObly);
|
|
END;
|
|
END;
|
|
RETURN result;
|
|
RETURN result;
|
|
END;
|
|
END;
|
|
@@ -51,10 +76,24 @@ BEGIN
|
|
argCode <- Procedure.makeArgumentsCode(cx);
|
|
argCode <- Procedure.makeArgumentsCode(cx);
|
|
arg <- Procedure.checkSingleArgument(args, SELF, cx.types, argCode);
|
|
arg <- Procedure.checkSingleArgument(args, SELF, cx.types, argCode);
|
|
RETURN Code.makeSimpleExpression("[" + argCode.result() + "]", NIL)
|
|
RETURN Code.makeSimpleExpression("[" + argCode.result() + "]", NIL)
|
|
|
|
+END;
|
|
|
|
+
|
|
|
|
+PROCEDURE MethodCallClear.make(args: ARRAY OF Code.PExpression; cx: LanguageContext.PType): Code.PExpression;
|
|
|
|
+BEGIN
|
|
|
|
+ Procedure.checkArgumentsCount(LEN(args), 0);
|
|
|
|
+ RETURN Code.makeSimpleExpression("", NIL);
|
|
END;
|
|
END;
|
|
|
|
|
|
-PROCEDURE MethodRemove.description(): STRING;
|
|
|
|
- RETURN "MAP's method 'remove'";
|
|
|
|
|
|
+PROCEDURE MapMethod.description(): STRING;
|
|
|
|
+ RETURN "MAP's method '" + SELF.name + "'";
|
|
|
|
+END;
|
|
|
|
+
|
|
|
|
+PROCEDURE MethodRemove.MethodRemove()
|
|
|
|
+ | SUPER(removeMethodName, NIL);
|
|
|
|
+END;
|
|
|
|
+
|
|
|
|
+PROCEDURE MethodClear.MethodClear()
|
|
|
|
+ | SUPER(clearMethodName, NIL);
|
|
END;
|
|
END;
|
|
|
|
|
|
PROCEDURE MethodRemove.callGenerator(cx: LanguageContext.PType): Procedure.PCallGenerator;
|
|
PROCEDURE MethodRemove.callGenerator(cx: LanguageContext.PType): Procedure.PCallGenerator;
|
|
@@ -65,13 +104,27 @@ BEGIN
|
|
RETURN Procedure.makeCallGenerator(call, cx)
|
|
RETURN Procedure.makeCallGenerator(call, cx)
|
|
END;
|
|
END;
|
|
|
|
|
|
|
|
+PROCEDURE MethodClear.callGenerator(cx: LanguageContext.PType): Procedure.PCallGenerator;
|
|
|
|
+BEGIN
|
|
|
|
+ call <- NEW MethodCallClear();
|
|
|
|
+ RETURN Procedure.makeCallGenerator(call, cx)
|
|
|
|
+END;
|
|
|
|
+
|
|
PROCEDURE MethodRemoveField.MethodRemoveField()
|
|
PROCEDURE MethodRemoveField.MethodRemoveField()
|
|
- | SUPER(NEW MethodRemove(removeMethodName, NIL));
|
|
|
|
|
|
+ | SUPER(NEW MethodRemove());
|
|
|
|
+END;
|
|
|
|
+
|
|
|
|
+PROCEDURE MethodClearField.MethodClearField()
|
|
|
|
+ | SUPER(NEW MethodClear());
|
|
END;
|
|
END;
|
|
|
|
|
|
-PROCEDURE MethodRemoveField.designatorCode(leadCode: STRING): Types.PFieldCode;
|
|
|
|
|
|
+PROCEDURE MethodRemoveField.designatorCode(leadCode: STRING; cx: Context.Type): Types.PFieldCode;
|
|
RETURN NEW Types.FieldCode("delete " + leadCode, "", "");
|
|
RETURN NEW Types.FieldCode("delete " + leadCode, "", "");
|
|
END;
|
|
END;
|
|
|
|
|
|
|
|
+PROCEDURE MethodClearField.designatorCode(leadCode: STRING; cx: Context.Type): Types.PFieldCode;
|
|
|
|
+ RETURN NEW Types.FieldCode(cx.rtl(EberonRtl.PType).clearMap(leadCode), "", "");
|
|
|
|
+END;
|
|
|
|
+
|
|
END EberonMap.
|
|
END EberonMap.
|
|
|
|
|