changeset 174:20ff3c31f600

Putting symbol on MemberRef -calls.
author Anders Johnsen <skabet@gmail.com>
date Thu, 24 Jul 2008 21:06:42 +0200
parents 50b98a06a200
children c8e26556c24d
files gen/CodeGen.d sema/TypeCheck.d tests/code/struct_6.d
diffstat 3 files changed, 89 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/gen/CodeGen.d	Thu Jul 24 20:40:04 2008 +0200
+++ b/gen/CodeGen.d	Thu Jul 24 21:06:42 2008 +0200
@@ -368,6 +368,7 @@
                 DFunction ftype = type.asFunction();
                 Type llvm_ftype = llvm(ftype);
                 Value f = null;
+                Stdout(callExp.callSym).newline;
                 if (callExp.callSym is null)
                 {
                     // Do a virtual function call
--- a/sema/TypeCheck.d	Thu Jul 24 20:40:04 2008 +0200
+++ b/sema/TypeCheck.d	Thu Jul 24 21:06:42 2008 +0200
@@ -88,7 +88,80 @@
     {
         super.visitCallExp(exp);
 
-        if (auto iden = cast(Identifier)exp.exp)
+        Stdout(exp.exp).newline;
+        if (auto iden = cast(MemberReference)exp.exp)
+        {
+            Symbol[] internalVisitMemberRef(MemberReference m)
+            {
+                Symbol[] visitRef(MemberReference m, Identifier target, Symbol st)
+                {
+                    auto child = m.child;
+                    auto res = st.findMembers(child.get);
+                    return res;
+                }
+                switch(m.target.expType)
+                {
+                    case ExpType.Identifier:
+                        return visitRef(m, cast(Identifier)m.target,
+                                (cast(Identifier)m.target).getSymbol);
+                    case ExpType.MemberReference:
+                        Symbol[] s = internalVisitMemberRef(cast(MemberReference)m.target);
+                        if(s.length)
+                            return s;
+                        return visitRef(m, cast(Identifier)m.target, s[0]);
+                }
+            }
+
+            Exp[] newArgs;
+
+            Symbol[] methods = internalVisitMemberRef(iden);           
+
+            if (!methods.length)
+            {
+                messages.report(NoMethodByName, iden.loc);
+                return;
+            }
+
+            Symbol sel = getBestMatch(exp.args, methods);
+
+            if (sel)
+            {
+                foreach (i, arg; exp.args)
+                {
+                    auto argType = sel.type.asFunction.params[i];
+                    auto expType = arg.type;
+                    if (argType.byteSize != expType.byteSize)
+                    {
+                        if (!expType.hasImplicitConversionTo(argType))
+                            messages.report(InvalidImplicitCast, exp.loc)
+                                .arg(expType.toString)
+                                .arg(argType.toString);
+
+                        auto castExp = new CastExp(
+                                SLoc.Invalid,
+                                new Identifier(argType.name),
+                                arg);
+                        castExp.env = iden.env;
+                        newArgs ~= castExp;
+                    }
+                    else
+                        newArgs ~= arg;
+                }
+                exp.args = newArgs;
+                exp.callSym = sel;
+            }
+            else
+            {
+                messages.report(NoMachingMethod, exp.loc);
+                foreach ( i, s ; methods )
+                {
+                    messages.report(CandidateNr, 
+                            (cast(FuncDecl)s.decl).identifier.loc)
+                        .arg(Integer.toString(i+1));
+                }
+            }
+        }
+        else if (auto iden = cast(Identifier)exp.exp)
         {
             Exp[] newArgs;
 
@@ -141,7 +214,6 @@
                         .arg(Integer.toString(i+1));
                 }
             }
-
         }
         else
         {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/code/struct_6.d	Thu Jul 24 21:06:42 2008 +0200
@@ -0,0 +1,14 @@
+
+struct A
+{
+    int foo()
+    {
+        return 5;
+    }
+}
+
+int main()
+{
+    A a;
+    return a.foo();
+}