util.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package js
  2. import (
  3. "io"
  4. )
  5. func isLHSExpr(i IExpr) bool {
  6. switch i.(type) {
  7. case *CommaExpr, *CondExpr, *YieldExpr, *ArrowFunc, *BinaryExpr, *UnaryExpr:
  8. return false
  9. }
  10. return true
  11. }
  12. // AsIdentifierName returns true if a valid identifier name is given.
  13. func AsIdentifierName(b []byte) bool {
  14. if len(b) == 0 || !identifierStartTable[b[0]] {
  15. return false
  16. }
  17. i := 1
  18. for i < len(b) {
  19. if identifierTable[b[i]] {
  20. i++
  21. } else {
  22. return false
  23. }
  24. }
  25. return true
  26. }
  27. // AsDecimalLiteral returns true if a valid decimal literal is given.
  28. func AsDecimalLiteral(b []byte) bool {
  29. if len(b) == 0 || (b[0] < '0' || '9' < b[0]) && (b[0] != '.' || len(b) == 1) {
  30. return false
  31. } else if b[0] == '0' {
  32. return len(b) == 1
  33. }
  34. i := 1
  35. for i < len(b) && '0' <= b[i] && b[i] <= '9' {
  36. i++
  37. }
  38. if i < len(b) && b[i] == '.' && b[0] != '.' {
  39. i++
  40. for i < len(b) && '0' <= b[i] && b[i] <= '9' {
  41. i++
  42. }
  43. }
  44. return i == len(b)
  45. }
  46. type Indenter struct {
  47. w io.Writer
  48. b []byte
  49. }
  50. func NewIndenter(w io.Writer, n int) Indenter {
  51. if wi, ok := w.(Indenter); ok {
  52. w = wi.w
  53. n += len(wi.b)
  54. }
  55. b := make([]byte, n)
  56. for i := range b {
  57. b[i] = ' '
  58. }
  59. return Indenter{
  60. w: w,
  61. b: b,
  62. }
  63. }
  64. func (in Indenter) Write(b []byte) (int, error) {
  65. n, j := 0, 0
  66. for i, c := range b {
  67. if c == '\n' {
  68. m, _ := in.w.Write(b[j : i+1])
  69. n += m
  70. m, _ = in.w.Write(in.b)
  71. n += m
  72. j = i + 1
  73. }
  74. }
  75. m, err := in.w.Write(b[j:])
  76. return n + m, err
  77. }