class Indexer inherits ProperDexer is partial implements IOverloadable var _params as List # TODO: add implements support. initializer param will be: # implementsList as List, cue init(token as IToken, idToken as IToken, box as Box, name as String, paramsList as List, isNames as List, attribs as AttributeList, coverVar as BoxVar, coverAccess as String, docString as String) base.init(token, idToken, box, name, isNames, attribs, docString) _params = paramsList _coverVar = coverVar _coverAccess = coverAccess _isNames = isNames cue init(token as IToken, idToken as IToken, box as Box, name as String, paramsList as List, returnTypeOrNode as INode, isNames as List, attribs as AttributeList, docString as String) base.init(token, idToken, box, name, returnTypeOrNode, isNames, attribs, docString) _params = paramsList get params as IList is override return _params get isCallable as bool is override return false get englishName as String is override return 'indexer' def _bindInt base._bindInt for param in .params, param.bindInt def makeGetPart(token as IToken) as AbstractMethod is override _getPart = IndexerGetter(token, this) return _getPart to ! def makeSetPart(token as IToken) as AbstractMethod is override _setPart = IndexerSetter(token, this) return _setPart to ! def constructedFor(box as Box, gpToType as Dictionary) as BoxMember # CC: as same newMember = base.constructedFor(box, gpToType) to Indexer # CC: this = base. ... newMember._params = for p in _params get p.constructedFor(box, gpToType) return newMember def cobraSourceSignature as String is override return .cobraSourceSignature(true) def cobraSourceSignature(includeShared as bool) as String keyword = if(.getPart and .setPart, 'pro', if(.getPart, 'get', 'set')) sb = StringBuilder('[keyword] \[') if .params.count > 0 sep = '' for param in .params sb.append('[sep][param.name] as ') branch param.direction on Direction.In, pass on Direction.InOut, sb.append('inout ') on Direction.Out, sb.append('out ') sb.append('[param.type.name]') sep = ', ' sb.append('] as [.resultType.name]') if includeShared and .isShared # TODO: other is names sb.append(' is shared') return sb.toString class IndexerGetter inherits ProperDexerXetter cue init(token as IToken, indexer as Indexer) base.init(token, indexer, List()) # to-do: take in docString get englishName as String is override return 'indexer getter' get xetPartName as String is override return 'get' def _bindInt _returnType = .parent.returnType # must be before base base._bindInt assert _returnType for param in .parent.params, _params.add(param) class IndexerSetter inherits ProperDexerXetter cue init(token as IToken, indexer as Indexer) base.init(token, indexer, List()) # to-do: take in docString # make a token for the Param() t = token.copy t.which, t.text, t.value = 'ID', 'value', 'value' if indexer.returnType p = Param(t, indexer.returnType, isImplicit=true) else if indexer.returnTypeNode p = Param(t, indexer.returnTypeNode, isImplicit=true) else throw FallThroughException(indexer) _params.add(p) get englishName as String is override return 'indexer setter' get xetPartName as String is override return 'set' def _bindInt base._bindInt _returnType = .compiler.voidType assert _returnType for param in .parent.params, _params.add(param)