@Option
Directive
Makes sure that your code agrees with a given style or syntax. And also lets you change how some functions operate.
Syntax
@Option options…
Parts
options
- Mandatory one or more identifiers
Instructions
Args
@Option Args ByName { Boolean | Literal }
Procedure calls that have one or more Booleans or literals for arguments can show a warning if not passed by name.
The warning is applicable only if you supply two or more such arguments to the procedure.
The warning has a level of Warning4
.
See Passing Arguments by Position and by Name for more information.
@Option Args Enclosed
Applicable to: Call Statement, Function Statement, Method Statement, Sub Statement.
You must write parentheses (( )
) around (1) arguments for procedure calls and (2) parameters for procedure declarations.
Procedure declarations start with one of these keywords: Function
, Method
, or Sub
.
You must supply empty parentheses if a procedure has no parameters.
And if a procedure call does not have arguments, you must write empty parentheses or a question mark (?
).
Charset
@Option charset Latin
All names must use the Latin character set. That is letters (‘A’ thru ‘Z’), digits (‘0’ thru ‘9’), and underscores (‘_’).
Dim
Applicable to: Dim Statement, Property Statement.
@Option Dim
You must start a variable declaration with Dim
, and not Var
.
For example:
Dim x As Int32
@Option Var
You must start a variable declaration with Var
, and not Dim
.
For example:
Var x As Int32
End
Applicable to: Keywords §End.
@Option End Block
You must write End
plus the block type.
For example:
While condition
' ...
End While
@Option End [ No Block ]
You must write End
without the block type.
For example:
While condition
' ...
End
@Option End For ID
Applicable to: For Statement.
You can use this only with “@Option End Block
”.
You must complete all statements of the type For
with End For
, plus the loop counter.
For example:
For index = 1 To 10
' ...
End For index
@Option End For [ No ID ]
Applicable to: For Statement.
You can use this only with “@Option End Block
”.
You must complete all statements of the type For
with End For
, without the loop counter.
For example:
For index = 1 To 10
' ...
End For
Enum
Applicable to: Enum Statement.
@Option Enum Equals
You must give members of the statement Enum
values, assigned with the operator “=
”.
For example:
Enum ordinal Is Int32
first = 1
second = 2
End
If
Applicable to: If…Else Statement.
@Option If Then
You must write Then
with all statements of the type If…Else
.
For example:
If condition1 Then
' ...
Else If condition2 Then
' ...
End
@Option If [ No Then ]
You must not write Then
with the block construct of the statement If…Else
.
For example:
If condition1
' ...
Else If condition2
' ...
End
@Option If End
You must complete statements of the type If…Else
with End
or End If
.
If you use “@Option End Block
”, you must write End If
.
Thus, use of the one-line construct becomes an error.
Last
@Option Last
No more directives of the type @Option
are permitted after this one.
Mod
Applicable to: Mod Operator, Mod= Operator, Rem Operator, Rem= Operator.
@Option Mod Floored
Changes how the operators Mod
and Mod=
operate.
Usually the two operators Mod
and Rem
operate the same.
They return the remainder after division.
Usually the sign of the remainder comes from the left side, or dividend. This type of operation is known as truncated modulo. But this directive causes the sign of the remainder to come from the right side, or divisor. This alternative operation is known as floored modulo.
Example | Truncated | Floored |
---|---|---|
+9 Mod +4 |
1 | 1 |
-9 Mod +4 |
-1 | 1 |
+9 Mod -4 |
1 | -1 |
-9 Mod -4 |
-1 | -1 |
New
Applicable to: New Statement.
@Option New
You must start New
Statements with New
.
If you use “@Option End Block
”, you must complete the block construct with End New
.
For example:
New Files #logs, "*.log"
New Menu #file, "File"
Begin
' ...
End New
Optional
Applicable to: Optional.
@Option Optional Equals
You must give a value to an optional parameter with the operator “=
”.
For example:
Method ReadData(Optional path As String = ".")
' ...
End
Select
Applicable to: Select…Case Statement.
@Option Select Case
You must write Select Case
in all statements of the type Select…Case
.
For example:
Select Case test
' ...
End
@Option Select [ No Case ]
You must not write the keyword Case
after Select
in all statements of the type Select…Case
.
@Option Select Strict
You must do something for all possible values of the test expressions of statements of the type select…Case
.
You can try to supply a sufficient number of values with the clause Case
.
But if that is not possible, you must supply the clause Case Else
.
This is the same as if you used the modifier @Strict
with all such statements.
For example:
Select minutes
Case 0 To 29
' ...
Case 30 To 59
' ...
Case Else
Raise RangeError(minutes)
End
@Option Select Strict String
You must write the clause “Case Else
” for all statements of the type Select…Case
that compare strings.
But Case Else
will not be mandatory for other data types.
String
@Option String Backslash
You must write a path string with backslashes, not slashes. For example:
Const BITMAP_DIR = "media"\"bmp"
@Option String Slash
You must write a path string with slashes, not backslashes. For example:
Const BITMAP_DIR = "media"/"bmp"
Test
@Option Test
The module contains only unit tests.
A unit test is a procedure with the modifier @Test
.
See @Test
for more information.
@Option Test Compiler
Causes ViviFire to parse inline comments to find commands used in tests of the compiler. You must not use this directive unless you do work on the compiler. Block comments are ignored as usual.
These commands (expect-error
and expect-warning
) cause the compiler to ignore errors and warnings before the applicable command.
The comment must be on the same line as the statement, or the line immediately after the statement.
Then you must write the error or warning message between a pair of two braces ({{ }}
).
The compiler ignores the remaining comment until the end of the line.
An example follows.
@Option Test Compiler
x = 1 // expect-error {{Variable was not declared}} TBD
Const _BAD_NAME = "The user name is not valid."
' expect-error {{Invalid Name}}
Type
@Option Type { Each | Param | Var }
Applicable to: Dim Statement, Parameter List.
You must supply a data type for each name in the given location.
Type Param
– Each parameter in a parameter list of a procedure must have a data type.Type Var
– Each variable in a variable declaration must have a data type.Type Each
– All parameters and variables must have a Data Type.
You can supply the data type as follows:
- Type name:
name As Int16
- Unit name:
name In meters
- Type characters:
name%
,name!
,name@
, orname$
- Inferred:
name = 42
Without this directive, you can write code as follows:
Sub Add(a, b As Int32) As Int32
Return a + b
End Sub
Var x, y, sum As Int32
PromptInput "Enter first number: ", x
PromptInput "Enter second number: ", y
sum = Add(x, y)
PrintLine "The sum of {x} and {y} is {sum}."
With Type Param
(or Type Each
), The line that follows becomes an error.
Sub Add(a, b As Int32) As Int32
You must change it to the code that follows:
Sub Add(a As Int32, b As Int32) As Int32
With Type Var
(or Type Each
), the line that follows is a also an error.
Var x, y, sum As Int32
You must change it to the code that follows:
Var x As Int32, y As Int32, sum As Int32
@Option Type { Extends | Inherits | Is }
Applicable to: Class Statement, Enum Statement, Struct statement.
You must use only one of these keywords between the name of the type and a base data type:
Extends
, Inherits
, or Is
.
For example:
@Option Type Is
' Correct.
Class Foo Is BaseType
' ...
End
' Incorrect.
Class Bar Extends BaseType
' ...
End
Unit
@Option Unit Full
You must write the full names of units of measure. Thus “kilometer” is correct syntax, but “km” is incorrect.
Warning
@Option Warning[1-5]
Option | ViviFire shows |
---|---|
Warning1 |
Only warnings with a risk more than 75% to cause problems |
Warning2 |
Only warnings with a risk more than 50% to cause problems |
Warning3 |
Only warnings with a risk more than 25% to cause problems |
Warning4 or Warning |
Only warnings with a risk more than 0% to cause problems (Default) |
Warning5 |
All warnings, if they cause problems or not. |
@Option Warning[1-5] Error
When you add Error
, all warnings at that level and below become errors.
You can use the two syntaxes together if the level for errors is less than the level for warnings.
An example follows.
@Option Warning1 Error
@Option Warning5
When
Applicable to: Exit When Clause.
@Option When Each
You must write When Each
, and not When Else
, for statements in the block Exit When
.
For example:
While condition
Exit When
' ...
When Each
' ...
End
@Option When Else
You must write When Else
, and not When Each
, for statements in the block Exit When
.
For example:
While condition
Exit When
' ...
When Else
' ...
End
@Option When ID
You must write all the labels that are after each When
(in a loop) also after Exit When
.
Thus it becomes an error not to supply this list.
For example:
While NextResult?
Exit When found ' mandatory
When Each
' ...
When found
' ...
End