Exemple #1
0
 public bool checkUniqueLocalVar(DiagnosticPosition pos, VarSymbol varSymbol, WritableScope scope)
 {
     if (scope.getSymbolsByName(varSymbol.name, s => (s.kind & Kind.VAR) != 0).Any())
     {
         log.error(pos, messages.duplicateVar, varSymbol.name);
         return(false);
     }
     return(true);
 }
Exemple #2
0
 public bool checkUniqueParam(DiagnosticPosition pos, VarSymbol param, Scope scope)
 {
     if (scope.getSymbolsByName(param.name, LookupKind.NON_RECURSIVE).Any())
     {
         log.error(pos, messages.duplicateParamName, param.name, scope.owner.name);
         return(false);
     }
     return(true);
 }
Exemple #3
0
        public bool checkUnique(DiagnosticPosition pos, StructSymbol ssym, WritableScope scope)
        {
            bool contains = scope.getSymbolsByName(ssym.name, LookupKind.NON_RECURSIVE).Any();

            if (contains)
            {
                log.error(pos, messages.duplicateStructName, ssym.name);
            }
            return(!contains);
        }
Exemple #4
0
 public bool checkMainFunction(DiagnosticPosition pos, FuncSymbol main)
 {
     // Mimic C main function sig: int main(int,char**)
     // with long substituting pointer (implying 64bit arch)
     if (main.type.ReturnType != symtab.intType ||
         main.type.ParameterTypes.Count != 2 ||
         main.type.ParameterTypes[0] != symtab.intType ||
         main.type.ParameterTypes[1] != symtab.longType)
     {
         log.error(pos, messages.mainFunctionSig);
         return(false);
     }
     return(true);
 }
Exemple #5
0
 public OperatorSymbol resolveUnary(DiagnosticPosition pos, Tag tag, Type argType)
 {
     if (argType.IsError)
     {
         return(symtab.errorOpSymbol);
     }
     OperatorSymbol[] variants = this.operators[tag.operatorIndex()];
     for (var i = 0; i < variants.Length; i++)
     {
         OperatorSymbol op = variants[i];
         // We check for exact match for unary operators
         if (op.type.ParameterTypes[0] == argType.BaseType)
         {
             return(op);
         }
     }
     log.error(pos, messages.unresolvedUnaryOperator, operatorNames[tag.operatorIndex()], argType);
     return(symtab.errorOpSymbol);
 }
Exemple #6
0
 public OperatorSymbol resolveBinary(DiagnosticPosition pos, Tag tag, Type leftType, Type rightType)
 {
     if (leftType.IsError || rightType.IsError)
     {
         return(symtab.errorOpSymbol);
     }
     OperatorSymbol[] variants = this.operators[tag.operatorIndex()];
     for (var i = 0; i < variants.Length; i++)
     {
         OperatorSymbol op         = variants[i];
         IList <Type>   paramTypes = op.type.ParameterTypes;
         // We take numeric promotion into account
         if (typings.isAssignableFrom(paramTypes[0], leftType) &&
             typings.isAssignableFrom(paramTypes[1], rightType))
         {
             return(op);
         }
     }
     log.error(pos, messages.unresolvedBinaryOperator, operatorNames[tag.operatorIndex()], leftType, rightType);
     return(symtab.errorOpSymbol);
 }