- Timestamp:
- 11/06/09 14:37:52 (3 weeks ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 modified
-
Library/Treap.fss (modified) (16 diffs)
-
ProjectFortress/compiler_tests/EmptyDoEnd.fss (added)
-
ProjectFortress/compiler_tests/EmptyDoEnd.test (added)
-
ProjectFortress/compiler_tests/TreapAndTest.fss (modified) (17 diffs)
-
ProjectFortress/src/com/sun/fortress/compiler/codegen/CodeGen.java (modified) (5 diffs)
-
ProjectFortress/src/com/sun/fortress/scala_src/typechecker/AbstractMethodChecker.scala (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Library/Treap.fss
r4294 r4318 19 19 export Treap 20 20 21 private Min_ HK: ZZ32 = -121 private Min_W : ZZ32 = -1 22 22 23 23 (* We organize the treap as a max-treap; a min-treap would work just as well. *) … … 37 37 replace(key:ZZ32, val:String): Treap = singleton(key,val) UNION self 38 38 add(key:ZZ32, val:String): Treap = self UNION singleton(key,val) 39 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_ HK,key,""))39 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_W,key,"")) 40 40 lookup(key:ZZ32, defaultValue:String): String = 41 41 root.nodeWithKey(key).rootValue(defaultValue) … … 50 50 private trait TreapNode comprises { NonEmpty, Empty } 51 51 getter isEmpty(): Boolean 52 getter hk(): ZZ3252 getter w(): ZZ32 53 53 getter min(): TreapNode 54 54 getter max(): TreapNode … … 83 83 private object Empty extends TreapNode 84 84 getter isEmpty(): Boolean = true 85 getter hk(): ZZ32 = Min_HK85 getter w(): ZZ32 = Min_W 86 86 getter min(): TreapNode = self 87 87 getter max(): TreapNode = self … … 102 102 joinNE(l: NonEmpty): NonEmpty = l 103 103 104 combine(c: CombiningOp, r: TreapNode): TreapNode = c. leftEmpty(r)105 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c. rightEmpty(l)106 107 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c. rightEmpty(lr)108 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c. leftEmpty(rr)104 combine(c: CombiningOp, r: TreapNode): TreapNode = c.rightAlone(r) 105 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c.leftAlone(l) 106 107 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.leftAlone(lr) 108 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.rightAlone(rr) 109 109 110 110 rootKey(defaultKey: ZZ32): ZZ32 = defaultKey … … 117 117 getter root(): Leaf1 118 118 (* Join this treap (on left) to r (on right); 119 assumes hk > r.hk*)119 assumes w > r.w *) 120 120 joinNEH(r: NonEmpty): NonEmpty 121 121 … … 123 123 end 124 124 125 private object Leaf1( hk0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty125 private object Leaf1(w0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty 126 126 getter isEmpty(): Boolean = false 127 127 getter k(): ZZ32 = k0 128 128 getter v(): String = v0 129 129 getter root(): Leaf1 = self 130 getter hk(): ZZ32 = hk0130 getter w(): ZZ32 = w0 131 131 getter min(): TreapNode = self 132 132 getter max(): TreapNode = self … … 134 134 mkString(withParens: Boolean): String = 135 135 if withParens then 136 "<" hk0.asString ">" self.asString136 "<" w0.asString ">" self.asString 137 137 else 138 138 self.asString … … 161 161 join(r: TreapNode): TreapNode = r.joinNE(self) 162 162 joinNE(l: NonEmpty): NonEmpty = 163 if hk0 > l.hkthen164 Node(l, hk0, k0, v0, Empty)163 if w0 > l.w then 164 Node(l, w0, k0, v0, Empty) 165 165 else 166 166 l.joinNEH(self) 167 167 end 168 168 joinNEH(r: NonEmpty): NonEmpty = 169 Node(Empty, hk0, k0, v0, r)169 Node(Empty, w0, k0, v0, r) 170 170 171 171 combine(c: CombiningOp, r: TreapNode): TreapNode = 172 172 r.combineNE(self,c) 173 173 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 174 if hk0 < l.hk then 174 if w0 > l.w then 175 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0)) 176 c.leftAlone(lt).join(m.combineRootR(c, self)).join(c.leftAlone(rt)) 177 else 175 178 l.combineNEH(c,self) 176 else177 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0))178 c.rightEmpty(lt).join(m.combineRootR(c, self)).join(c.rightEmpty(rt))179 179 end 180 180 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode = do 181 181 (lt, m, rt) = (r.splitL(k0), r.nodeWithKey(k0), r.splitR(k0)) 182 c. leftEmpty(lt).join(m.combineRootL(self, c)).join(c.leftEmpty(rt))182 c.rightAlone(lt).join(m.combineRootL(self, c)).join(c.rightAlone(rt)) 183 183 end 184 184 … … 193 193 Leaf1(randomZZ32(2147483647), key, val) 194 194 195 private object Node(left: TreapNode, hk0: ZZ32, k0: ZZ32, v0: String, right: TreapNode)195 private object Node(left: TreapNode, w0: ZZ32, k0: ZZ32, v0: String, right: TreapNode) 196 196 extends NonEmpty 197 197 getter isEmpty(): Boolean = false 198 198 getter k(): ZZ32 = k0 199 199 getter v(): String = v0 200 getter root(): Leaf1 = Leaf1( hk0, k0, v0)201 getter hk(): ZZ32 = hk0200 getter root(): Leaf1 = Leaf1(w0, k0, v0) 201 getter w(): ZZ32 = w0 202 202 getter min(): TreapNode = 203 203 if left.isEmpty then self.root else left.min end … … 209 209 (l,r) = (left.mkString(withParens), right.mkString(withParens)) 210 210 if withParens then 211 "(" l ") <" hk0.asString ">" mid " (" r ")"211 "(" l ") <" w0.asString ">" mid " (" r ")" 212 212 else 213 213 lh = if l.isEmpty then mid else l " " mid end … … 220 220 if key < k0 then 221 221 (l, match, r) = left.split(key) 222 (l, match, node(r, hk0, k0, v0, right))222 (l, match, node(r, w0, k0, v0, right)) 223 223 elif key > k0 then 224 224 (l, match, r) = right.split(key) 225 (node(left, hk0, k0, v0, l), match, r)225 (node(left, w0, k0, v0, l), match, r) 226 226 else 227 227 (left, self, right) … … 233 233 left.splitL(key) 234 234 elif key > k0 then 235 Node(left, hk0, k0, v0, right.splitL(key))235 Node(left, w0, k0, v0, right.splitL(key)) 236 236 else 237 237 left … … 249 249 splitR(key:ZZ32): TreapNode = 250 250 if key < k0 then 251 Node(left.splitR(key), hk0, k0, v0, right)251 Node(left.splitR(key), w0, k0, v0, right) 252 252 elif key > k0 then 253 253 right.splitR(key) … … 258 258 join(r: TreapNode): TreapNode = r.joinNE(self) 259 259 joinNE(l: NonEmpty): NonEmpty = 260 if hk0 > l.hkthen261 Node(l.join(left), hk0, k0, v0, right)260 if w0 > l.w then 261 Node(l.join(left), w0, k0, v0, right) 262 262 else 263 263 l.joinNEH(self) 264 264 end 265 265 joinNEH(r: NonEmpty): NonEmpty = 266 Node(left, hk0, k0, v0, right.join(r))266 Node(left, w0, k0, v0, right.join(r)) 267 267 268 268 combine(c: CombiningOp, r: TreapNode): TreapNode = 269 269 r.combineNE(self,c) 270 270 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 271 if hk0 < l.hkthen271 if w0 < l.w then 272 272 l.combineNEH(c,self) 273 273 else … … 288 288 289 289 private trait CombiningOp 290 leftEmpty(right: TreapNode): TreapNode291 rightEmpty(left: TreapNode): TreapNode290 rightAlone(right: TreapNode): TreapNode 291 leftAlone(left: TreapNode): TreapNode 292 292 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode 293 293 end 294 294 295 295 private object UnionOp extends CombiningOp 296 leftEmpty(right: TreapNode): TreapNode = right297 rightEmpty(left: TreapNode): TreapNode = left296 rightAlone(right: TreapNode): TreapNode = right 297 leftAlone(left: TreapNode): TreapNode = left 298 298 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 299 299 end 300 300 301 301 private object IntersectionOp extends CombiningOp 302 leftEmpty(right: TreapNode): TreapNode = Empty303 rightEmpty(left: TreapNode): TreapNode = Empty302 rightAlone(right: TreapNode): TreapNode = Empty 303 leftAlone(left: TreapNode): TreapNode = Empty 304 304 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 305 305 end 306 306 307 307 private object DifferenceOp extends CombiningOp 308 leftEmpty(right: TreapNode): TreapNode = Empty309 rightEmpty(left: TreapNode): TreapNode = left308 rightAlone(right: TreapNode): TreapNode = Empty 309 leftAlone(left: TreapNode): TreapNode = left 310 310 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 311 311 end 312 312 313 313 private object SymdiffOp extends CombiningOp 314 leftEmpty(right: TreapNode): TreapNode = right315 rightEmpty(left: TreapNode): TreapNode = left314 rightAlone(right: TreapNode): TreapNode = right 315 leftAlone(left: TreapNode): TreapNode = left 316 316 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 317 317 end -
trunk/ProjectFortress/compiler_tests/TreapAndTest.fss
r4317 r4318 1 (******************************************************************************* 2 Copyright 2009 Sun Microsystems, Inc., 3 4150 Network Circle, Santa Clara, California 95054, U.S.A. 4 All rights reserved. 5 6 U.S. Government Rights - Commercial software. 7 Government users are subject to the Sun Microsystems, Inc. standard 8 license agreement and applicable provisions of the FAR and its supplements. 9 10 Use is subject to license terms. 11 12 This distribution may include materials developed by third parties. 13 14 Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered 15 trademarks of Sun Microsystems, Inc. in the U.S. and other countries. 16 ******************************************************************************) 17 1 18 export Executable 2 19 … … 55 72 56 73 57 58 59 Min_HK : ZZ32 = -1 74 Min_W : ZZ32 = -1 60 75 61 76 (* We organize the treap as a max-treap; a min-treap would work just as well. *) … … 67 82 getter min(): Treap = Treap(root.min) 68 83 getter max(): Treap = Treap(root.max) 84 (* Union and intersection are left-biased *) 69 85 opr UNION(self, other: Treap): Treap = Treap(root.combine(UnionOp, other.root)) 70 86 opr INTERSECTION(self, other: Treap): Treap = Treap(root.combine(IntersectionOp, other.root)) … … 73 89 opr SYMDIFF(self, other: Treap): Treap = 74 90 Treap(root.combine(SymdiffOp, other.root)) 91 containsKey(key:ZZ32): Boolean = NOT root.nodeWithKey(key).isEmpty 75 92 replace(key:ZZ32, val:String): Treap = singleton(key,val) UNION self 76 93 add(key:ZZ32, val:String): Treap = self UNION singleton(key,val) 77 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_ HK,key,""))94 remove(key:ZZ32): Treap = self DIFFERENCE Treap(Leaf1(Min_W,key,"")) 78 95 lookup(key:ZZ32, defaultValue:String): String = 79 96 root.nodeWithKey(key).rootValue(defaultValue) … … 88 105 trait TreapNode comprises { NonEmpty, Empty } 89 106 getter isEmpty(): Boolean 90 getter hk(): ZZ32107 getter w(): ZZ32 91 108 getter min(): TreapNode 92 109 getter max(): TreapNode … … 121 138 object Empty extends TreapNode 122 139 getter isEmpty(): Boolean = true 123 getter hk(): ZZ32 = Min_HK140 getter w(): ZZ32 = Min_W 124 141 getter min(): TreapNode = self 125 142 getter max(): TreapNode = self … … 140 157 joinNE(l: NonEmpty): NonEmpty = l 141 158 142 combine(c: CombiningOp, r: TreapNode): TreapNode = c. leftEmpty(r)143 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c. rightEmpty(l)144 145 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c. rightEmpty(lr)146 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c. leftEmpty(rr)159 combine(c: CombiningOp, r: TreapNode): TreapNode = c.rightAlone(r) 160 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = c.leftAlone(l) 161 162 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.leftAlone(lr) 163 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.rightAlone(rr) 147 164 148 165 rootKey(defaultKey: ZZ32): ZZ32 = defaultKey … … 151 168 152 169 trait NonEmpty extends TreapNode comprises { Leaf1, Node } 170 getter isEmpty(): Boolean = false 153 171 getter k(): ZZ32 154 172 getter v(): String 155 173 getter root(): Leaf1 174 175 join(r: TreapNode): TreapNode = r.joinNE(self) 156 176 (* Join this treap (on left) to r (on right); 157 assumes hk > r.hk*)177 assumes w > r.w *) 158 178 joinNEH(r: NonEmpty): NonEmpty 159 179 180 combine(c: CombiningOp, r: TreapNode): TreapNode = 181 r.combineNE(self,c) 160 182 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode 161 end 162 163 object Leaf1(hk0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty 164 getter isEmpty(): Boolean = false 183 184 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self.root) 185 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self.root,rr) 186 187 rootKey(defaultKey: ZZ32): ZZ32 = self.k 188 rootValue(defaultValue: String): String = self.v 189 end 190 191 object Leaf1(w0: ZZ32, k0: ZZ32, v0: String) extends NonEmpty 165 192 getter k(): ZZ32 = k0 166 193 getter v(): String = v0 167 194 getter root(): Leaf1 = self 168 getter hk(): ZZ32 = hk0195 getter w(): ZZ32 = w0 169 196 getter min(): TreapNode = self 170 197 getter max(): TreapNode = self … … 172 199 mkString(withParens: Boolean): String = 173 200 if withParens then 174 "<" hk0.asString ">" self.asString201 "<" w0.asString ">" self.asString 175 202 else 176 203 self.asString … … 197 224 if key < k0 then self else Empty end 198 225 199 join(r: TreapNode): TreapNode = r.joinNE(self)200 226 joinNE(l: NonEmpty): NonEmpty = 201 if hk0 > l.hkthen202 Node(l, hk0, k0, v0, Empty)227 if w0 > l.w then 228 Node(l, w0, k0, v0, Empty) 203 229 else 204 230 l.joinNEH(self) 205 231 end 206 232 joinNEH(r: NonEmpty): NonEmpty = 207 Node(Empty, hk0, k0, v0, r) 208 209 combine(c: CombiningOp, r: TreapNode): TreapNode = 210 r.combineNE(self,c) 233 Node(Empty, w0, k0, v0, r) 234 211 235 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 212 if hk0 < l.hk then 236 if w0 > l.w then 237 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0)) 238 c.leftAlone(lt).join(m.combineRootR(c, self)).join(c.leftAlone(rt)) 239 else 213 240 l.combineNEH(c,self) 214 else215 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0))216 c.rightEmpty(lt).join(m.combineRootR(c, self)).join(c.rightEmpty(rt))217 241 end 218 242 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode = do 219 243 (lt, m, rt) = (r.splitL(k0), r.nodeWithKey(k0), r.splitR(k0)) 220 c.leftEmpty(lt).join(m.combineRootL(self, c)).join(c.leftEmpty(rt)) 221 end 222 223 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self) 224 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self,rr) 225 226 rootKey(defaultKey: ZZ32): ZZ32 = k0 227 rootValue(defaultValue: String): String = v0 244 c.rightAlone(lt).join(m.combineRootL(self, c)).join(c.rightAlone(rt)) 245 end 228 246 end 229 247 … … 231 249 Leaf1(randomZZ32(2147483647), key, val) 232 250 233 object Node(left: TreapNode, hk0: ZZ32, k0: ZZ32, v0: String, right: TreapNode)251 object Node(left: TreapNode, w0: ZZ32, k0: ZZ32, v0: String, right: TreapNode) 234 252 extends NonEmpty 235 getter isEmpty(): Boolean = false236 253 getter k(): ZZ32 = k0 237 254 getter v(): String = v0 238 getter root(): Leaf1 = Leaf1( hk0, k0, v0)239 getter hk(): ZZ32 = hk0255 getter root(): Leaf1 = Leaf1(w0, k0, v0) 256 getter w(): ZZ32 = w0 240 257 getter min(): TreapNode = 241 258 if left.isEmpty then self.root else left.min end … … 247 264 (l,r) = (left.mkString(withParens), right.mkString(withParens)) 248 265 if withParens then 249 "(" l ") <" hk0.asString ">" mid " (" r ")"266 "(" l ") <" w0.asString ">" mid " (" r ")" 250 267 else 251 268 lh = if l.isEmpty then mid else l " " mid end … … 258 275 if key < k0 then 259 276 (l, match, r) = left.split(key) 260 (l, match, node(r, hk0, k0, v0, right))277 (l, match, node(r, w0, k0, v0, right)) 261 278 elif key > k0 then 262 279 (l, match, r) = right.split(key) 263 (node(left, hk0, k0, v0, l), match, r)280 (node(left, w0, k0, v0, l), match, r) 264 281 else 265 282 (left, self, right) … … 271 288 left.splitL(key) 272 289 elif key > k0 then 273 Node(left, hk0, k0, v0, right.splitL(key))290 Node(left, w0, k0, v0, right.splitL(key)) 274 291 else 275 292 left … … 287 304 splitR(key:ZZ32): TreapNode = 288 305 if key < k0 then 289 Node(left.splitR(key), hk0, k0, v0, right)306 Node(left.splitR(key), w0, k0, v0, right) 290 307 elif key > k0 then 291 308 right.splitR(key) … … 294 311 end 295 312 296 join(r: TreapNode): TreapNode = r.joinNE(self)297 313 joinNE(l: NonEmpty): NonEmpty = 298 if hk0 > l.hkthen299 Node(l.join(left), hk0, k0, v0, right)314 if w0 > l.w then 315 Node(l.join(left), w0, k0, v0, right) 300 316 else 301 317 l.joinNEH(self) 302 318 end 303 319 joinNEH(r: NonEmpty): NonEmpty = 304 Node(left, hk0, k0, v0, right.join(r)) 305 306 combine(c: CombiningOp, r: TreapNode): TreapNode = 307 r.combineNE(self,c) 320 Node(left, w0, k0, v0, right.join(r)) 321 308 322 combineNE(l: NonEmpty, c: CombiningOp): TreapNode = 309 if hk0 < l.hk then 310 l.combineNEH(c,self) 311 else 323 if w0 > l.w then 312 324 (lt, m, rt) = (l.splitL(k0), l.nodeWithKey(k0), l.splitR(k0)) 313 325 lt.combine(c,left).join(m.combineRootR(c, self.root)).join(rt.combine(c,right)) 326 else 327 l.combineNEH(c,self) 314 328 end 315 329 combineNEH(c: CombiningOp, r: NonEmpty): TreapNode = do … … 317 331 left.combine(c,lt).join(m.combineRootL(self.root, c)).join(right.combine(c,rt)) 318 332 end 319 320 combineRootL(lr: Leaf1, c: CombiningOp): TreapNode = c.combine(lr,self.root)321 combineRootR(c: CombiningOp, rr: Leaf1): TreapNode = c.combine(self.root,rr)322 323 rootKey(defaultKey: ZZ32): ZZ32 = k0324 rootValue(defaultValue: String): String = v0325 333 end 326 334 327 335 trait CombiningOp 328 leftEmpty(right: TreapNode): TreapNode329 rightEmpty(left: TreapNode): TreapNode336 rightAlone(right: TreapNode): TreapNode 337 leftAlone(left: TreapNode): TreapNode 330 338 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode 331 339 end 332 340 333 341 object UnionOp extends CombiningOp 334 leftEmpty(right: TreapNode): TreapNode = right335 rightEmpty(left: TreapNode): TreapNode = left342 rightAlone(right: TreapNode): TreapNode = right 343 leftAlone(left: TreapNode): TreapNode = left 336 344 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 337 345 end 338 346 339 347 object IntersectionOp extends CombiningOp 340 leftEmpty(right: TreapNode): TreapNode = Empty341 rightEmpty(left: TreapNode): TreapNode = Empty348 rightAlone(right: TreapNode): TreapNode = Empty 349 leftAlone(left: TreapNode): TreapNode = Empty 342 350 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = leftArg 343 351 end 344 352 345 353 object DifferenceOp extends CombiningOp 346 leftEmpty(right: TreapNode): TreapNode = Empty347 rightEmpty(left: TreapNode): TreapNode = left354 rightAlone(right: TreapNode): TreapNode = Empty 355 leftAlone(left: TreapNode): TreapNode = left 348 356 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 349 357 end 350 358 351 359 object SymdiffOp extends CombiningOp 352 leftEmpty(right: TreapNode): TreapNode = right353 rightEmpty(left: TreapNode): TreapNode = left360 rightAlone(right: TreapNode): TreapNode = right 361 leftAlone(left: TreapNode): TreapNode = left 354 362 combine(leftArg: Leaf1, rightArg: Leaf1): TreapNode = Empty 355 363 end -
trunk/ProjectFortress/src/com/sun/fortress/compiler/codegen/CodeGen.java
r4315 r4318 524 524 private void doStatements(List<Expr> stmts) { 525 525 int onStack = 0; 526 if (stmts.isEmpty()) { 527 pushVoid(); 528 return; 529 } 526 530 for ( Expr e : stmts ) { 527 531 popAll(onStack); … … 555 559 inABlock=oldInABlock; 556 560 } 561 557 562 public void forChainExpr(ChainExpr x) { 558 563 debug( "forChainExpr", x); … … 651 656 652 657 dumpClass( packageAndClassName ); 653 658 654 659 try { 655 660 jos.close(); … … 2410 2415 Type receiverType = exprType(obj); 2411 2416 if (!(receiverType instanceof TraitType)) { 2412 sayWhat(x, "receiver type is not TraitType in " + x);2417 sayWhat(x, "receiver type "+receiverType+" is not TraitType in " + x); 2413 2418 } 2414 2419 … … 2482 2487 public void for_RewriteFnApp(_RewriteFnApp x) { 2483 2488 debug("for_RewriteFnApp ", x, 2484 " args = ", x.getArgument(), " function = ", x.getFunction(), 2489 " args = ", x.getArgument(), " function = ", x.getFunction(), 2485 2490 " function class = ", x.getFunction()); 2486 2491 // This is a little weird. If a function takes no arguments the parser gives me a void literal expr -
trunk/ProjectFortress/src/com/sun/fortress/scala_src/typechecker/AbstractMethodChecker.scala
r4309 r4318 74 74 val inherited = inheritedMethods(traits, extendsC, Set(), typeAnalyzer) 75 75 .map(t => t._1.asInstanceOf[IdOrOp].getText) 76 for ( d <- decls ; if d.isInstanceOf[FnDecl] ) { 77 if ( NU.isFunctionalMethod(NU.getParams(d.asInstanceOf[FnDecl])) && 78 ! inherited.exists(NU.getName(d.asInstanceOf[FnDecl]).asInstanceOf[IdOrOp].getText.equals(_)) ) 79 error(span, "Object expressions should not define any new " + 80 "functional methods.") 81 } 76 for { 77 d <- decls; 78 if d.isInstanceOf[FnDecl]; 79 if NU.isFunctionalMethod(NU.getParams(d.asInstanceOf[FnDecl])); 80 if !inherited.exists(NU.getName(d.asInstanceOf[FnDecl]).asInstanceOf[IdOrOp] 81 .getText.equals(_)) 82 } error(span, "Object expressions should not define any new " + 83 "functional methods.") 82 84 83 85 case _ => super.walk(node) … … 95 97 typeAnalyzer = typeAnalyzer.extend(sparams, None) 96 98 val toCheck = inheritedAbstractMethods(extendsC) 97 for ( (owner, d) <- toCheck ) { 98 if ( ! implement(d, decls, owner) ) { 99 for ( (owner, d) <- toCheck; if (!implement(d, decls, owner)) ) { 99 100 error(span, 100 101 "The inherited abstract method " + d + " from the trait " + owner + 101 102 "\n in the object " + name + 102 103 " is not defined in the component " + componentName + ".") 103 }104 104 } 105 105 typeAnalyzer = oldTypeAnalyzer … … 129 129 private def collectAbstractMethods(name: IdOrOp, decls: List[Decl]) = { 130 130 val set = new HashSet[FnDecl] 131 decls.foreach( (d: Decl) => d match { 132 case fd@SFnDecl(_,SFnHeader(_,mods,_,_,_,_,_,_),_,body,_) => 133 if ( component.typeConses.containsKey(name) ) { 134 if ( ! body.isDefined ) set += fd 135 } else if ( mods.isAbstract ) set += fd 136 case _ => }) 131 for ( fd@SFnDecl(_,SFnHeader(_,mods,_,_,_,_,_,_),_,body,_) <- decls ) { 132 if ( component.typeConses.containsKey(name) ) { 133 if ( ! body.isDefined ) set += fd 134 } else if ( mods.isAbstract ) set += fd 135 } 137 136 set 138 137 }

