Parse exec properties attribute into exec group properties for RuleContexts.

Exec property keys can take two forms: "property" and "exec_group_name.property"

Note - this does not do equivalent parsing for SkylarkRepositoryContext's inherited exec_properties attribute or PlatformInfo's declared exec_properties attribute. Since neither of those have the ability to declare exec_groups, it shouldn't be necessary. This could potentially lead to user confusion, so something to document well.

PiperOrigin-RevId: 312156395
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index b41cfb2..6812cfa 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.analysis.DuplicateException;
 import com.google.devtools.build.lib.analysis.InconsistentAspectOrderException;
 import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
+import com.google.devtools.build.lib.analysis.RuleContext.InvalidExecGroupException;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -644,6 +645,8 @@
         return null;
       } catch (ActionConflictException e) {
         throw new AspectFunctionException(e);
+      } catch (InvalidExecGroupException e) {
+        throw new AspectFunctionException(e);
       } finally {
         CurrentRuleTracker.endConfiguredAspect();
       }
@@ -694,6 +697,10 @@
       super(e, Transience.PERSISTENT);
     }
 
+    public AspectFunctionException(InvalidExecGroupException e) {
+      super(e, Transience.PERSISTENT);
+    }
+
     public AspectFunctionException(ActionConflictException cause) {
       super(cause, Transience.PERSISTENT);
     }