Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scala generics and console auto complete

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

like image 894
Tim Stewart Avatar asked Feb 25 '12 06:02

Tim Stewart


1 Answers

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.

like image 129
retronym Avatar answered Oct 18 '22 11:10

retronym