Advertisement
stdray

Nemerle name conventions

Apr 19th, 2013
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.53 KB | None | 0 0
  1. #pragma indent;
  2. using Nemerle;
  3. using Nemerle.Collections;
  4. using Nemerle.Compiler;
  5. using Nemerle.Compiler.Parsetree;
  6. using Nemerle.Text;
  7. using Nemerle.Utility;
  8.  
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12.  
  13. namespace NameConvention.Macro
  14.  
  15.     [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Assembly)] \
  16.     macro ModifiersByName()
  17.         NameConventionImpl.ModifiersByName(Macros.Manager())
  18.  
  19.     [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Assembly)] \
  20.     macro CapitalTypeNames(alertType : string)
  21.         NameConventionImpl.CapitalTypeNames(Macros.Manager(), alertType)
  22.  
  23.     type NM = NemerleModifiers
  24.    
  25.     module NameConventionImpl
  26.         fstChar(s : string) : char
  27.             s[0]
  28.         public ModifiersByName(manager : ManagerClass) : void
  29.             def isPublic  = fstChar >> Char.IsUpper;
  30.             def isPrivate = fstChar >> Char.IsLower;
  31.             def canChange = m => m.modifiers.Modifiers & NM.AccessModifiers == NM.None
  32.             def getModifier(member)
  33.                 match(member.Name)
  34.                     | n when isPublic(n)  => NM.Public  |> Some;
  35.                     | n when isPrivate(n) => NM.Private |> Some;
  36.                     | _                   => None();
  37.             def setModifier(member)
  38.                 when(member |> getModifier is Some(m))
  39.                     member.modifiers.Modifiers |= m
  40.             def types = manager.NameTree.NamespaceTree.GetTypeBuilders();
  41.             def members = types.SelectMany(_.GetParsedMembers());
  42.             members.Where(canChange).Iter(setModifier)
  43.            
  44.         public CapitalTypeNames(manager : ManagerClass, alertType : string) : void
  45.             def isIncorrect = t => t.Name |> fstChar >> Char.IsUpper >> !_
  46.             def msg = n => $"Incorrect type name '$n'. Type name must begin with a capital letter"
  47.             def showMsg = match(alertType.Trim().ToLower())
  48.                 | "error"   => (loc, name) => Message.FatalError(loc, name |> msg)
  49.                 | "warning" => (loc, name) => Message.Warning(loc, name |> msg)
  50.                 | "info"    => (loc, name) => Message.Hint(loc, name |> msg)
  51.                 | p         =>
  52.                     Message.FatalError($"Incorrect parameter $p to CapitalTypeNames macro."
  53.                                        + "'Error', 'Warning' or 'Info' expected")
  54.             def alert = t => showMsg(t.Location, t.Name)
  55.             def types = manager.NameTree.NamespaceTree.GetTypeBuilders()
  56.             types.Where(isIncorrect).Iter(alert)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement