vblang icon indicating copy to clipboard operation
vblang copied to clipboard

[Proposal] Additional Kinds of Is Clauses

Open AdamSpeight2008 opened this issue 3 years ago • 0 comments

Proposal 1: Is/Isnot Type Clauses

I propose that we split out the Is typeand IsNot type part from the TypeOf expr Is type, into it's own clause (IsTypeClause). By doing this we'd gain additional forms, that are applicable to both TypeOf expression and a new Select Case Clause.

IsTypeClause ::= ("Is / IsNot") TypeSyntax ;; Includee an optional declaration. IsTypeClause ::= ("Is" / "IsNot") (ident "As")? TypeSyntax ;; Extend the target type to include multiple target types. IsTypeClause ::= ("Is" / "IsNot") (ident "As")? (TypeArgumentListSyntax / TypeSyntax)

Basic Syntax

Syntax IsTypeClause
  Inherits ClauseSyntax
  With
   .KindOfIsKeyword	As KeywordSyntax (Where .Kind IsOf {SyntaxKind.IsKeyword, SyntaxKind.IsNotKeyword})
   .DeclarationAs	As Optional(Of DeclarationAsClause)
   .KIndOfTargetType    As Union(Of TypeArgumentListSyntax, TypeSyntax)
  End With
End Syntax

Syntax DeclarationAsClause
  Inherits ClauseSyntax
  With
    .Declaration	As IdentifierNameSyntax
    .AsKeyword		As KeywordSyntax (Where .Kind = SyntaxKind.AsKeyword)
  End With
End Syntax

Syntax TypeOfExpression
  Inherits Expression
  With
    .TypeOfKeyword	As Keyword (Where .Kind = SyntaxKind.TypeOfKeyword)
    .Operad		As ExpressionSyntax
    .IsTypeClause	As IsTypeClauseSyntax
  End With
End Syntax
KindOfIsKeyword DeclarationAsClause KindOfTarget result
Is Type Valid
Is id As Type Valid
Is (Of T0 .., Tn) Valid
Is id As (Of T0 .., Tn) Error: DeclarationAsClause can not be used with TypeArgumentListSyntax.
IsNot Type Valid
IsNot id As Type Error: DeclarationAsClause can not be used with IsNot.
IsNot (Of T0..,Tn) Valid
IsNot id As (Of T0..,Tn) Error: DeclarationAsClause can not be used with TypeArgumentListSyntax. Error: DeclarationAsClause can not be used with IsNot.

Examples

Select Case obj
       Case Is s As String
            Select Case s
                   Case Is Nothing
                   Case "A"
                   Case "B"
                   Case Else
            End Select
       Case IsNot Double
       Case Else
End Select
If (TypeOf obj Is s As String) AndAlso (String.IsNullOrWhiteSpace(s) = False) Then
Else
End If

Proposal 2: Is / IsNot Relational Clauses

This is would be a natural extension to an existing clause, by the use of the keyword IsNot as well as Is in relational clauses.

ComparisionKind ::=  ("<" / "<=" / "<>" / "=" / ">=" / ">") ;;
RelationalClauseSyntax :: ("Is" / "IsNot")? ComparisionKind Expression ;; ` Defaults to `Is` if not present, to preserve existing meaning

AdamSpeight2008 avatar Jun 29 '21 15:06 AdamSpeight2008