Josef Templ wrote:Most bugs are related to the naming conventions being used for parameters.
It seems to me that most of the bugs can be fixed if we
always start parameter names with a lowercase letter.
This avoids name clashes with identical type names,
which (typically?) start with an uppercase letter.
A more sophisticated rule may be required, though, I don't know yet.
There is also a name clash for auxiliary arrays (arg) declared as local variables.
I did a fixup depending on your tips:
1,DevTypeLibs.ShowFunc :change first letter of parName to lower
Code: Select all
....
i := 0;
WHILE i < func.cParams DO
IF i > 0 THEN out.WriteSString("; ") END;
(*+++ *)
IF names[i+1, 0] < "a" THEN <<<add
names[i+1, 0] := CHR(ORD(names[i+1, 0]) + 32);
END;
(* +++*)
IF i = func.cParams - ABS(func.cParamsOpt) THEN out.WriteSString("(* optional *) ") END;
ShowParam(func.lprgelemdescParam[i], names[i + 1], tinfo, opts, out);
INC(i)
END;
...
2,DevTypeLibs.ShowWrapper : change alll "arg" to "argv"
Code: Select all
PROCEDURE ShowWrapper (VAR [nil] param: ARRAY [untagged] OF WinOleAut.ELEMDESC;
VAR retTyp: WinOleAut.TYPEDESC;
VAR names: ARRAY OF WinOle.BSTR;
par, id, invoke: INTEGER; hasRet: BOOLEAN; opts: SET;
tinfo: WinOleAut.ITypeInfo; VAR out: TextMappers.Formatter);
VAR i: INTEGER; type: WinOleAut.TYPEDESC; kind: SHORTINT; hasVar: BOOLEAN;
BEGIN
IF (invoke = WinOleAut.INVOKE_PROPERTYPUT) & ~hasRet & (par = 1) THEN
out.WriteTab; out.WriteSString("BEGIN"); out.WriteLn;
out.WriteTab; out.WriteTab; out.WriteSString("CtlC.Put");
WriteShortType(param[0].tdesc, tinfo, out); out.WriteSString("(this, ");
out.WriteInt(id); out.WriteSString(", ");
WriteBSTR(names[1], out); out.WriteChar(")"); out.WriteLn
ELSIF (invoke = WinOleAut.INVOKE_PROPERTYGET) & hasRet & (par = 0) THEN
out.WriteTab; out.WriteSString("BEGIN"); out.WriteLn;
out.WriteTab; out.WriteTab; out.WriteSString("RETURN ");
WriteTypeConv(retTyp, tinfo, get, id, out); out.WriteLn
ELSE
hasVar := FALSE;
IF par > 0 THEN
IF ~hasVar THEN out.WriteTab; out.WriteTab; out.WriteSString("VAR"); hasVar := TRUE END;
out.WriteString(" argv: ARRAY "); out.WriteInt(par);
out.WriteString(" OF CtlT.Variant;")
END;
IF hasRet THEN
IF ~hasVar THEN out.WriteTab; out.WriteTab; out.WriteSString("VAR"); hasVar := TRUE END;
out.WriteString(" ret: CtlT.Variant;")
END;
i := 0;
WHILE i < par DO
GetParamType(param[i], tinfo, opts, type, kind);
IF (kind # value) & IsSpecial(type, tinfo) THEN
IF ~hasVar THEN out.WriteTab; out.WriteTab; out.WriteSString("VAR"); hasVar := TRUE END;
out.WriteChar(" "); WriteBSTR(names[i + 1], out); out.WriteString("_TEMP: CtlT.Variant;")
END;
INC(i)
END;
IF hasVar THEN out.WriteLn END;
out.WriteTab; out.WriteSString("BEGIN"); out.WriteLn;
i := 0;
WHILE i < par DO
GetParamType(param[i], tinfo, opts, type, kind);
IF (kind IN {var, varin}) & IsSpecial(type, tinfo) THEN
out.WriteTab; out.WriteTab; out.WriteSString("CtlC.");
WriteShortType(type, tinfo, out);
out.WriteString("Var("); WriteBSTR(names[i + 1], out);
out.WriteString(", "); WriteBSTR(names[i + 1], out);
out.WriteString("_TEMP);"); out.WriteLn
END;
out.WriteTab; out.WriteTab; out.WriteSString("CtlC.");
IF kind # value THEN out.WriteSString("Ref") END;
WriteShortType(type, tinfo, out);
out.WriteSString("Var("); WriteBSTR(names[i + 1], out);
IF (kind # value) & IsSpecial(type, tinfo) THEN out.WriteString("_TEMP") END;
out.WriteSString(", argv["); out.WriteInt(par - i - 1);
out.WriteSString("]);"); out.WriteLn;
INC(i)
END;
out.WriteTab; out.WriteTab;
IF par = 0 THEN out.WriteSString("CtlC.CallMethod(this, ")
ELSIF ODD(invoke DIV WinOleAut.INVOKE_PROPERTYGET) THEN
out.WriteSString("CtlC.CallGetMethod(this, ")
ELSIF ODD(invoke DIV WinOleAut.INVOKE_PROPERTYPUT) THEN
out.WriteSString("CtlC.CallPutMethod(this, ")
ELSIF ODD(invoke DIV WinOleAut.INVOKE_PROPERTYPUTREF) THEN
out.WriteSString("CtlC.CallPutRefMethod(this, ")
ELSE out.WriteSString("CtlC.CallParMethod(this, ")
END;
out.WriteInt(id);
IF par > 0 THEN out.WriteSString(", argv") END;
IF hasRet THEN out.WriteSString(", ret") ELSE out.WriteSString(", NIL") END;
out.WriteSString(");"); out.WriteLn;
i := 0;
WHILE i < par DO
GetParamType(param[i], tinfo, opts, type, kind);
IF (kind IN {var, varout}) & IsSpecial(type, tinfo) THEN
out.WriteTab; out.WriteTab; WriteBSTR(names[i + 1], out);
out.WriteSString(" := "); retName := names[i + 1]$ + "_TEMP";
WriteTypeConv(type, tinfo, ret, 0, out);
out.WriteChar(";"); out.WriteLn
END;
INC(i)
END;
IF hasRet THEN
out.WriteTab; out.WriteTab; out.WriteSString("RETURN ");
retName := "ret";
WriteTypeConv(retTyp, tinfo, ret, 0, out); out.WriteLn
END
END
END ShowWrapper;
test ok with Excel 12.0 (office 2007), but need CtlOffice := CtlOffice12
luowy