7134529a6c3c9f1ddc3afd5d0c8e398f21267a3a9728f66032dd7e18c0bf451077c5a103e736cedf3379e2f91ae2a59547559970bf1505c1338b9ee6206021 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. var TYPE = require('../../tokenizer').TYPE;
  2. var IDENT = TYPE.Ident;
  3. var ASTERISK = 0x002A; // U+002A ASTERISK (*)
  4. var VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
  5. function eatIdentifierOrAsterisk() {
  6. if (this.scanner.tokenType !== IDENT &&
  7. this.scanner.isDelim(ASTERISK) === false) {
  8. this.error('Identifier or asterisk is expected');
  9. }
  10. this.scanner.next();
  11. }
  12. // ident
  13. // ident|ident
  14. // ident|*
  15. // *
  16. // *|ident
  17. // *|*
  18. // |ident
  19. // |*
  20. module.exports = {
  21. name: 'TypeSelector',
  22. structure: {
  23. name: String
  24. },
  25. parse: function() {
  26. var start = this.scanner.tokenStart;
  27. if (this.scanner.isDelim(VERTICALLINE)) {
  28. this.scanner.next();
  29. eatIdentifierOrAsterisk.call(this);
  30. } else {
  31. eatIdentifierOrAsterisk.call(this);
  32. if (this.scanner.isDelim(VERTICALLINE)) {
  33. this.scanner.next();
  34. eatIdentifierOrAsterisk.call(this);
  35. }
  36. }
  37. return {
  38. type: 'TypeSelector',
  39. loc: this.getLocation(start, this.scanner.tokenStart),
  40. name: this.scanner.substrToCursor(start)
  41. };
  42. },
  43. generate: function(node) {
  44. this.chunk(node.name);
  45. }
  46. };