     let valueType: NonGenericTypeContext
     let RABRACKET: RecognizedToken
     
+    let tokens: [RecognizedToken]
+    var text: String {
+        get {
+            return tokens.reduce("") { (soFar, soGood) in
+                return soFar + soGood.string
+            }
+        }
+    }
+    
     static func consume(tokens: [RecognizedToken]) throws -> (consumedIndex: Array<RecognizedToken>.Index, context: DictGenericTypeContext) {
         let contextStart = skipNLAndWS(tokens: tokens, from: tokens.startIndex)
         var consumedIndex = contextStart

            nonGenericType = nil
        }
        guard nonGenericType == nil else {
            return (consumedIndex, TypeContext(nonGenericType: nonGenericType, genericType: nil))
        }
        let (genericTypeConsumed, genericTypeContext) = try GenericTypeContext.consume(tokens: tokens)
        consumedIndex = tokens.index(consumedIndex, offsetBy: genericTypeConsumed)
        return (consumedIndex, TypeContext(nonGenericType: nil, genericType: genericTypeContext))
    }
}

struct NonGenericTypeContext: ParserContext {
    let baseType: BaseTypeContext?
    let customType: IdentifierContext?
    
    static func consume(tokens: [RecognizedToken]) throws -> (consumedIndex: Array<RecognizedToken>.Index, context: NonGenericTypeContext) {
        let contextStart = skipNLAndWS(tokens: tokens, from: tokens.startIndex)

        }
        let rabracketToken = tokens[consumedIndex]
        consumedIndex = tokens.index(after: consumedIndex)
        return (consumedIndex, ArrayGenericTypeContext(ARRAY: arrayToken, LABRACKET: labracketToken, contentType: contentTypeContext, RABRACKET: rabracketToken, tokens: tokens.subarray(range: Range(uncheckedBounds: (contextStart, consumedIndex)))))
    }
}

