Private Function ParseParameters(meth as RBMemberMethod) As ParameterDefinition()
const kStateDefault = 0
const kStateLookingForType = 1
const kStateLookingForArrayDimensions = 4
const kStateDefaultValue = 3
const kStateReset = 9
dim chars() as string = meth.parameters.split( "" )
dim buffer as string
dim results() as ParameterDefinition
dim item as new ParameterDefinition()
dim state as integer
dim inQuotes as boolean
for i as integer = 0 to ubound( chars ) + 1
dim char as string
if i <= ubound( chars ) then _
char = chars( i )
select case state
case kStateReset
// reset for the next param
results.append( item )
item = new ParameterDefinition()
state = kStateDefault
buffer = ""
inQuotes = False
i = i - 1
continue for i
case kStateDefault
if char = " " or char = "(" then
if buffer = "as" then
state = kStateLookingForType
elseif buffer = "optional" then
item.isOptional = True
elseif buffer = "byref" then
item.isByref = True
elseif buffer = "paramarray" then
item.isParamarray = True
elseif buffer = "assigns" then
item.isAssigns = True
elseif buffer = "extends" then
item.isExtends = True
elseif buffer = "byval" then
item.isByref = False
elseif buffer <> "" then
item.name = buffer
end if
buffer = ""
if char = "(" then
state = kStateLookingForArrayDimensions
item.dimensions = 1
end if
continue for i
end if
buffer = buffer + char
case kStateLookingForArrayDimensions
// valid chars for state: " ", ")", ","
if char = ")" then _
state = kStateDefault
if char = "," then _
item.dimensions = item.dimensions + 1
case kStateLookingForType
if ( char = " " or char = "," or char = "=" or char = "" ) and buffer <> "" then
item.type = buffer
buffer = ""
end if
if char = "," then
state = kStateReset
continue for i
end if
if char = "=" then
state = kStateDefaultValue
continue for i
end if
if char = " " or char = "" then _
continue for i
buffer = buffer + char
case kStateDefaultValue
if char = " " and not inQuotes then _
continue for i
if ( char = "," and not inQuotes ) or char = "" then
item.defaultValue = buffer
item.isOptional = True
state = kStateReset
continue for i
end if
if char = """" then
inQuotes = not inQuotes
continue for i
end if
buffer = buffer + char
end select
next
results.append( item )
return results
End Function