I tried this in scala 2.9.1 and scala 2.10 M2.
Here's my scala transcript after running the scala command from the terminal:
scala> case class Person(val name: String) defined class Person scala> val friends = List(Person("Fred")) friends: List[Person] = List(Person(Fred)) scala> friends.head.TAB asInstanceOf isInstanceOf toString scala> friends.head.name res0: String = Fred scala> :t friends List[Person] scala> :t friends.head Person
Scala knows that friends is of type List[Person] and that friends.head is of type Person. Shouldn't it be able to suggest name as a potential completion?
If that's not supported, I'd be happy to look into fixing it. I peeked around in the source code (scala-2.9.1.final-sources/src/jline/src/main/java/scala/tools/jline/console/completer) but I'd appreciate any pointers to how to fix it.
Thanks.
Tim
You're right, it's not supported. The prefix (friends.head
) isn't actually run through the type-checker to determine the accurate type.
If you want to play around with this, you should use the latest version of Scala, and run with -Dscala.repl.debug
to see what's happening.
scala> ps.head.
complete(ps.head., 8) last = (, -1), verbosity: 0
List[$read$$iw$$iw$Person] completions ==> List(removeDuplicates, toStream, stringPrefix, reverse, span, dropWhile, takeWhile, splitAt, takeRight, slice, drop, take, toList, +:, ++, mapConserve, reverse_:::, :::, ::, companion, lastIndexWhere, indexWhere, segmentLength, isDefinedAt, lengthCompare, sameElements, dropRight, last, reduceRight, reduceLeft, foldRight, foldLeft, find, count, exists, forall, foreach, apply, length, productPrefix, productIterator, seq, corresponds, iterator, toSeq, toString, view, indices, sorted, sortBy, sortWith, padTo, :+, updated, patch, distinct, intersect, diff, union, contains, containsSlice, lastIndexOfSlice, indexOfSlice, endsWith, startsWith, reverseIterator, reverseMap, combinations, permutations, size, lastIndexOf, indexOf, prefixLength, lift, andThen, orElseFast, orElse, compose, canEqual, zipWithIndex, zipAll, zip, copyToArray, sliding, grouped, head, toIterator, toIterable, isEmpty, transpose, flatten, unzip3, unzip, genericBuilder, withFilter, toTraversable, inits, tails, init, lastOption, tail, headOption, scanRight, scanLeft, scan, groupBy, partition, collect, filterNot, filter, flatMap, map, ++:, hasDefiniteSize, repr, isTraversableAgain, par, addString, mkString, toMap, toSet, toBuffer, toIndexedSeq, toArray, copyToBuffer, minBy, maxBy, max, min, product, sum, aggregate, fold, reduceOption, reduce, reduceRightOption, reduceLeftOption, :\, /:, collectFirst, nonEmpty, /:\, asInstanceOf, isInstanceOf, productArity, productElement)
List[$read$$iw$$iw$Person] -> 'head' ==> Some(()Object (31 members))
()Object completions ==> List(toString, asInstanceOf, isInstanceOf)
package <root> completions ==> List(target, project, lib_managed, quicktime, ch, scala, apple, java, com, sunw, javax, sun, org, asInstanceOf, isInstanceOf, toString)
package <root> -> 'ps' ==> None
object Predef -> 'ps' ==> None
package scala -> 'ps' ==> None
package java.lang -> 'ps' ==> None
tryCompletion(Parsed(ps.head. / 8), _) lastBuf = ps.head., lastCursor = 8, p.position = 8
asInstanceOf isInstanceOf toString
You probably should seek the advice of Paul Phillips, the REPL author. I'm sure he's considered (if not half implemented) this already, and would know the difficulty better than anyone else.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With