Example #1
0
        public override void VisitOutputDeclarationSyntax(OutputDeclarationSyntax syntax)
        => AssignTypeWithCaching(syntax, () => {
            var primitiveType = LanguageConstants.TryGetDeclarationType(syntax.Type.TypeName);

            if (primitiveType == null)
            {
                return(new ErrorTypeSymbol(DiagnosticBuilder.ForPosition(syntax.Type).InvalidOutputType()));
            }

            return(primitiveType);
        });
Example #2
0
        public TypeSymbol GetDeclaredType()
        {
            // assume "any" type when the parameter has parse errors (either missing or was skipped)
            var declaredType = this.ParameterType == null
                ? LanguageConstants.Any
                : LanguageConstants.TryGetDeclarationType(this.ParameterType.TypeName);

            if (declaredType == null)
            {
                return(ErrorType.Create(DiagnosticBuilder.ForPosition(this.Type).InvalidParameterType()));
            }

            return(declaredType);
        }
Example #3
0
        public override void VisitOutputDeclarationSyntax(OutputDeclarationSyntax syntax)
        => AssignTypeWithDiagnostics(syntax, diagnostics => {
            var primitiveType = LanguageConstants.TryGetDeclarationType(syntax.Type.TypeName);

            if (primitiveType == null)
            {
                return(new ErrorTypeSymbol(DiagnosticBuilder.ForPosition(syntax.Type).InvalidOutputType()));
            }

            var currentDiagnostics = GetOutputDeclarationDiagnostics(primitiveType, syntax);

            diagnostics.AddRange(currentDiagnostics);

            return(primitiveType);
        });
Example #4
0
        public override void VisitOutputDeclarationSyntax(OutputDeclarationSyntax syntax)
        => AssignTypeWithDiagnostics(syntax, diagnostics =>
        {
            // assume "any" type if the output type has parse errors (either missing or skipped)
            var primitiveType = syntax.OutputType == null
                    ? LanguageConstants.Any
                    : LanguageConstants.TryGetDeclarationType(syntax.OutputType.TypeName);

            if (primitiveType == null)
            {
                return(new ErrorTypeSymbol(DiagnosticBuilder.ForPosition(syntax.Type).InvalidOutputType()));
            }

            var currentDiagnostics = GetOutputDeclarationDiagnostics(primitiveType, syntax);

            diagnostics.AddRange(currentDiagnostics);

            return(primitiveType);
        });
Example #5
0
        public override void VisitParameterDeclarationSyntax(ParameterDeclarationSyntax syntax)
        => AssignTypeWithDiagnostics(syntax, diagnostics => {
            diagnostics.AddRange(this.ValidateIdentifierAccess(syntax));

            // assume "any" type when the parameter has parse errors (either missing or was skipped)
            var declaredType = syntax.ParameterType == null
                    ? LanguageConstants.Any
                    : LanguageConstants.TryGetDeclarationType(syntax.ParameterType.TypeName);

            if (declaredType == null)
            {
                return(new ErrorTypeSymbol(DiagnosticBuilder.ForPosition(syntax.Type).InvalidParameterType()));
            }

            var assignedType = declaredType;
            if (object.ReferenceEquals(assignedType, LanguageConstants.String))
            {
                var allowedItemTypes = SyntaxHelper.TryGetAllowedItems(syntax)?
                                       .Select(item => typeManager.GetTypeInfo(item));

                if (allowedItemTypes != null && allowedItemTypes.All(itemType => itemType is StringLiteralType))
                {
                    assignedType = UnionType.Create(allowedItemTypes);
                }
            }

            switch (syntax.Modifier)
            {
            case ParameterDefaultValueSyntax defaultValueSyntax:
                diagnostics.AddRange(ValidateDefaultValue(defaultValueSyntax, assignedType));
                break;

            case ObjectSyntax modifierSyntax:
                var modifierType = LanguageConstants.CreateParameterModifierType(declaredType, assignedType);
                // we don't need to actually use the narrowed type; just need to use this to collect assignment diagnostics
                TypeValidator.NarrowTypeAndCollectDiagnostics(typeManager, modifierSyntax, modifierType, diagnostics);
                break;
            }

            return(assignedType);
        });
Example #6
0
        public override void VisitParameterDeclarationSyntax(ParameterDeclarationSyntax syntax)
        => AssignTypeWithCaching(syntax, () => {
            var primitiveType = LanguageConstants.TryGetDeclarationType(syntax.Type.TypeName);
            if (primitiveType == null)
            {
                return(new ErrorTypeSymbol(DiagnosticBuilder.ForPosition(syntax.Type).InvalidParameterType()));
            }

            if (!object.ReferenceEquals(primitiveType, LanguageConstants.String))
            {
                return(primitiveType);
            }

            var allowedItemTypes = SyntaxHelper.TryGetAllowedItems(syntax)?
                                   .Select(item => VisitAndReturnType(item));

            if (allowedItemTypes == null || !allowedItemTypes.All(itemType => itemType is StringLiteralType))
            {
                return(primitiveType);
            }

            return(UnionType.Create(allowedItemTypes));
        });
Example #7
0
 public static TypeSymbol?TryGetPrimitiveType(ParameterDeclarationSyntax parameterDeclarationSyntax)
 => LanguageConstants.TryGetDeclarationType(parameterDeclarationSyntax.ParameterType?.TypeName);
Example #8
0
 public TypeSymbol?TryGetPrimitiveType()
 => LanguageConstants.TryGetDeclarationType(this.DeclaringParameter.Type.TypeName);