コード例 #1
0
 private void defineClassMethod(MethodDeclarationNode methodDeclaration, bool partial, TypeBuilder typeBuilder) {
     var name = context.getIdentifier(methodDeclaration.NameOffset, methodDeclaration.NameLength);
     if (name.equals("finalize") && methodDeclaration.Parameters.size() == 0) {
         context.addError(CompileErrorId.FinalizeMethodOverride, methodDeclaration);
     }
     if (methodDeclaration.IsPartial) {
         if (!partial) {
             context.addError(CompileErrorId.PartialMethodWithinPartialClass, methodDeclaration);
         }
         if (methodDeclaration.ReturnType != context.TypeSystem.VoidType) {
             context.addError(CompileErrorId.PartialMethodNotVoid, methodDeclaration);
         }
     }
     var methodBuilder = lookupMethod(typeBuilder, methodDeclaration.TypeParameters, methodDeclaration.Parameters, name);
     if (methodBuilder != null) {
         if (!methodDeclaration.IsPartial) {
             context.addError(CompileErrorId.AlreadyDefinedMethod, methodDeclaration, BytecodeHelper.getDisplayName(typeBuilder), name);
             return;
         }
         var partialInfo = partialTypes[typeBuilder.FullName];
         if (!partialInfo.partialMethods.containsKey(methodBuilder)) {
             context.addError(CompileErrorId.AlreadyDefinedMethod, methodDeclaration, BytecodeHelper.getDisplayName(typeBuilder), name);
         }
         var partialMethodInfo = partialInfo.partialMethods[methodBuilder];
         if (methodDeclaration.Body == null) {
             if (partialMethodInfo.definingPart != null) {
                 context.addError(CompileErrorId.MultiplePartialDefiningDeclarations, methodDeclaration);
             }
             partialMethodInfo.definingPart = methodDeclaration;
         } else {
             if (partialMethodInfo.implementingPart != null) {
                 context.addError(CompileErrorId.MultiplePartialImplementingDeclarations, methodDeclaration);
             }
             partialMethodInfo.implementingPart = methodDeclaration;
         }
         setPartialMethodModifiers(methodDeclaration, methodBuilder);
         setMethodConstraints(methodDeclaration.ConstraintsClauses, methodBuilder);
         methodDeclaration.addUserData(methodBuilder);
     } else {
         methodBuilder = typeBuilder.defineMethod(name);
         methodDeclaration.addUserData(methodBuilder);
         setTypeParameters(methodBuilder, methodDeclaration.TypeParameters, methodDeclaration);
         context.MemberResolver.enterMethod(methodBuilder);
         try {
             setMethodModifiers(methodDeclaration, methodBuilder);
             var returnType = CompilerHelper.resolveTypeReference(context, typeBuilder.PackageName, methodDeclaration.ReturnType);
             methodBuilder.setReturnType(returnType);
             var i = 0;
             foreach (var parameter in methodDeclaration.Parameters) {
                 var type = CompilerHelper.resolveTypeReference(context, typeBuilder.PackageName, parameter.Type);
                 var paramBuilder = methodBuilder.addParameter(type);
                 paramBuilder.setName(context.getIdentifier(parameter.NameOffset, parameter.NameLength));
                 if (parameter.Modifier == ParameterModifier.Params) {
                     if (i < methodDeclaration.Parameters.size() - 1) {
                         context.addError(CompileErrorId.ParamsNotLast, parameter);
                     }
                     if (!type.IsArray) {
                         context.addError(CompileErrorId.ParamsNotArray, parameter);
                     }
                     methodBuilder.setVarargs(true);
                 } else if (parameter.Modifier == ParameterModifier.This) {
                     if (!methodBuilder.IsStatic) {
                         context.addError(CompileErrorId.ThisParameterNotStatic, parameter);
                     }
                     if (i > 0) {
                         context.addError(CompileErrorId.ThisNotFirst, parameter);
                     }
                     methodBuilder.addAnnotation(context.getType("stab/lang/ExtensionMethod", parameter), false);
                 }
                 i++;
             }
             setMethodConstraints(methodDeclaration.ConstraintsClauses, methodBuilder);
             if (methodDeclaration.IsPartial) {
                 var partialInfo = partialTypes[typeBuilder.getFullName()];
                 var partialMethodInfo = new PartialMethodInfo();
                 if (methodDeclaration.Body == null) {
                     partialMethodInfo.definingPart = methodDeclaration;
                 } else {
                     partialMethodInfo.implementingPart = methodDeclaration;
                 }
                 partialInfo.partialMethods[methodBuilder] = partialMethodInfo;
             }
         } finally {
             context.MemberResolver.leaveMethod();
         }
     }
 }